Skip to content

Commit

Permalink
Add some specialized methods for universal polynomials (#2013)
Browse files Browse the repository at this point in the history
  • Loading branch information
SoongNoonien authored Feb 7, 2025
1 parent 7f1f323 commit 4df8c91
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/Nemo.jl
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,8 @@ include("Infinity.jl")
include("HeckeMiscFiniteField.jl")
include("HeckeMoreStuff.jl")

include("UnivPoly.jl")

# More functionality for Julia types
include("julia/Integer.jl")
include("julia/Rational.jl")
Expand Down
35 changes: 35 additions & 0 deletions src/UnivPoly.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
###############################################################################
#
# Specialized methods for universal polynomials
#
###############################################################################

# These methods speed up some computations with specific universal
# polynomial rings which would otherwise be handled by more generic
# code. This mainly concerns rings over the rationals.

denominator(f::UniversalPolyRingElem{QQFieldElem}) = denominator(data(f))

function +(p::Generic.UnivPoly{T}, n::ZZRingElem) where {T}
S = parent(p)
return Generic.UnivPoly{T}(data(p)+n, S)
end

+(n::ZZRingElem, p::Generic.UnivPoly) = p+n

function -(p::Generic.UnivPoly{T}, n::ZZRingElem) where {T}
S = parent(p)
return Generic.UnivPoly{T}(data(p)-n, S)
end

function -(n::ZZRingElem, p::Generic.UnivPoly{T}) where {T}
S = parent(p)
return Generic.UnivPoly{T}(n-data(p), S)
end

function *(p::Generic.UnivPoly{T}, n::ZZRingElem) where {T}
S = parent(p)
return Generic.UnivPoly{T}(data(p)*n, S)
end

*(n::ZZRingElem, p::Generic.UnivPoly) = p*n
1 change: 1 addition & 0 deletions test/Generic-test.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
include("generic/Poly-test.jl")
include("generic/MPoly-test.jl")
include("generic/UnivPoly-test.jl")
include("generic/Matrix-test.jl")
include("generic/Module-test.jl")
include("generic/AbsMSeries-test.jl")
16 changes: 16 additions & 0 deletions test/generic/UnivPoly-test.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
@testset "UnivPoly.specialized_methods" begin
R = universal_polynomial_ring(QQ)
x = gen(R, :x)

@test denominator(1//2*x+1//3*x^2) == 6
@test denominator(2//3*x) == 3

@test ZZ(1)+x == 1+x
@test x+ZZ(1) == x+1

@test x-ZZ(1) == x-1
@test ZZ(1)-x == 1-x

@test ZZ(2)*x == 2*x
@test x*ZZ(2) == x*2
end

0 comments on commit 4df8c91

Please sign in to comment.