Skip to content

Commit

Permalink
Merge pull request #74 from RafaelDavidMohr/rm/dimension
Browse files Browse the repository at this point in the history
Adds function for dimension computation
  • Loading branch information
ederc authored Sep 27, 2024
2 parents d7f4912 + 5cb9790 commit 44c7b8c
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/AlgebraicSolving.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ include("interfaces/nemo.jl")
include("algorithms/groebner-bases.jl")
include("algorithms/normal-forms.jl")
include("algorithms/solvers.jl")
include("algorithms/dimension.jl")
#= siggb =#
include("siggb/siggb.jl")
#= examples =#
Expand Down
50 changes: 50 additions & 0 deletions src/algorithms/dimension.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
@doc Markdown.doc"""
dimension(I::Ideal{T}) where T <: MPolyRingElem
Compute the Krull dimension of a given polynomial ideal `I`.
**Note**: This requires a Gröbner basis of `I`.
# Examples
```jldoctest
julia> using AlgebraicSolving
julia> R, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"]);
julia> I = Ideal([x*y,x*z,y*z]);
julia> dimension(I)
1
```
"""
function dimension(I::Ideal{T}) where T <: MPolyRingElem

gb = isempty(values(I.gb)) ? groebner_basis(I) : first(values(I.gb))
R = parent(first(gb))
res = [trues(ngens(R))]

lms = (Nemo.leading_monomial).(gb)
for lm in lms
to_del = Int[]
new_miss = BitVector[]
for (i, mis) in enumerate(res)
nz_exps_inds = findall(e -> !iszero(e),
first(Nemo.exponent_vectors(lm)))
ind_var_inds = findall(mis)
if issubset(nz_exps_inds, ind_var_inds)
for j in nz_exps_inds
new_mis = copy(mis)
new_mis[j] = false
push!(new_miss, new_mis)
end
push!(to_del, i)
end
end
deleteat!(res, to_del)
append!(res, new_miss)
unique!(res)
end

max_length = maximum(mis -> length(findall(mis)), res)
return max_length
end
2 changes: 1 addition & 1 deletion src/exports.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export polynomial_ring, MPolyRing, GFElem, MPolyRingElem, finite_field, GF, fpMPolyRingElem,
characteristic, degree, ZZ, QQ, vars, nvars, ngens, ZZRingElem, QQFieldElem, QQMPolyRingElem,
base_ring, coefficient_ring, evaluate, prime_field, sig_groebner_basis, cyclic, leading_coefficient,
FqMPolyRingElem
FqMPolyRingElem, dimension
9 changes: 9 additions & 0 deletions test/algorithms/dimension.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@testset "dimension" begin
R, (x,y) = polynomial_ring(QQ,["x","y"])
I = Ideal([x^2,x*y])
@test isone(dimension(I))

R, (x,y,z) = polynomial_ring(GF(101),["x","y","z"])
I = Ideal([x+2*y+2*z-1, x^2+2*y^2+2*z^2-x, 2*x*y+2*y*z-y])
@test isone(dimension(I))
end
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ include("interfaces/nemo.jl")
include("algorithms/groebner-bases.jl")
include("algorithms/normal-forms.jl")
include("algorithms/solvers.jl")
include("algorithms/dimension.jl")
include("examples/katsura.jl")
end

0 comments on commit 44c7b8c

Please sign in to comment.