Skip to content

Commit 2ce6b01

Browse files
authored
Merge pull request #105 from rprebet/dimfix
Dimension and Hilbert: handle zero ideal
2 parents 4d8f2e6 + 175c8b9 commit 2ce6b01

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

src/algorithms/dimension.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ function dimension(I::Ideal{T}) where T <: MPolyRingElem
2626
R = parent(first(gb))
2727

2828
res = Set([trues(ngens(R))])
29-
lead_exps = Vector{Vector{Int}}(undef, length(gb))
30-
for i in eachindex(gb)
31-
lead_exps[i] = _lead_exp_ord(gb[i], :degrevlex)
32-
end
29+
lead_exps = [ _lead_exp_ord(g, :degrevlex) for g in gb if !iszero(g) ]
3330
for lexp in lead_exps
3431
nz_exps = (!iszero).(lexp)
3532
nz_exps_ind = findall(nz_exps)
@@ -62,6 +59,7 @@ function _all_lesseq(a::BitVector, b::BitVector)::Bool
6259
end
6360

6461
function _lead_exp_ord(p::MPolyRingElem, order::Symbol)
62+
@req !iszero(p) "Zero polynomial does not have a leading term"
6563
R = parent(p)
6664
internal_ordering(R)==order && return first(exponent_vectors(p))
6765

src/algorithms/hilbert.jl

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,8 @@ function hilbert_series(I::Ideal{T}) where T <: MPolyRingElem
2727
gb = get!(I.gb, 0) do
2828
groebner_basis(I, complete_reduction = true)
2929
end
30-
lead_exps = Vector{Vector{Int}}(undef, length(gb))
31-
for i in eachindex(gb)
32-
lead_exps[i] = _lead_exp_ord(gb[i], :degrevlex)
33-
end
34-
return _hilbert_series_mono(lead_exps)
30+
lead_exps = [ _lead_exp_ord(g, :degrevlex) for g in gb if !iszero(g) ]
31+
return _hilbert_series_mono(lead_exps, nvars(parent(I)))
3532
end
3633

3734
@doc Markdown.doc"""
@@ -134,11 +131,11 @@ function hilbert_polynomial(I::Ideal{T}) where T <: MPolyRingElem
134131
end
135132

136133
# Computes hilbert series of a monomial ideal on input list of exponents
137-
function _hilbert_series_mono(exps::Vector{Vector{Int}})
134+
function _hilbert_series_mono(exps::Vector{Vector{Int}}, nr_vars::Int)
138135

139136
h = _num_hilbert_series_mono(exps)
140137
t = gen(parent(h))
141-
return h//(1-t)^length(first(exps))
138+
return h//(1-t)^nr_vars
142139
end
143140

144141
# Computes numerator hilbert series of a monomial ideal on input list of exponents

test/algorithms/dimension.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
@test iszero(dimension(I))
1010
@test iszero(I.dim)
1111

12+
I = Ideal([R(0)])
13+
@test dimension(I) == ngens(R)
14+
@test I.dim == ngens(R)
15+
1216
I = Ideal([R(1)])
1317
@test dimension(I) == -1
1418
@test I.dim == -1

test/algorithms/hilbert.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@
2121
@test iszero(hilbert_dimension(I))
2222
@test 4 == hilbert_degree(I)
2323

24+
I = Ideal([R(0)])
25+
HS = 1//(1-t)^(nvars(R))
26+
HP = (1//6*s^3 + s^2 + 11//6*s + 1, 0)
27+
28+
@test HS == hilbert_series(I)
29+
@test HP == hilbert_polynomial(I)
30+
@test nvars(R) == hilbert_dimension(I)
31+
@test isone(hilbert_degree(I))
32+
2433
I = Ideal([R(1)])
2534
@test iszero(hilbert_series(I))
2635
@test all(iszero, hilbert_polynomial(I))

0 commit comments

Comments
 (0)