@@ -94,15 +94,38 @@ function subsmap(st, vars, s::Tuple{MP.VectorMultiSubstitution})
9494 end
9595end
9696
97+ _add_variables! (α, β) = α
98+ _add_variables! (p:: PolyType , α) = p
99+ _add_variables! (α, p:: PolyType ) = MP. operate!! (* , α, one (p))
100+ function _add_variables! (x:: Variable , p:: PolyType )
101+ return MP. operate!! (* , x, one (p))
102+ end
103+ function ___add_variables! (p, q)
104+ varsvec = [MP. variables (p), MP. variables (q)]
105+ allvars, maps = mergevars (varsvec)
106+ if length (allvars) != length (MP. variables (p))
107+ __add_variables! (p, allvars, maps[1 ])
108+ end
109+ return allvars, maps
110+ end
111+ function _add_variables! (p:: PolyType , q:: PolyType )
112+ ___add_variables! (p, q)
113+ return p
114+ end
115+
97116function monoeval (z:: Vector{Int} , vals:: AbstractVector )
98117 @assert length (z) == length (vals)
99118 if isempty (z)
100119 return one (eltype (vals))^ 1
101120 end
121+ # `Base.power_by_squaring` does a `copy` if `z[1]` is `1`
122+ # which is redirected to `MA.mutable_copy`
102123 val = vals[1 ]^ z[1 ]
103124 for i in 2 : length (vals)
104- if z[i] > 0
105- val *= vals[i]^ z[i]
125+ if iszero (z[i])
126+ val = _add_variables! (val, vals[i])
127+ else
128+ val = MA. operate!! (* , val, vals[i]^ z[i])
106129 end
107130 end
108131 return val
@@ -122,7 +145,7 @@ function _subs(
122145 if iszero (p)
123146 zero (Base. promote_op (* , S, T))
124147 else
125- sum (i -> p. a[i] * monoeval (p. x. Z[i], vals), 1 : length (p ))
148+ sum (i -> p. a[i] * monoeval (p. x. Z[i], vals), eachindex (p . a ))
126149 end
127150end
128151function _subs (
@@ -135,7 +158,7 @@ function _subs(
135158 Polynomial{V,M,Tout},
136159 mergevars_of (Variable{V,M}, vals)[1 ],
137160 )
138- for i in 1 : length (p. a)
161+ for i in eachindex (p. a)
139162 MA. operate! (+ , q, p. a[i] * monoeval (p. x. Z[i], vals))
140163 end
141164 return q
0 commit comments