Skip to content

Commit fb42ea5

Browse files
authored
gcd and lcm fixed for one negative argument (#40968)
1 parent a5889a8 commit fb42ea5

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

base/intfuncs.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ function lcm(a::T, b::T) where T<:Integer
117117
end
118118
end
119119

120-
gcd(a::Union{Integer,Rational}) = a
121-
lcm(a::Union{Integer,Rational}) = a
120+
gcd(a::Integer) = checked_abs(a)
121+
gcd(a::Rational) = checked_abs(a.num) // a.den
122+
lcm(a::Union{Integer,Rational}) = gcd(a)
122123
gcd(a::Unsigned, b::Signed) = gcd(promote(a, abs(b))...)
123124
gcd(a::Signed, b::Unsigned) = gcd(promote(abs(a), b)...)
124125
gcd(a::Real, b::Real) = gcd(promote(a,b)...)

test/intfuncs.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ using Random
1212
@test gcd(T(0), T(15)) === T(15)
1313
@test gcd(T(15), T(0)) === T(15)
1414
if T <: Signed
15+
@test gcd(T(-12)) === T(12)
1516
@test gcd(T(0), T(-15)) === T(15)
1617
@test gcd(T(-15), T(0)) === T(15)
1718
@test gcd(T(3), T(-15)) === T(3)
@@ -78,6 +79,7 @@ using Random
7879
@test lcm(T(0), T(3)) === T(0)
7980
@test lcm(T(0), T(0)) === T(0)
8081
if T <: Signed
82+
@test lcm(T(-12)) === T(12)
8183
@test lcm(T(0), T(-4)) === T(0)
8284
@test lcm(T(-4), T(0)) === T(0)
8385
@test lcm(T(4), T(-6)) === T(12)
@@ -154,6 +156,7 @@ end
154156
@test gcd(T[3, 15]) === T(3)
155157
@test gcd(T[0, 15]) === T(15)
156158
if T <: Signed
159+
@test gcd(T[-12]) === T(12)
157160
@test gcd(T[3,-15]) === T(3)
158161
@test gcd(T[-3,-15]) === T(3)
159162
end
@@ -163,12 +166,12 @@ end
163166
@test gcd(T[2, 4, 3, 5]) === T(1)
164167

165168
@test lcm(T[]) === T(1)
166-
@test lcm(T[2]) === T(2)
167169
@test lcm(T[2, 3]) === T(6)
168170
@test lcm(T[4, 6]) === T(12)
169171
@test lcm(T[3, 0]) === T(0)
170172
@test lcm(T[0, 0]) === T(0)
171173
if T <: Signed
174+
@test lcm(T[-2]) === T(2)
172175
@test lcm(T[4, -6]) === T(12)
173176
@test lcm(T[-4, -6]) === T(12)
174177
end

test/rational.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,8 @@ end
488488
@test gcd(b, a) === T(2)//T(105)
489489
@test lcm(a, b) === T(30)//T(7)
490490
if T <: Signed
491+
@test gcd(-a) === a
492+
@test lcm(-b) === b
491493
@test gcdx(a, b) === (T(2)//T(105), T(-11), T(4))
492494
@test gcd(-a, b) === T(2)//T(105)
493495
@test gcd(a, -b) === T(2)//T(105)

0 commit comments

Comments
 (0)