Skip to content

Commit 6ac507c

Browse files
changed lcm and gcd implementations for when just one arg is infinite (#57067)
Co-authored-by: Lilith Orion Hafner <[email protected]>
1 parent 99fd5d9 commit 6ac507c

File tree

2 files changed

+39
-26
lines changed

2 files changed

+39
-26
lines changed

Diff for: base/rational.jl

+12-2
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,18 @@ end
564564

565565
float(::Type{Rational{T}}) where {T<:Integer} = float(T)
566566

567-
gcd(x::Rational, y::Rational) = unsafe_rational(gcd(x.num, y.num), lcm(x.den, y.den))
568-
lcm(x::Rational, y::Rational) = unsafe_rational(lcm(x.num, y.num), gcd(x.den, y.den))
567+
function gcd(x::Rational, y::Rational)
568+
if isinf(x) != isinf(y)
569+
throw(ArgumentError("lcm is not defined between infinite and finite numbers"))
570+
end
571+
unsafe_rational(gcd(x.num, y.num), lcm(x.den, y.den))
572+
end
573+
function lcm(x::Rational, y::Rational)
574+
if isinf(x) != isinf(y)
575+
throw(ArgumentError("lcm is not defined"))
576+
end
577+
return unsafe_rational(lcm(x.num, y.num), gcd(x.den, y.den))
578+
end
569579
function gcdx(x::Rational, y::Rational)
570580
c = gcd(x, y)
571581
if iszero(c.num)

Diff for: test/rational.jl

+27-24
Original file line numberDiff line numberDiff line change
@@ -649,56 +649,59 @@ end
649649
@test lcm(a, T(0)//T(1)) === T(0)//T(1)
650650
@test gcdx(a, T(0)//T(1)) === (a, T(1), T(0))
651651

652-
@test gcdx(T(1)//T(0), T(1)//T(2)) === (T(1)//T(0), T(1), T(0))
653-
@test gcdx(T(1)//T(2), T(1)//T(0)) === (T(1)//T(0), T(0), T(1))
654-
@test gcdx(T(1)//T(0), T(1)//T(1)) === (T(1)//T(0), T(1), T(0))
655-
@test gcdx(T(1)//T(1), T(1)//T(0)) === (T(1)//T(0), T(0), T(1))
652+
@test_throws ArgumentError gcdx(T(1)//T(0), T(1)//T(2))
653+
@test_throws ArgumentError gcdx(T(1)//T(2), T(1)//T(0))
654+
@test_throws ArgumentError gcdx(T(1)//T(0), T(1)//T(1))
655+
@test_throws ArgumentError gcdx(T(1)//T(1), T(1)//T(0))
656656
@test gcdx(T(1)//T(0), T(1)//T(0)) === (T(1)//T(0), T(1), T(1))
657-
@test gcdx(T(1)//T(0), T(0)//T(1)) === (T(1)//T(0), T(1), T(0))
657+
@test_throws ArgumentError gcdx(T(1)//T(0), T(0)//T(1))
658658
@test gcdx(T(0)//T(1), T(0)//T(1)) === (T(0)//T(1), T(0), T(0))
659659

660660
if T <: Signed
661-
@test gcdx(T(-1)//T(0), T(1)//T(2)) === (T(1)//T(0), T(1), T(0))
662-
@test gcdx(T(1)//T(2), T(-1)//T(0)) === (T(1)//T(0), T(0), T(1))
663-
@test gcdx(T(-1)//T(0), T(1)//T(1)) === (T(1)//T(0), T(1), T(0))
664-
@test gcdx(T(1)//T(1), T(-1)//T(0)) === (T(1)//T(0), T(0), T(1))
661+
@test_throws ArgumentError gcdx(T(-1)//T(0), T(1)//T(2))
662+
@test_throws ArgumentError gcdx(T(1)//T(2), T(-1)//T(0))
663+
@test_throws ArgumentError gcdx(T(-1)//T(0), T(1)//T(1))
664+
@test_throws ArgumentError gcdx(T(1)//T(1), T(-1)//T(0))
665665
@test gcdx(T(-1)//T(0), T(1)//T(0)) === (T(1)//T(0), T(1), T(1))
666666
@test gcdx(T(1)//T(0), T(-1)//T(0)) === (T(1)//T(0), T(1), T(1))
667667
@test gcdx(T(-1)//T(0), T(-1)//T(0)) === (T(1)//T(0), T(1), T(1))
668-
@test gcdx(T(-1)//T(0), T(0)//T(1)) === (T(1)//T(0), T(1), T(0))
669-
@test gcdx(T(0)//T(1), T(-1)//T(0)) === (T(1)//T(0), T(0), T(1))
668+
@test_throws ArgumentError gcdx(T(-1)//T(0), T(0)//T(1))
669+
@test_throws ArgumentError gcdx(T(0)//T(1), T(-1)//T(0))
670670
end
671671

672672
@test gcdx(T(1)//T(3), T(2)) === (T(1)//T(3), T(1), T(0))
673673
@test lcm(T(1)//T(3), T(1)) === T(1)//T(1)
674-
@test lcm(T(3)//T(1), T(1)//T(0)) === T(3)//T(1)
675-
@test lcm(T(0)//T(1), T(1)//T(0)) === T(0)//T(1)
674+
@test_throws ArgumentError lcm(T(3)//T(1), T(1)//T(0))
675+
@test_throws ArgumentError lcm(T(0)//T(1), T(1)//T(0))
676676

677-
@test lcm(T(1)//T(0), T(1)//T(2)) === T(1)//T(2)
678-
@test lcm(T(1)//T(2), T(1)//T(0)) === T(1)//T(2)
679-
@test lcm(T(1)//T(0), T(1)//T(1)) === T(1)//T(1)
680-
@test lcm(T(1)//T(1), T(1)//T(0)) === T(1)//T(1)
677+
@test_throws ArgumentError lcm(T(1)//T(0), T(1)//T(2))
678+
@test_throws ArgumentError lcm(T(1)//T(2), T(1)//T(0))
679+
@test_throws ArgumentError lcm(T(1)//T(0), T(1)//T(1))
680+
@test_throws ArgumentError lcm(T(1)//T(1), T(1)//T(0))
681681
@test lcm(T(1)//T(0), T(1)//T(0)) === T(1)//T(0)
682-
@test lcm(T(1)//T(0), T(0)//T(1)) === T(0)//T(1)
682+
@test_throws ArgumentError lcm(T(1)//T(0), T(0)//T(1))
683683
@test lcm(T(0)//T(1), T(0)//T(1)) === T(0)//T(1)
684684

685685
if T <: Signed
686-
@test lcm(T(-1)//T(0), T(1)//T(2)) === T(1)//T(2)
687-
@test lcm(T(1)//T(2), T(-1)//T(0)) === T(1)//T(2)
688-
@test lcm(T(-1)//T(0), T(1)//T(1)) === T(1)//T(1)
689-
@test lcm(T(1)//T(1), T(-1)//T(0)) === T(1)//T(1)
686+
@test_throws ArgumentError lcm(T(-1)//T(0), T(1)//T(2))
687+
@test_throws ArgumentError lcm(T(1)//T(2), T(-1)//T(0))
688+
@test_throws ArgumentError lcm(T(-1)//T(0), T(1)//T(1))
689+
@test_throws ArgumentError lcm(T(1)//T(1), T(-1)//T(0))
690690
@test lcm(T(-1)//T(0), T(1)//T(0)) === T(1)//T(0)
691691
@test lcm(T(1)//T(0), T(-1)//T(0)) === T(1)//T(0)
692692
@test lcm(T(-1)//T(0), T(-1)//T(0)) === T(1)//T(0)
693-
@test lcm(T(-1)//T(0), T(0)//T(1)) === T(0)//T(1)
694-
@test lcm(T(0)//T(1), T(-1)//T(0)) === T(0)//T(1)
693+
@test_throws ArgumentError lcm(T(-1)//T(0), T(0)//T(1))
694+
@test_throws ArgumentError lcm(T(0)//T(1), T(-1)//T(0))
695695
end
696696

697697
@test gcd([T(5), T(2), T(1)//T(2)]) === T(1)//T(2)
698698
@test gcd(T(5), T(2), T(1)//T(2)) === T(1)//T(2)
699699

700700
@test lcm([T(5), T(2), T(1)//T(2)]) === T(10)//T(1)
701701
@test lcm(T(5), T(2), T(1)//T(2)) === T(10)//T(1)
702+
703+
@test_throws ArgumentError gcd(T(1)//T(1), T(1)//T(0))
704+
@test_throws ArgumentError gcd(T(1)//T(0), T(0)//T(1))
702705
end
703706
end
704707

0 commit comments

Comments
 (0)