Skip to content

Commit

Permalink
Reroute all the other relevant functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
HechtiDerLachs committed Dec 13, 2023
1 parent d74bc32 commit 1e91694
Show file tree
Hide file tree
Showing 2 changed files with 191 additions and 1 deletion.
96 changes: 95 additions & 1 deletion src/Rings/mpoly-ideals.jl
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ function primary_decomposition(
algorithm::Symbol=:GTZ, cache::Bool=true
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
if has_attribute(I, :primary_decomposition)
return get_attribute(I, :primary_decomposition)::Tuple{typeof(I), typeof(I)}
return get_attribute(I, :primary_decomposition)::Vector{Tuple{typeof(I), typeof(I)}}
end
R = base_ring(I)
R_flat, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
Expand Down Expand Up @@ -679,6 +679,25 @@ Multivariate polynomial ring in 2 variables over number field graded by
for i in 1:length(decomp)]
end

#=
@attr function absolute_primary_decomposition(
I::MPolyIdeal{T};
algorithm::Symbol=:GTZ, cache::Bool=true
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
R = base_ring(I)
R_exp, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
I_exp = ideal(R_exp, iso_inv.(gens(I)))
res = absolute_primary_decomposition(I_exp)
(P_ext, Q_ext, Q_prime, d) = res
P = [ideal(R, unique!(iso_inv.(gens(I)))) for I in P_ext]
Q = [ideal(R, unique!(iso_inv.(gens(I))))for I in Q_ext]
# TODO: The Q_prime lives in a ring with a coefficient field L
# which is a direct algebraic extension of QQ. Do we want to relate
# L with the coefficient_ring K of R for the output? If yes, how?
return P, Q, Q_prime, d
end
=#

# the ideals in QQbar[x] come back in QQ[x,a] with an extra variable a added
# and the minpoly of a prepended to the ideal generator list
function _map_to_ext(Qx::MPolyRing, I::Oscar.Singular.sideal)
Expand Down Expand Up @@ -873,6 +892,26 @@ julia> L = equidimensional_decomposition_weak(I)
return V
end

@attr function equidimensional_decomposition_weak(
I::MPolyIdeal{T}
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
R = base_ring(I)
R_ext, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
I_ext = ideal(R_ext, iso_inv.(gens(I)))
res = equidimensional_decomposition_weak(I_ext)
return typeof(I)[ideal(R, unique!([x for x in iso.(gens(I)) if !iszero(x)])) for I in res]
end

@attr function equidimensional_decomposition_weak(I::MPolyQuoIdeal)
A = base_ring(I)::MPolyQuoRing
R = base_ring(A)::MPolyRing
J = saturated_ideal(I)
res = equidimensional_decomposition_weak(J)
return typeof(I)[ideal(A, unique!([x for x in A.(gens(K)) if !iszero(x)])) for K in res]
end



@doc raw"""
equidimensional_decomposition_radical(I::MPolyIdeal)
Expand Down Expand Up @@ -916,6 +955,24 @@ julia> L = equidimensional_decomposition_radical(I)
end
return V
end

@attr function equidimensional_decomposition_radical(
I::MPolyIdeal{T}
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
R = base_ring(I)
R_ext, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
I_ext = ideal(R_ext, iso_inv.(gens(I)))
res = equidimensional_decomposition_weak(I_ext)
return [ideal(R, unique!(iso.(gens(I)))) for I in res]
end

@attr function equidimensional_decomposition_radical(I::MPolyQuoIdeal)
A = base_ring(I)::MPolyQuoRing
R = base_ring(A)::MPolyRing
J = saturated_ideal(I)
res = equidimensional_decomposition_radical(J)
return typeof(I)[ideal(A, unique!([x for x in A.(gens(K)) if !iszero(x)])) for K in res]
end
#######################################################
@doc raw"""
equidimensional_hull(I::MPolyIdeal)
Expand Down Expand Up @@ -978,6 +1035,25 @@ function equidimensional_hull(I::MPolyIdeal)
end
return ideal(R, i)
end

function equidimensional_hull(
I::MPolyIdeal{T}
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
R = base_ring(I)
R_ext, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
I_ext = ideal(R_ext, iso_inv.(gens(I)))
res = equidimensional_hull(I_ext)
return ideal(R, unique!(iso.(gens(res))))
end

@attr function equidimensional_hull(I::MPolyQuoIdeal)
A = base_ring(I)::MPolyQuoRing
R = base_ring(A)::MPolyRing
J = saturated_ideal(I)
res = equidimensional_hull(J)
return ideal(A, unique!([x for x in A.(gens(res)) if !iszero(x)]))
end

#######################################################
@doc raw"""
equidimensional_hull_radical(I::MPolyIdeal)
Expand Down Expand Up @@ -1017,6 +1093,24 @@ function equidimensional_hull_radical(I::MPolyIdeal)
return ideal(R, i)
end

function equidimensional_hull_radical(
I::MPolyIdeal{T}
) where {U<:Union{nf_elem, <:Hecke.NfRelElem}, T<:MPolyRingElem{U}}
R = base_ring(I)
R_ext, iso, iso_inv = _expand_coefficient_field_to_QQ(R)
I_ext = ideal(R_ext, iso_inv.(gens(I)))
res = equidimensional_hull_radical(I_ext)
return ideal(R, unique!(iso.(gens(res))))
end

@attr function equidimensional_hull_radical(I::MPolyQuoIdeal)
A = base_ring(I)::MPolyQuoRing
R = base_ring(A)::MPolyRing
J = saturated_ideal(I)
res = equidimensional_hull_radical(J)
return ideal(A, unique!([x for x in A.(gens(res)) if !iszero(x)]))
end

#######################################################
@doc raw"""
==(I::MPolyIdeal, J::MPolyIdeal)
Expand Down
96 changes: 96 additions & 0 deletions test/Rings/mpoly.jl
Original file line number Diff line number Diff line change
Expand Up @@ -393,3 +393,99 @@ end
dec = primary_decomposition(ideal(Q, zero(Q)))
@test length(dec) == 2
end

@testset "primary decomposition over number fields" begin
Pt, t = QQ[:t]
f = t^5 - 27*t^3 + t^2 - 5
K = number_field(f)

# primary_decomposition
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = ideal(R, [x, y*z^2])
for method in (:GTZ, :SY)
j = ideal(R, [R(1)])
for (q, p) in primary_decomposition(i, algorithm=method)
j = intersect(j, q)
@test is_primary(q)
@test is_prime(p)
@test p == radical(q)
end
@test j == i
end

R, (a, b, c, d) = polynomial_ring(ZZ, ["a", "b", "c", "d"])
i = ideal(R, [9, (a+3)*(b+3)])
l = primary_decomposition(i)
@test length(l) == 2

# minimal_primes
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = ideal(R, [(z^2+1)*(z^3+2)^2, y-z^2])
l = minimal_primes(i)
@test length(l) == 3

l = minimal_primes(i, algorithm=:charSets)
@test length(l) == 3

R, (a, b, c, d) = polynomial_ring(ZZ, ["a", "b", "c", "d"])
i = ideal(R, [R(9), (a+3)*(b+3)])
i1 = ideal(R, [R(3), a])
i2 = ideal(R, [R(3), b])
l = minimal_primes(i)
@test length(l) == 2
@test l[1] == i1 && l[2] == i2 || l[1] == i2 && l[2] == i1

# equidimensional_decomposition_weak
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = intersect(ideal(R, [z]), ideal(R, [x, y]),
ideal(R, [x^2, z^2]), ideal(R, [x^5, y^5, z^5]))
l = equidimensional_decomposition_weak(i)
@test length(l) == 3
@test l[1] == ideal(R, [z^4, y^5, x^5, x^3*z^3, x^4*y^4])
@test l[2] == ideal(R, [y*z, x*z, x^2])
@test l[3] == ideal(R, [z])

# equidimensional_decomposition_radical
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = ideal(R, [(z^2+1)*(z^3+2)^2, y-z^2])
l = equidimensional_decomposition_radical(i)
@test length(l) == 1

# equidimensional_hull
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = intersect(ideal(R, [z]), ideal(R, [x, y]),
ideal(R, [x^2, z^2]), ideal(R, [x^5, y^5, z^5]))
@test equidimensional_hull(i) == ideal(R, [z])

R, (a, b, c, d) = polynomial_ring(ZZ, ["a", "b", "c", "d"])
i = intersect(ideal(R, [R(9), a, b]),
ideal(R, [R(3), c]),
ideal(R, [R(11), 2*a, 7*b]),
ideal(R, [13*a^2, 17*b^4]),
ideal(R, [9*c^5, 6*d^5]),
ideal(R, [R(17), a^15, b^15, c^15, d^15]))
@test equidimensional_hull(i) == ideal(R, [R(3)])

# equidimensional_hull_radical
R, (x, y, z) = polynomial_ring(kk, ["x", "y", "z"])
i = ideal(R, [(z^2+1)*(z^3+2)^2, y-z^2])
@test equidimensional_hull_radical(i) == ideal(R, [z^2-y, y^2*z+z^3+2*z^2+2])

#= disabled for the moment but should run one day
# absolute_primary_decomposition
R,(x,y,z) = polynomial_ring(kk, ["x", "y", "z"])
I = ideal(R, [(z+1)*(z^2+1)*(z^3+2)^2, x-y*z^2])
d = absolute_primary_decomposition(I)
@test length(d) == 3
R,(x,y,z) = graded_polynomial_ring(kk, ["x", "y", "z"])
I = ideal(R, [(z+y)*(z^2+y^2)*(z^3+2*y^3)^2, x^3-y*z^2])
d = absolute_primary_decomposition(I)
@test length(d) == 5
=#

# is_prime
R, (x, y) = polynomial_ring(kk, ["x", "y"])
I = ideal(R, [one(R)])
@test is_prime(I) == false
end

0 comments on commit 1e91694

Please sign in to comment.