@@ -16,10 +16,10 @@ julia> p = FactoredPolynomial(Dict([0=>1, 1=>2, 3=>4]))
16
16
FactoredPolynomial(x * (x - 3)⁴ * (x - 1)²)
17
17
18
18
julia> 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))
20
20
21
21
julia> p*q
22
- FactoredPolynomial(x² * (x - 2) * (x - 3)⁵ * (x - 1)³ )
22
+ FactoredPolynomial(x² * (x - 3)⁵ * (x - 1)³ * (x - 2) )
23
23
24
24
julia> p^1000
25
25
FactoredPolynomial(x¹⁰⁰⁰ * (x - 3)⁴⁰⁰⁰ * (x - 1)²⁰⁰⁰)
@@ -31,29 +31,29 @@ julia> p = Polynomial([24, -50, 35, -10, 1])
31
31
Polynomial(24 - 50*x + 35*x^2 - 10*x^3 + x^4)
32
32
33
33
julia> 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))
35
35
36
36
julia> map(x->round(x, digits=12), q) # map works over factors and leading coefficient -- not coefficients in the standard basis
37
37
FactoredPolynomial((x - 4.0) * (x - 2.0) * (x - 3.0) * (x - 1.0))
38
38
```
39
39
"""
40
40
struct FactoredPolynomial{T <: Number , X} <: AbstractPolynomial{T, X}
41
- coeffs:: Dict {T,Int}
41
+ coeffs:: OrderedDict {T,Int}
42
42
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))
45
45
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} ()
48
48
for (k,v) ∈ cs
49
49
v > 0 && (D[k] = v)
50
50
end
51
51
FactoredPolynomial {T,X} (Val (false ), D,T (c))
52
52
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}
54
54
X = Symbol (var)
55
55
R = promote_type (T,S)
56
- D = convert (Dict {R,Int}, cs)
56
+ D = convert (OrderedDict {R,Int}, cs)
57
57
FactoredPolynomial {R,X} (D, R (c))
58
58
end
59
59
end
@@ -72,8 +72,14 @@ function FactoredPolynomial{T,X}(coeffs::AbstractVector{S}) where {T,S,X}
72
72
73
73
zs = Multroot. multroot (p)
74
74
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)
77
83
end
78
84
79
85
function 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})
100
106
copy! (d, p. coeffs)
101
107
FactoredPolynomial {𝑻,𝑿} (d, p. c)
102
108
end
109
+
103
110
Base. promote (p:: P ,q:: Q ) where {X,T,P<: FactoredPolynomial{T,X} ,Q<: FactoredPolynomial{T,X} } = p,q
111
+
104
112
Base. promote_rule (:: Type{<:FactoredPolynomial{T,X}} , :: Type{<:FactoredPolynomial{S,X}} ) where {T,S,X} =
105
113
FactoredPolynomial{promote_type (T,S), X}
114
+
106
115
Base. promote_rule (:: Type{<:FactoredPolynomial{T,X}} , :: Type{S} ) where {T,S<: Number ,X} =
107
116
FactoredPolynomial{promote_type (T,S), X}
117
+
108
118
FactoredPolynomial {T,X} (n:: S ) where {T,X,S<: Number } = T (n) * one (FactoredPolynomial{T,X})
119
+
109
120
FactoredPolynomial {T} (n:: S , var:: SymbolLike = :x ) where {T,S<: Number } = T (n) * one (FactoredPolynomial{T,Symbol (var)})
121
+
110
122
FactoredPolynomial (n:: S , var:: SymbolLike = :x ) where {S<: Number } = n * one (FactoredPolynomial{S,Symbol (var)})
123
+
111
124
FactoredPolynomial (var:: SymbolLike = :x ) = variable (FactoredPolynomial, Symbol (var))
125
+
112
126
(p:: FactoredPolynomial )(x) = evalpoly (x, p)
113
127
114
128
function Base. convert (:: Type{<:Polynomial} , p:: FactoredPolynomial{T,X} ) where {T,X}
115
129
x = variable (Polynomial{T,X})
116
130
isconstant (p) && return Polynomial {T,X} (p. c)
117
131
p (x)
118
132
end
133
+
119
134
function Base. convert (P:: Type{<:FactoredPolynomial} , p:: Polynomial{T,X} ) where {T,X}
120
135
isconstant (p) && return ⟒ (P)(constantterm (p), X)
121
136
⟒ (P)(coeffs (p), X)
239
254
240
255
function fromroots (:: Type{P} , r:: AbstractVector{T} ; var:: SymbolLike = :x ) where {T <: Number , P<: FactoredPolynomial }
241
256
X = Symbol (var)
242
- d = Dict {T,Int} ()
243
- for rᵢ ∈ r
257
+ d = OrderedDict {T,Int} ()
258
+ for rᵢ ∈ lejaorder (r)
244
259
d[rᵢ] = get (d, rᵢ, 0 ) + 1
245
260
end
246
261
FactoredPolynomial {T, X} (d)
291
306
# scalar mult
292
307
function scalar_mult (p:: P , c:: S ) where {S<: Number , T, X, P <: FactoredPolynomial{T, X} }
293
308
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
296
313
FactoredPolynomial {R,X} (d, c * p. c)
297
314
end
298
315
scalar_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
304
321
305
322
function Base.:^ (p:: P , n:: Integer ) where {T,X, P<: FactoredPolynomial{T,X} }
306
323
n >= 0 || throw (ArgumentError (" n must be non-negative" ))
307
- d = Dict {T,Int} ()
324
+ d = OrderedDict {T,Int} ()
308
325
for (k,v) ∈ p. coeffs
309
326
d[k] = v* n
310
327
end
316
333
function Base. gcd (p:: P , q:: P ) where {T, X, P<: FactoredPolynomial{T,X} }
317
334
iszero (p) && return q
318
335
iszero (q) && return p
319
- d = Dict {T,Int} ()
336
+ d = OrderedDict {T,Int} ()
320
337
321
338
for k ∈ intersect (keys (p. coeffs), keys (q. coeffs))
322
339
d[k] = min (p. coeffs[k], q. coeffs[k])
327
344
328
345
# return u,v,w with p = u*v , q = u*w
329
346
function 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} ()
331
348
dp,dq = p. coeffs, q. coeffs
332
349
kp,kq = keys (dp), keys (dq)
333
350
0 commit comments