Skip to content

Commit

Permalink
Implement is_squarefree for QQ/ZZPolyRingElem (#1742)
Browse files Browse the repository at this point in the history
Before:

    julia> S, y = polynomial_ring(QQ, :y); g = 2*(y+1)^2;

    julia> @Btime is_squarefree(g)
      516.927 ns (10 allocations: 400 bytes)
    false

    julia> R, x = polynomial_ring(ZZ, :x); f = 4*(x^2+1);

    julia> @Btime is_squarefree(f)
      1.329 μs (38 allocations: 1.82 KiB)
    false

After:

    julia> S, y = polynomial_ring(QQ, :y); g = 2*(y+1)^2;

    julia> @Btime is_squarefree(g)
      53.596 ns (0 allocations: 0 bytes)
    false

    julia> R, x = polynomial_ring(ZZ, :x); f = 4*(x^2+1);

    julia> @Btime is_squarefree(f)
      209.386 ns (4 allocations: 64 bytes)
    false
  • Loading branch information
fingolfin authored Nov 8, 2024
1 parent a2378d0 commit 6a519ac
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/flint/fmpq_poly.jl
Original file line number Diff line number Diff line change
Expand Up @@ -558,11 +558,28 @@ for (factor_fn, factor_fn_inner, flint_fn) in
end)
end

################################################################################
#
# Irreducibility
#
################################################################################

function is_irreducible(x::QQPolyRingElem)
res, _ = _factor(x)
return length(res) == 1 && first(values(res)) == 1
end

################################################################################
#
# Squarefree testing
#
################################################################################

function is_squarefree(x::QQPolyRingElem)
iszero(x) && return false
return Bool(@ccall libflint.fmpq_poly_is_squarefree(x::Ref{QQPolyRingElem})::Cint)
end

###############################################################################
#
# Signature
Expand Down
1 change: 1 addition & 0 deletions src/flint/fmpz.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,7 @@ function is_squarefree(n::Union{Int, ZZRingElem})
end
return isone(maximum(values(factor(n).fac); init = 1))
end

################################################################################
#
# Factor trial range
Expand Down
18 changes: 18 additions & 0 deletions src/flint/fmpz_poly.jl
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,12 @@ for (factor_fn, factor_fn_inner, flint_fn) in
end)
end

################################################################################
#
# Irreducibility
#
################################################################################

function is_irreducible(x::ZZPolyRingElem)
if degree(x) == 0
return is_prime(coeff(x, 0))
Expand All @@ -619,6 +625,18 @@ function is_irreducible(x::ZZPolyRingElem)
end
end

################################################################################
#
# Squarefree testing
#
################################################################################

function is_squarefree(x::ZZPolyRingElem)
iszero(x) && return false
is_squarefree(content(x)) || return false # Nemo ignores the content
return Bool(@ccall libflint.fmpz_poly_is_squarefree(x::Ref{ZZPolyRingElem})::Cint)
end

###############################################################################
#
# Special polynomials
Expand Down

0 comments on commit 6a519ac

Please sign in to comment.