Skip to content

Commit 0671d06

Browse files
committed
Exploit mutability in divrem with MutableArithmetics
1 parent 9a0f7bf commit 0671d06

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
1111

1212
[compat]
1313
DataStructures = "0.17.7"
14+
DynamicPolynomials = "0.3.11"
1415
MutableArithmetics = "0.2"
16+
TypedPolynomials = "0.2.8"
1517
julia = "1"
1618

1719
[extras]

src/division.jl

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,35 @@ Base.rem(f::APL, g::Union{APL, AbstractVector{<:APL}}; kwargs...) = divrem(f, g;
3232

3333
proddiff(x, y) = x/y - x/y
3434
function 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
5961
end
6062
function 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

Comments
 (0)