Skip to content

Commit 45154df

Browse files
committed
put gcd into common since it only depends on divrem being implemented
1 parent 5c7c982 commit 45154df

File tree

6 files changed

+19
-54
lines changed

6 files changed

+19
-54
lines changed

src/common.jl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,18 @@ Polynomial(4.0 - 6.0*x + 2.0*x^2)
437437
438438
```
439439
"""
440-
function Base.gcd(p1::P, p2::O) where {P <: AbstractPolynomial,O <: AbstractPolynomial}
441-
p1, p2 = promote(p1, p1)
442-
return gcd(p1, p2)
440+
function Base.gcd(p1::AbstractPolynomial{T}, p2::AbstractPolynomial{S}) where {T, S}
441+
r₀, r₁ = promote(p1, p2)
442+
iter = 1
443+
itermax = length(r₁)
444+
445+
while r₁ zero(r₁) && iter itermax # just to avoid unnecessary recursion
446+
_, rtemp = divrem(r₀, r₁)
447+
r₀ = r₁
448+
r₁ = truncate(rtemp)
449+
iter += 1
450+
end
451+
return r₀
443452
end
444453

445454
"""

src/polynomials/ChebyshevT.jl

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ function Base.:*(p1::ChebyshevT{T}, p2::ChebyshevT{S}) where {T,S}
147147
return truncate!(ret)
148148
end
149149

150-
##
151150
function Base.divrem(num::ChebyshevT{T}, den::ChebyshevT{S}) where {T,S}
152151
num.var != den.var && error("Polynomials must have same variable")
153152
n = length(num) - 1
@@ -162,30 +161,14 @@ function Base.divrem(num::ChebyshevT{T}, den::ChebyshevT{S}) where {T,S}
162161
den[0] 0 && throw(DivideError())
163162
return num ./ den[end], zero(P)
164163
end
165-
164+
166165
znum = _c_to_z(num.coeffs)
167166
zden = _c_to_z(den.coeffs)
168167
quo, rem = _z_division(znum, zden)
169168
q_coeff = _z_to_c(quo)
170169
r_coeff = _z_to_c(rem)
171170
return P(q_coeff, num.var), P(r_coeff, num.var)
172171
end
173-
# ##
174-
# function Base.gcd(a::ChebyshevT{T}, b::ChebyshevT{S}) where {T,S}
175-
# U = typeof(one(T) / one(S))
176-
# r₀ = convert(ChebyshevT{U}, a)
177-
# r₁ = truncate!(convert(ChebyshevT{U}, b))
178-
# iter = 1
179-
# itermax = length(b)
180-
181-
# while r₁ ≉ zero(r₁) && iter ≤ itermax # just to avoid unnecessary recursion
182-
# _, rtemp = divrem(r₀, r₁)
183-
# r₀ = r₁
184-
# r₁ = truncate(rtemp)
185-
# iter += 1
186-
# end
187-
# return r₀
188-
# end
189172

190173
function printpoly(io::IO, p::ChebyshevT{T}, mimetype = MIME"text/plain"(); descending_powers = false, offset::Int = 0) where {T}
191174
chopped = chop(p)

src/polynomials/Poly.jl

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -147,20 +147,4 @@ function Base.divrem(num::Poly{T}, den::Poly{S}) where {T,S}
147147
return P(q_coeff, num.var), P(r_coeff, num.var)
148148
end
149149

150-
function Base.gcd(a::Poly{T}, b::Poly{S}) where {T,S}
151-
U = typeof(one(T) / one(S))
152-
r₀ = convert(Poly{U}, a)
153-
r₁ = truncate!(convert(Poly{U}, b))
154-
iter = 1
155-
itermax = length(b)
156-
157-
while r₁ zero(r₁) && iter itermax # just to avoid unnecessary recursion
158-
_, rtemp = divrem(r₀, r₁)
159-
r₀ = r₁
160-
r₁ = truncate(rtemp)
161-
iter += 1
162-
end
163-
return r₀
164-
end
165-
166150
showterm(io::IO, ::Type{Poly{T}}, pj::T, var, j, first::Bool, mimetype) where{T} = showterm(io, Polynomial{T}, pj, var, j, first, mimetype)

src/polynomials/Polynomial.jl

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,22 +154,6 @@ function Base.divrem(num::Polynomial{T}, den::Polynomial{S}) where {T,S}
154154
return P(q_coeff, num.var), P(r_coeff, num.var)
155155
end
156156

157-
function Base.gcd(a::Polynomial{T}, b::Polynomial{S}) where {T,S}
158-
U = typeof(one(T) / one(S))
159-
r₀ = convert(Polynomial{U}, a)
160-
r₁ = truncate!(convert(Polynomial{U}, b))
161-
iter = 1
162-
itermax = length(b)
163-
164-
while r₁ zero(r₁) && iter itermax # just to avoid unnecessary recursion
165-
_, rtemp = divrem(r₀, r₁)
166-
r₀ = r₁
167-
r₁ = truncate(rtemp)
168-
iter += 1
169-
end
170-
return r₀
171-
end
172-
173157
function showterm(io::IO, ::Type{Polynomial{T}}, pj::T, var, j, first::Bool, mimetype) where {T}
174158
if pj == zero(T) return false end
175159
pj = printsign(io, pj, first, mimetype)

test/ChebyshevT.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ end
107107
@test coeffs(d) [0, 2]
108108
@test coeffs(r) [-2, -4]
109109

110+
111+
# GCD
112+
c1 = ChebyshevT([1, 2, 3])
113+
c2 = ChebyshevT([3, 2, 1])
114+
@test gcd(c1, c2) ChebyshevT(6)
110115
end
111116

112117
@testset "z-series" for i in 1:5

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ using RecipesBase: apply_recipe
77

88
import SparseArrays: sparse, nnz
99

10-
# @testset "Polynomial" begin include("Polynomial.jl") end
10+
@testset "Polynomial" begin include("Polynomial.jl") end
1111
@testset "ChebyshevT" begin include("ChebyshevT.jl") end
1212
# @testset "Deprecations" begin include("deprecated.jl") end
1313
# @testset "Poly (deprecaterd)" begin include("Poly.jl") end

0 commit comments

Comments
 (0)