Skip to content

Commit 50f9ae6

Browse files
authored
Implement maxdegree for vector of polynomials (#279)
1 parent d1f41c5 commit 50f9ae6

File tree

2 files changed

+55
-31
lines changed

2 files changed

+55
-31
lines changed

src/polynomial.jl

+19-10
Original file line numberDiff line numberDiff line change
@@ -272,23 +272,29 @@ end
272272

273273
#$(SIGNATURES)
274274
"""
275-
mindegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractTermLike}})
275+
mindegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractPolynomialLike}})
276276
277277
Returns the minimal total degree of the monomials of `p`, i.e. `minimum(degree, terms(p))`.
278278
279-
mindegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractTermLike}}, v::AbstractVariable)
279+
mindegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractPolynomialLike}}, v::AbstractVariable)
280280
281281
Returns the minimal degree of the monomials of `p` in the variable `v`, i.e. `minimum(degree.(terms(p), v))`.
282282
283283
### Examples
284284
Calling `mindegree` on on ``4x^2y + xy + 2x`` should return 1, `mindegree(4x^2y + xy + 2x, x)` should return 1 and `mindegree(4x^2y + xy + 2x, y)` should return 0.
285285
"""
286-
function mindegree(X::AbstractVector{<:AbstractTermLike}, args...)
287-
return isempty(X) ? 0 : minimum(t -> degree(t, args...), X)
286+
function mindegree(
287+
X::AbstractVector{<:AbstractPolynomialLike},
288+
args::Vararg{Any,N},
289+
) where {N}
290+
return isempty(X) ? 0 : minimum(t -> mindegree(t, args...), X)
288291
end
289-
function mindegree(p::AbstractPolynomialLike, args...)
292+
function mindegree(p::AbstractPolynomialLike, args::Vararg{Any,N}) where {N}
290293
return mindegree(terms(p), args...)
291294
end
295+
function mindegree(t::AbstractTermLike, args::Vararg{Any,N}) where {N}
296+
return degree(t, args...)
297+
end
292298

293299
#$(SIGNATURES)
294300
"""
@@ -304,30 +310,33 @@ Returns the maximal degree of the monomials of `p` in the variable `v`, i.e. `ma
304310
Calling `maxdegree` on ``4x^2y + xy + 2x`` should return 3, `maxdegree(4x^2y + xy + 2x, x)` should return 2 and `maxdegree(4x^2y + xy + 2x, y)` should return 1.
305311
"""
306312
function maxdegree(
307-
X::AbstractVector{<:AbstractTermLike},
313+
X::AbstractVector{<:AbstractPolynomialLike},
308314
args::Vararg{Any,N},
309315
) where {N}
310-
return mapreduce(t -> degree(t, args...), max, X, init = 0)
316+
return mapreduce(t -> maxdegree(t, args...), max, X, init = 0)
311317
end
312318
function maxdegree(p::AbstractPolynomialLike, args::Vararg{Any,N}) where {N}
313319
return maxdegree(terms(p), args...)
314320
end
321+
function maxdegree(t::AbstractTermLike, args::Vararg{Any,N}) where {N}
322+
return degree(t, args...)
323+
end
315324

316325
#$(SIGNATURES)
317326
"""
318-
extdegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractTermLike}})
327+
extdegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractPolynomialLike}})
319328
320329
Returns the extremal total degrees of the monomials of `p`, i.e. `(mindegree(p), maxdegree(p))`.
321330
322-
extdegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractTermLike}}, v::AbstractVariable)
331+
extdegree(p::Union{AbstractPolynomialLike, AbstractVector{<:AbstractPolynomialLike}}, v::AbstractVariable)
323332
324333
Returns the extremal degrees of the monomials of `p` in the variable `v`, i.e. `(mindegree(p, v), maxdegree(p, v))`.
325334
326335
### Examples
327336
Calling `extdegree` on ``4x^2y + xy + 2x`` should return `(1, 3)`, `extdegree(4x^2y + xy + 2x, x)` should return `(1, 2)` and `maxdegree(4x^2y + xy + 2x, y)` should return `(0, 1)`.
328337
"""
329338
function extdegree(
330-
p::Union{AbstractPolynomialLike,AbstractVector{<:AbstractTermLike}},
339+
p::Union{AbstractPolynomialLike,AbstractVector{<:AbstractPolynomialLike}},
331340
args...,
332341
)
333342
return (mindegree(p, args...), maxdegree(p, args...))

test/polynomial.jl

+36-21
Original file line numberDiff line numberDiff line change
@@ -72,29 +72,44 @@ const MP = MultivariatePolynomials
7272
@test Tuple(variables([x + 1, y^2])) == (x, y)
7373
@test Tuple(variables([y^2, x + 1])) == (x, y)
7474

75-
@test maxdegree(x^2 - x^2) == 0
76-
@test maxdegree(x^2 - x^2, x) == 0
77-
@test maxdegree(x^2 - x^2, y) == 0
78-
@test mindegree(x^2 - x^2) == 0
79-
@test mindegree(x^2 - x^2, x) == 0
80-
@test mindegree(x^2 - x^2, y) == 0
81-
@test extdegree(x^2 - x^2) == (0, 0)
82-
@test extdegree(x^2 - x^2, x) == (0, 0)
83-
@test extdegree(x^2 - x^2, y) == (0, 0)
84-
@test maxdegree(x * y + 2 + x^2 * y + x + y) == 3
85-
@test maxdegree(x * y + 2 + x^2 * y + x + y, x) == 2
86-
@test maxdegree(x * y + 2 + x^2 * y + x + y, y) == 1
87-
@test mindegree(x * y + 2 + x^2 * y + x + y) == 0
88-
@test mindegree(x * y + 2 + x^2 * y + x + y, x) == 0
89-
@test mindegree(x * y + 2 + x^2 * y + x + y, y) == 0
90-
@test extdegree(x * y + 2 + x^2 * y + x + y) == (0, 3)
91-
@test extdegree(x * y + 2 + x^2 * y + x + y, x) == (0, 2)
92-
@test extdegree(x * y + 2 + x^2 * y + x + y, y) == (0, 1)
93-
@test extdegree(x * y + x^2 * y, x) == (1, 2)
94-
@test extdegree(x * y + x^2 * y, y) == (1, 1)
95-
@test leading_term(x * y + 2 + x^2 * y + x + y) == x^2 * y
75+
p = x^2 - x^2
76+
@test maxdegree(p) == 0
77+
@test maxdegree(p, x) == 0
78+
@test maxdegree(p, y) == 0
79+
@test mindegree(p) == 0
80+
@test mindegree(p, x) == 0
81+
@test mindegree(p, y) == 0
82+
@test extdegree(p) == (0, 0)
83+
@test extdegree(p, x) == (0, 0)
84+
@test extdegree(p, y) == (0, 0)
85+
q = x * y + 2 + x^2 * y + x + y
86+
@test maxdegree(q) == 3
87+
@test maxdegree(q, x) == 2
88+
@test maxdegree(q, y) == 1
89+
@test mindegree(q) == 0
90+
@test mindegree(q, x) == 0
91+
@test mindegree(q, y) == 0
92+
@test extdegree(q) == (0, 3)
93+
@test extdegree(q, x) == (0, 2)
94+
@test extdegree(q, y) == (0, 1)
95+
r = x * y + x^2 * y
96+
@test extdegree(r, x) == (1, 2)
97+
@test extdegree(r, y) == (1, 1)
98+
@test leading_term(q) == x^2 * y
9699
@test nvariables(x + y - x) == 2
97100
@test nvariables(x + x^2) == 1
101+
@test mindegree([p, q, r]) == 0
102+
@test mindegree([p, q, r], x) == 0
103+
@test mindegree([p, q, r], y) == 0
104+
@test mindegree([p, q], y) == 0
105+
@test mindegree([q], y) == 0
106+
@test mindegree([r], y) == 1
107+
@test maxdegree([p, q, r]) == 3
108+
@test maxdegree([p, q, r], x) == 2
109+
@test maxdegree([p, q, r], y) == 1
110+
@test extdegree([p, q, r]) == (0, 3)
111+
@test extdegree([p, q, r], x) == (0, 2)
112+
@test extdegree([p, q, r], y) == (0, 1)
98113

99114
@test collect(
100115
coefficients(

0 commit comments

Comments
 (0)