@@ -76,42 +76,26 @@ function _error_for_negative_degree(deg)
7676 end
7777end
7878
79- # Based on fillZfordeg!() from MultivariatePolynomials.jl by Benoit Legat
80- # https://github.com/blegat/MultivariatePolynomials.jl/blob/d85ad85de413afa20fc8f5354c980387218ced2c/src/mono.jl#L186-L259
81- function monomial_powers (:: Val{N} , degree) where N
82- _error_for_negative_degree (degree)
83- result = Vector {NTuple{N, Int}} ()
84- powers = zeros (Int, N)
85- powers[end ] = degree
86- while true
87- push! (result, NTuple {N, Int} (powers))
88- if powers[1 ] == degree
89- break
90- end
91- i = findfirst (i -> ! iszero (powers[i]), N: - 1 : 2 )
92- j = (N: - 1 : 2 )[i]
93- p = powers[j]
94- powers[j] = 0
95- powers[end ] = p - 1
96- powers[j- 1 ] += 1
97- end
98- result
99- end
100-
10179function MP. monomials (vars:: Tuple{Vararg{Variable}} , degree:: Integer , filter:: Function = m-> true )
102- checksorted (vars, > ) || throw (ArgumentError (" Variables must be in order" ))
103- Monomial{vars, length (vars)}[Monomial {vars} (p) for p in monomial_powers (Val {length(vars)} (), degree) if filter (Monomial {vars} (p))]
80+ return MP. monomials (vars, [degree], filter)
10481end
10582
10683function MP. monomials (vars:: Tuple{Vararg{Variable}} , degrees:: AbstractArray , filter:: Function = m-> true )
10784 checksorted (vars, > ) || throw (ArgumentError (" Variables must be in order" ))
10885 if isempty (degrees)
10986 # Otherwise, the following error is thrown: "ArgumentError: argument to Flatten must contain at least one iterator"
110- Monomial{vars, length (vars)}[]
111- else
112- Monomial{vars, length (vars)}[Monomial {vars} (p) for d in sort (degrees)
113- for p in monomial_powers (Val {length(vars)} (), d) if filter (Monomial {vars} (p))]
87+ return Monomial{vars, length (vars)}[]
88+ end
89+ d = sort (degrees)
90+ it = Iterators. Filter (MP. ExponentsIterator {MP.Graded{MP.LexOrder}} (
91+ zeros (Int, length (vars));
92+ mindegree = minimum (degrees),
93+ maxdegree = maximum (degrees),
94+ )) do p
95+ mono = Monomial {vars} (p)
96+ MP. degree (mono) in degs && filter (mono)
11497 end
98+ return Monomial{vars, length (vars)}[Monomial {vars} (p) for p in it]
11599end
116100
117101MP. promote_variables (a:: MonomialLike , b:: MonomialLike ) = promote (a, b)
0 commit comments