@@ -128,7 +128,14 @@ function degree(p::ImmutablePolynomial{N,T}) where {N, T}
128
128
n = findlast (! iszero, coeffs (p))
129
129
n == nothing ? - 1 : n- 1
130
130
end
131
-
131
+ isconstant (p:: ImmutablePolynomial{0} ) = true
132
+ isconstant (p:: ImmutablePolynomial{1} ) = true
133
+ function isconstant (p:: ImmutablePolynomial{N} ) where {N}
134
+ for i in 2 : length (p. coeffs)
135
+ ! iszero (p. coeffs[i]) && return false
136
+ end
137
+ return true
138
+ end
132
139
for op in [:isequal , :(== )]
133
140
@eval function Base. $op (p1:: ImmutablePolynomial{N,T} , p2:: ImmutablePolynomial{M,S} ) where {N,T,M,S}
134
141
(p1. var == p2. var) || return false
@@ -196,21 +203,11 @@ LinearAlgebra.conj(p::P) where {P <: ImmutablePolynomial} = P(conj([aᵢ for a
196
203
197
204
(p:: ImmutablePolynomial{N, T} )(x:: S ) where {N, T,S} = evalpoly (x, coeffs (p))
198
205
199
- # used to treat constants as having same variable as counterpart in + and *
200
- function _promote_constant_variable (p:: P , q:: Q ) where {N, T, P <: ImmutablePolynomial{N,T} ,
201
- M, S, Q <: ImmutablePolynomial{M,S} }
202
- if degree (p) <= 0
203
- p = P (p. coeffs, q. var)
204
- elseif degree (q) <= 0
205
- q = Q (q. coeffs, p. var)
206
- end
207
-
208
- p,q
209
-
210
- end
211
206
212
207
function Base.:+ (p1:: ImmutablePolynomial{N,T} , p2:: ImmutablePolynomial{M,S} ) where {N,T,M,S}
213
- p1,p2 = _promote_constant_variable (p1, p2)
208
+
209
+ isconstant (p1) && return p2 + p1[0 ]
210
+ isconstant (p2) && return p1 + p2[0 ]
214
211
p1. var != p2. var && error (" Polynomials must have same variable" )
215
212
216
213
R = Base. promote_op (+ , T,S)
@@ -225,11 +222,15 @@ function ⊕(p1::ImmutablePolynomial{N,T}, p2::ImmutablePolynomial{N,T}) where {
225
222
end
226
223
227
224
228
- Base.:+ (p:: ImmutablePolynomial{N, T} , c:: S ) where {N, T,S<: Number } =
229
- p + ImmutablePolynomial ((c,), p. var)
225
+ function Base.:+ (p:: ImmutablePolynomial{N, T} , c:: S ) where {N, T, S<: Number }
226
+ R = promote_type (T,S)
227
+ as = NTuple {N,R} (i == 1 ? ai + c : ai for (i,ai) in enumerate (p. coeffs))
228
+ ImmutablePolynomial (as, p. var)
229
+ end
230
230
231
231
function Base.:* (p1:: ImmutablePolynomial{N,T} , p2:: ImmutablePolynomial{M,S} ) where {N,T,M,S}
232
- p1,p2 = _promote_constant_variable (p1, p2)
232
+ isconstant (p1) && return p2 * p1[0 ]
233
+ isconstant (p2) && return p1 * p2[0 ]
233
234
p1. var != p2. var && error (" Polynomials must have same variable" )
234
235
p1 ⊗ p2
235
236
end
258
259
259
260
function Base.:* (p:: ImmutablePolynomial{N,T} , c:: S ) where {N,T,S <: Number }
260
261
R = eltype (one (T)* one (S))
261
- return ImmutablePolynomial {N,R} (NTuple {N,R} (p[i]* c for i in eachindex (p)), p. var)
262
+ cs = NTuple {N,R} (p[i]* c for i in eachindex (p))
263
+ return ImmutablePolynomial {N,R} (cs, p. var)
262
264
end
263
265
264
266
Base.:- (p:: ImmutablePolynomial{N,T} ) where {N,T} = ImmutablePolynomial (NTuple {N,T} (- pi for pi in p. coeffs), p. var)
0 commit comments