diff --git a/src/Nemo.jl b/src/Nemo.jl index 4b3fef1491..8afbe2851b 100644 --- a/src/Nemo.jl +++ b/src/Nemo.jl @@ -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") diff --git a/src/UnivPoly.jl b/src/UnivPoly.jl new file mode 100644 index 0000000000..b141619d49 --- /dev/null +++ b/src/UnivPoly.jl @@ -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 diff --git a/test/Generic-test.jl b/test/Generic-test.jl index 88a44b891d..f8049b9b49 100644 --- a/test/Generic-test.jl +++ b/test/Generic-test.jl @@ -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") diff --git a/test/generic/UnivPoly-test.jl b/test/generic/UnivPoly-test.jl new file mode 100644 index 0000000000..c78abd8434 --- /dev/null +++ b/test/generic/UnivPoly-test.jl @@ -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