Skip to content

Commit

Permalink
Add QuotientBasis (#29)
Browse files Browse the repository at this point in the history
* Add QuotientBasis

* Add tests

* Fix format
  • Loading branch information
blegat authored May 25, 2024
1 parent e393c55 commit adcb130
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/MultivariateBases.jl
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ include("hermite.jl")
include("laguerre.jl")
include("legendre.jl")
include("chebyshev.jl")
include("quotient.jl")

end # module
9 changes: 6 additions & 3 deletions src/monomial.jl
Original file line number Diff line number Diff line change
Expand Up @@ -265,12 +265,15 @@ function MP.polynomial(Q::AbstractMatrix, mb::SubBasis{Monomial}, T::Type)
return MP.polynomial(Q, mb.monomials, T)
end

function MP.coefficients(p, basis::SubBasis{Monomial})
function MP.coefficients(
p::MP.AbstractPolynomialLike,
basis::SubBasis{Monomial},
)
return MP.coefficients(p, basis.monomials)
end

function MP.coefficients(p, ::FullBasis{Monomial})
return MP.coefficients(p)
function MP.coefficients(p::MP.AbstractPolynomialLike, ::FullBasis{Monomial})
return p
end

# Overload some of the `MP` interface for convenience
Expand Down
10 changes: 10 additions & 0 deletions src/quotient.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
struct QuotientBasis{T,I,B<:SA.AbstractBasis{T,I},D} <: SA.ExplicitBasis{T,I}
basis::B
divisor::D
end

Base.length(basis::QuotientBasis) = length(basis.basis)

function MP.coefficients(p, basis::QuotientBasis)
return MP.coefficients(rem(p, basis.divisor), basis.basis)
end
19 changes: 19 additions & 0 deletions test/quotient.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
struct PlusMinusOne # Reduce modulo `x^2 = 1`
end
function Base.rem(m::AbstractMonomial, ::PlusMinusOne)
return prod(v^mod(e, 2) for (v, e) in powers(m))
end
function Base.rem(t::AbstractTerm, d::PlusMinusOne)
return coefficient(t) * rem(monomial(t), d)
end
function Base.rem(p::AbstractPolynomial, d::PlusMinusOne)
return sum(rem(t, d) for t in terms(p))
end

@testset "PlusMinusOne" begin
@polyvar x y
basis =
MB.QuotientBasis(MB.SubBasis{MB.Monomial}([1, y, x]), PlusMinusOne())
@test length(basis) == 3
@test coefficients(x^3 - 2x^2 * y + 3x^2, basis) == [3, -2, 1]
end
3 changes: 3 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,6 @@ end
@testset "Chebyshev" begin
include("chebyshev.jl")
end
@testset "Quotient" begin
include("quotient.jl")
end

0 comments on commit adcb130

Please sign in to comment.