@@ -32,33 +32,35 @@ Base.rem(f::APL, g::Union{APL, AbstractVector{<:APL}}; kwargs...) = divrem(f, g;
3232
3333proddiff (x, y) = x/ y - x/ y
3434function Base. divrem (f:: APL{T} , g:: APL{S} ; kwargs... ) where {T, S}
35- rf = convert (polynomialtype (f, Base. promote_op (proddiff, T, S)), f)
36- q = r = zero (rf)
35+ rf = convert (polynomialtype (f, Base. promote_op (proddiff, T, S)), MA. copy_if_mutable (f))
36+ q = zero (rf)
37+ r = zero (rf)
3738 lt = leadingterm (g)
3839 rg = removeleadingterm (g)
3940 lm = monomial (lt)
4041 while ! iszero (rf)
4142 ltf = leadingterm (rf)
4243 if isapproxzero (ltf; kwargs... )
43- rf = removeleadingterm ( rf)
44+ rf = MA . operate! (removeleadingterm, rf)
4445 elseif divides (lm, ltf)
4546 qt = _div (ltf, lt)
46- q += qt
47- rf = removeleadingterm (rf) - qt * rg
47+ q = MA. add! (q, qt)
48+ rf = MA. operate! (removeleadingterm, rf)
49+ rf = MA. operate! (MA. sub_mul, rf, qt, rg)
4850 elseif lm > monomial (ltf)
4951 # Since the monomials are sorted in decreasing order,
5052 # lm is larger than all of them hence it cannot divide any of them
51- r += rf
53+ r = MA . add! (r, rf)
5254 break
5355 else
54- r += ltf
55- rf = removeleadingterm ( rf)
56+ r = MA . add! (r, ltf)
57+ rf = MA . operate! (removeleadingterm, rf)
5658 end
5759 end
5860 q, r
5961end
6062function Base. divrem (f:: APL{T} , g:: AbstractVector{<:APL{S}} ; kwargs... ) where {T, S}
61- rf = convert (polynomialtype (f, Base. promote_op (proddiff, T, S)), f )
63+ rf = convert (polynomialtype (f, Base. promote_op (proddiff, T, S)), MA . copy_if_mutable (f) )
6264 r = zero (rf)
6365 q = similar (g, typeof (rf))
6466 for i in eachindex (q)
@@ -71,15 +73,16 @@ function Base.divrem(f::APL{T}, g::AbstractVector{<:APL{S}}; kwargs...) where {T
7173 while ! iszero (rf)
7274 ltf = leadingterm (rf)
7375 if isapproxzero (ltf; kwargs... )
74- rf = removeleadingterm ( rf)
76+ rf = MA . operate! (removeleadingterm, rf)
7577 continue
7678 end
7779 divisionoccured = false
7880 for i in useful
7981 if divides (lm[i], ltf)
8082 qt = _div (ltf, lt[i])
81- q[i] += qt
82- rf = removeleadingterm (rf) - qt * rg[i]
83+ q[i] = MA. add! (q[i], qt)
84+ rf = MA. operate! (removeleadingterm, rf)
85+ rf = MA. operate! (MA. sub_mul, rf, qt, rg[i])
8386 divisionoccured = true
8487 break
8588 elseif lm[i] > monomial (ltf)
@@ -90,11 +93,11 @@ function Base.divrem(f::APL{T}, g::AbstractVector{<:APL{S}}; kwargs...) where {T
9093 end
9194 if ! divisionoccured
9295 if isempty (useful)
93- r += rf
96+ r = MA . add! (r, rf)
9497 break
9598 else
96- r += ltf
97- rf = removeleadingterm ( rf)
99+ r = MA . add! (r, ltf)
100+ rf = MA . operate! (removeleadingterm, rf)
98101 end
99102 end
100103 end
0 commit comments