Skip to content

Commit a8eb0e8

Browse files
authored
Merge pull request #245 from jverzani/issue_240b
closes #240.
2 parents 5221953 + 18bc083 commit a8eb0e8

File tree

7 files changed

+839
-12
lines changed

7 files changed

+839
-12
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ julia:
1111
- 1.2
1212
- 1.3
1313
- 1.4
14+
- 1.5
1415
- nightly
1516

1617
notifications:

src/Polynomials.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ include("polynomials/Polynomial.jl")
1818
include("polynomials/ImmutablePolynomial.jl")
1919
include("polynomials/SparsePolynomial.jl")
2020
include("polynomials/LaurentPolynomial.jl")
21+
include("polynomials/ngcd.jl")
2122

2223
include("polynomials/ChebyshevT.jl")
2324

src/common.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -536,11 +536,17 @@ Polynomial(4.0 - 6.0*x + 2.0*x^2)
536536
537537
```
538538
"""
539-
function Base.gcd(p1::AbstractPolynomial{T}, p2::AbstractPolynomial{S};
540-
atol::Real=zero(real(promote_type(T,S))),
541-
rtol::Real=Base.rtoldefault(real(promote_type(T,S)))
542-
) where {T,S}
543-
r₀, r₁ = promote(p1, p2)
539+
function Base.gcd(p1::AbstractPolynomial{T}, p2::AbstractPolynomial{S}; kwargs...) where {T,S}
540+
gcd(promote(p1, p2)...; kwargs...)
541+
end
542+
543+
function Base.gcd(p1::P, p2::Q;
544+
atol::Real=zero(real(T)),
545+
rtol::Real=Base.rtoldefault(real(T))
546+
) where {T, P <: AbstractPolynomial{T}, Q <: AbstractPolynomial{T}}
547+
548+
549+
r₀, r₁ = p1, p2
544550
iter = 1
545551
itermax = length(r₁)
546552

src/polynomials/LaurentPolynomial.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,3 +426,20 @@ function integrate(p::P, k::S) where {T, P<: LaurentPolynomial{T}, S<:Number}
426426
return (P)(as, m:n, p.var)
427427

428428
end
429+
430+
431+
function Base.gcd(p::LaurentPolynomial{T}, q::LaurentPolynomial{T}, args...; kwargs...) where {T}
432+
mp, Mp = extrema(p)
433+
mq, Mq = extrema(q)
434+
if mp < 0 || mq < 0
435+
throw(ArgumentError("GCD is not defined when there are `x⁻¹` terms"))
436+
end
437+
438+
degree(p) == 0 && return iszero(p) ? q : one(q)
439+
degree(q) == 0 && return iszero(q) ? p : one(p)
440+
check_same_variable(p,q) || throw(ArgumentError("p and q have different symbols"))
441+
442+
pp, qq = convert(Polynomial, p), convert(Polynomial, q)
443+
u = gcd(pp, qq, args..., kwargs...)
444+
return LaurentPolynomial(coeffs(u), p.var)
445+
end

0 commit comments

Comments
 (0)