Skip to content

Commit cbacce8

Browse files
authored
Merge pull request #526 from SciML/check_primality
Avoiding some false positives in check_primality
2 parents 7eda3f8 + c50b1e6 commit cbacce8

1 file changed

Lines changed: 19 additions & 4 deletions

File tree

src/primality_check.jl

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,25 @@ function check_primality(
6161
ring = parent(leaders[1])
6262

6363
Rspec, vspec = Nemo.polynomial_ring(Nemo.QQ, [var_to_str(l) for l in leaders])
64-
eval_point = [v in keys(polys) ? v : ring(rand(1:100)) for v in gens(ring)]
65-
all_polys = vcat(collect(values(polys)), extra_relations)
66-
zerodim_ideal =
67-
collect(map(p -> parent_ring_change(evaluate(p, eval_point), Rspec), all_polys))
64+
leader_degrees = Dict(lead => Nemo.degree(poly, lead) for (lead, poly) in polys)
65+
66+
local zerodim_ideal
67+
attempts = 0
68+
while true
69+
attempts += 1
70+
eval_point = [v in keys(polys) ? v : ring(rand(1:(100 * attempts))) for v in gens(ring)]
71+
specialized = Dict(lead => evaluate(polys[lead], eval_point) for lead in leaders)
72+
# Checks if the degrees in leaders drop, restarts if they do
73+
if all(Nemo.degree(specialized[lead], lead) == leader_degrees[lead] for lead in leaders)
74+
all_polys = vcat(
75+
[specialized[lead] for lead in leaders],
76+
[evaluate(p, eval_point) for p in extra_relations],
77+
)
78+
zerodim_ideal =
79+
collect(map(p -> parent_ring_change(p, Rspec), all_polys))
80+
break
81+
end
82+
end
6883

6984
return check_primality_zerodim(zerodim_ideal)
7085
end

0 commit comments

Comments
 (0)