diff --git a/Project.toml b/Project.toml index 2d04dec1a..8fe391e88 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "Nemo" uuid = "2edaba10-b0f1-5616-af89-8c11ac63239a" -version = "0.37.2" +version = "0.37.3" [deps] AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" diff --git a/src/HeckeMoreStuff.jl b/src/HeckeMoreStuff.jl index 5dc124354..bc925ea92 100644 --- a/src/HeckeMoreStuff.jl +++ b/src/HeckeMoreStuff.jl @@ -1272,6 +1272,10 @@ function setcoeff!(x::qadic, i::Int, y::padic) end function setcoeff!(x::qadic, i::Int, y::UInt) + return setcoeff!(x, i, ZZRingElem(y)) +end + +function setcoeff!(x::qadic, i::Int, y::ZZRingElem) R = FlintPadicField(prime(parent(x)), parent(x).prec_max) Y = R(ZZRingElem(y)) ccall((:padic_poly_set_coeff_padic, libflint), Nothing, diff --git a/src/flint/fq_default_poly.jl b/src/flint/fq_default_poly.jl index f87ff36ec..d177c7ee3 100644 --- a/src/flint/fq_default_poly.jl +++ b/src/flint/fq_default_poly.jl @@ -892,3 +892,27 @@ function (R::FqPolyRing)(x::FqPolyRingElem) parent(x) != R && error("Unable to coerce to polynomial") return x end + +################################################################################ +# +# Lift +# +################################################################################ + +function lift(R::ZZPolyRing, f::FqPolyRingElem) + F = coefficient_ring(f) + absolute_degree(F) != 1 && error("Must be a prime field.") + if _fq_default_ctx_type(F) == _FQ_DEFAULT_NMOD + z = R() + ccall((:fmpz_poly_set_nmod_poly_unsigned, libflint), Nothing, + (Ref{ZZPolyRingElem}, Ref{FqPolyRingElem}), z, f) + return z + else + @assert _fq_default_ctx_type(F) == _FQ_DEFAULT_FMPZ_NMOD + z = R() + ccall((:fmpz_mod_poly_get_fmpz_poly, libflint), Nothing, + (Ref{ZZPolyRingElem}, Ref{FqPolyRingElem}, Ptr{Nothing}), + z, f, pointer_from_objref(F) + 2 * sizeof(Cint)) + return z + end +end diff --git a/test/flint/fq_default_poly-test.jl b/test/flint/fq_default_poly-test.jl index 77bd29716..2b70120ce 100644 --- a/test/flint/fq_default_poly-test.jl +++ b/test/flint/fq_default_poly-test.jl @@ -563,3 +563,28 @@ end @test !v end + +@testset "FqPolyRingElem.lift" begin + R, x = NGFiniteField(23, 1, "x") + S, y = R["y"] + ZZy, z = ZZ["z"] + f = lift(ZZy, y^2 + 1) + @test parent(f) === ZZy + @test map_coefficients(R, f, parent = S) == y^2 + 1 + + R, x = NGFiniteField(next_prime(ZZ(2)^100), 1, "x") + S, y = R["y"] + ZZy, z = ZZ["z"] + f = lift(ZZy, y^2 + 1) + @test parent(f) === ZZy + @test map_coefficients(R, f, parent = S) == y^2 + 1 + + R, x = NGFiniteField(23, 2, "x") + S, y = R["y"] + ZZy, z = ZZ["z"] + @test_throws ErrorException lift(ZZy, y^2 + 1) + R, x = NGFiniteField(next_prime(ZZ(2)^100), 2, "x") + S, y = R["y"] + ZZy, z = ZZ["z"] + @test_throws ErrorException lift(ZZy, y^2 + 1) +end diff --git a/test/flint/qadic-test.jl b/test/flint/qadic-test.jl index cdc654eef..a2ea25961 100644 --- a/test/flint/qadic-test.jl +++ b/test/flint/qadic-test.jl @@ -306,3 +306,11 @@ end @test 6 * log(R(2)) == log(R(2)^6) end + +@testset "qadic.setcoeff!" begin + R, _ = QadicField(7, 1, 30) + a = 1 + 7 + 2*7^2 + O(R, 7^3) + setcoeff!(a, 0, ZZ(2)) + @test a == 2 +end +