@@ -16,10 +16,10 @@ julia> p = FactoredPolynomial(Dict([0=>1, 1=>2, 3=>4]))
1616FactoredPolynomial(x * (x - 3)⁴ * (x - 1)²)
1717
1818julia> q = fromroots(FactoredPolynomial, [0,1,2,3])
19- FactoredPolynomial(x * (x - 2 ) * (x - 3 ) * (x - 1))
19+ FactoredPolynomial((x - 3 ) * x * (x - 2 ) * (x - 1))
2020
2121julia> p*q
22- FactoredPolynomial(x² * (x - 2) * (x - 3)⁵ * (x - 1)³ )
22+ FactoredPolynomial(x² * (x - 3)⁵ * (x - 1)³ * (x - 2) )
2323
2424julia> p^1000
2525FactoredPolynomial(x¹⁰⁰⁰ * (x - 3)⁴⁰⁰⁰ * (x - 1)²⁰⁰⁰)
@@ -31,29 +31,29 @@ julia> p = Polynomial([24, -50, 35, -10, 1])
3131Polynomial(24 - 50*x + 35*x^2 - 10*x^3 + x^4)
3232
3333julia> q = convert(FactoredPolynomial, p) # noisy form of `factor`:
34- FactoredPolynomial((x - 4.0000000000000036) * (x - 2.9999999999999942 ) * (x - 1.0000000000000002 ) * (x - 2.0000000000000018))
34+ FactoredPolynomial((x - 4.0000000000000036) * (x - 1.0000000000000002 ) * (x - 2.9999999999999942 ) * (x - 2.0000000000000018))
3535
3636julia> map(x->round(x, digits=12), q) # map works over factors and leading coefficient -- not coefficients in the standard basis
3737FactoredPolynomial((x - 4.0) * (x - 2.0) * (x - 3.0) * (x - 1.0))
3838```
3939"""
4040struct FactoredPolynomial{T <: Number , X} <: AbstractPolynomial{T, X}
41- coeffs:: Dict {T,Int}
41+ coeffs:: OrderedDict {T,Int}
4242 c:: T
43- function FactoredPolynomial {T, X} (checked:: Val{false} , cs:: Dict {T,Int} , c:: T ) where {T, X}
44- new {T,X} (cs ,T (c))
43+ function FactoredPolynomial {T, X} (checked:: Val{false} , cs:: AbstractDict {T,Int} , c:: T ) where {T, X}
44+ new {T,X} (convert (OrderedDict,cs) ,T (c))
4545 end
46- function FactoredPolynomial {T, X} (cs:: Dict {T,Int} , c= one (T)) where {T, X}
47- D = Dict {T,Int} ()
46+ function FactoredPolynomial {T, X} (cs:: AbstractDict {T,Int} , c= one (T)) where {T, X}
47+ D = OrderedDict {T,Int} ()
4848 for (k,v) ∈ cs
4949 v > 0 && (D[k] = v)
5050 end
5151 FactoredPolynomial {T,X} (Val (false ), D,T (c))
5252 end
53- function FactoredPolynomial (cs:: Dict {T,Int} , c:: S = 1 , var:: SymbolLike = :x ) where {T,S}
53+ function FactoredPolynomial (cs:: AbstractDict {T,Int} , c:: S = 1 , var:: SymbolLike = :x ) where {T,S}
5454 X = Symbol (var)
5555 R = promote_type (T,S)
56- D = convert (Dict {R,Int}, cs)
56+ D = convert (OrderedDict {R,Int}, cs)
5757 FactoredPolynomial {R,X} (D, R (c))
5858 end
5959end
@@ -72,8 +72,14 @@ function FactoredPolynomial{T,X}(coeffs::AbstractVector{S}) where {T,S,X}
7272
7373 zs = Multroot. multroot (p)
7474 c = p[end ]
75- D = Dict (zip (zs. values, zs. multiplicities))
76- FactoredPolynomial (D, c, X)
75+
76+ D = LittleDict (k=> v for (k,v) ∈ zip (zs. values, zs. multiplicities))
77+ D′ = OrderedDict {eltype(zs.values), Int} ()
78+ for z ∈ lejaorder (zs. values)
79+ D′[z] = D[z]
80+ end
81+
82+ FactoredPolynomial (D′, c, X)
7783end
7884
7985function FactoredPolynomial {T} (coeffs:: AbstractVector{S} , var:: SymbolLike = :x ) where {T,S}
@@ -100,22 +106,31 @@ function Base.convert(P::Type{<:FactoredPolynomial}, p::FactoredPolynomial{T,X})
100106 copy! (d, p. coeffs)
101107 FactoredPolynomial {𝑻,𝑿} (d, p. c)
102108end
109+
103110Base. promote (p:: P ,q:: Q ) where {X,T,P<: FactoredPolynomial{T,X} ,Q<: FactoredPolynomial{T,X} } = p,q
111+
104112Base. promote_rule (:: Type{<:FactoredPolynomial{T,X}} , :: Type{<:FactoredPolynomial{S,X}} ) where {T,S,X} =
105113 FactoredPolynomial{promote_type (T,S), X}
114+
106115Base. promote_rule (:: Type{<:FactoredPolynomial{T,X}} , :: Type{S} ) where {T,S<: Number ,X} =
107116 FactoredPolynomial{promote_type (T,S), X}
117+
108118FactoredPolynomial {T,X} (n:: S ) where {T,X,S<: Number } = T (n) * one (FactoredPolynomial{T,X})
119+
109120FactoredPolynomial {T} (n:: S , var:: SymbolLike = :x ) where {T,S<: Number } = T (n) * one (FactoredPolynomial{T,Symbol (var)})
121+
110122FactoredPolynomial (n:: S , var:: SymbolLike = :x ) where {S<: Number } = n * one (FactoredPolynomial{S,Symbol (var)})
123+
111124FactoredPolynomial (var:: SymbolLike = :x ) = variable (FactoredPolynomial, Symbol (var))
125+
112126(p:: FactoredPolynomial )(x) = evalpoly (x, p)
113127
114128function Base. convert (:: Type{<:Polynomial} , p:: FactoredPolynomial{T,X} ) where {T,X}
115129 x = variable (Polynomial{T,X})
116130 isconstant (p) && return Polynomial {T,X} (p. c)
117131 p (x)
118132end
133+
119134function Base. convert (P:: Type{<:FactoredPolynomial} , p:: Polynomial{T,X} ) where {T,X}
120135 isconstant (p) && return ⟒ (P)(constantterm (p), X)
121136 ⟒ (P)(coeffs (p), X)
239254
240255function fromroots (:: Type{P} , r:: AbstractVector{T} ; var:: SymbolLike = :x ) where {T <: Number , P<: FactoredPolynomial }
241256 X = Symbol (var)
242- d = Dict {T,Int} ()
243- for rᵢ ∈ r
257+ d = OrderedDict {T,Int} ()
258+ for rᵢ ∈ lejaorder (r)
244259 d[rᵢ] = get (d, rᵢ, 0 ) + 1
245260 end
246261 FactoredPolynomial {T, X} (d)
291306# scalar mult
292307function scalar_mult (p:: P , c:: S ) where {S<: Number , T, X, P <: FactoredPolynomial{T, X} }
293308 R = promote_type (T,S)
294- d = Dict {R, Int} () # wident
295- copy! (d, p. coeffs)
309+ d = OrderedDict {R, Int} () # wident
310+ for (k,v) ∈ p. coeffs
311+ d[k] = v
312+ end
296313 FactoredPolynomial {R,X} (d, c * p. c)
297314end
298315scalar_mult (c:: S , p:: P ) where {S<: Number , T, X, P <: FactoredPolynomial{T, X} } = scalar_mult (p, c) # assume commutative, as we have S <: Number
304321
305322function Base.:^ (p:: P , n:: Integer ) where {T,X, P<: FactoredPolynomial{T,X} }
306323 n >= 0 || throw (ArgumentError (" n must be non-negative" ))
307- d = Dict {T,Int} ()
324+ d = OrderedDict {T,Int} ()
308325 for (k,v) ∈ p. coeffs
309326 d[k] = v* n
310327 end
316333function Base. gcd (p:: P , q:: P ) where {T, X, P<: FactoredPolynomial{T,X} }
317334 iszero (p) && return q
318335 iszero (q) && return p
319- d = Dict {T,Int} ()
336+ d = OrderedDict {T,Int} ()
320337
321338 for k ∈ intersect (keys (p. coeffs), keys (q. coeffs))
322339 d[k] = min (p. coeffs[k], q. coeffs[k])
327344
328345# return u,v,w with p = u*v , q = u*w
329346function uvw (p:: P , q:: P ; kwargs... ) where {T, X, P<: FactoredPolynomial{T,X} }
330- du, dv, dw = Dict {T,Int} (), Dict {T,Int} (), Dict {T,Int} ()
347+ du, dv, dw = OrderedDict {T,Int} (), OrderedDict {T,Int} (), OrderedDict {T,Int} ()
331348 dp,dq = p. coeffs, q. coeffs
332349 kp,kq = keys (dp), keys (dq)
333350
0 commit comments