54 lines
2.1 KiB
Diff
54 lines
2.1 KiB
Diff
|
From 6330cee1a69229b2f5d8ac4a09a73d8152f5e14d Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
|
||
|
Date: Mon, 28 Feb 2022 23:15:16 -0300
|
||
|
Subject: trac 33360: avoid factoring in is_prime()
|
||
|
|
||
|
In the added TEST, the ideal norm is product of two primes but factoring
|
||
|
this product takes about half an hour, so factoring the ideal is slow.
|
||
|
|
||
|
To fix the issue, we only factor the ideal if the norm is a prime power.
|
||
|
---
|
||
|
src/sage/rings/number_field/number_field_ideal.py | 22 ++++++++++++++++++++++
|
||
|
1 file changed, 22 insertions(+)
|
||
|
|
||
|
diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py
|
||
|
index f785f22..10d1f88 100644
|
||
|
--- a/src/sage/rings/number_field/number_field_ideal.py
|
||
|
+++ b/src/sage/rings/number_field/number_field_ideal.py
|
||
|
@@ -995,10 +995,32 @@ class NumberFieldIdeal(Ideal_generic):
|
||
|
False
|
||
|
sage: K.ideal(17).is_prime() # ramified
|
||
|
False
|
||
|
+
|
||
|
+ TESTS::
|
||
|
+
|
||
|
+ Check that we do not factor the norm of the ideal, this used
|
||
|
+ to take half an hour, see :trac:`33360`
|
||
|
+
|
||
|
+ sage: K.<a,b,c> = NumberField([x^2-2,x^2-3,x^2-5])
|
||
|
+ sage: t = (((-2611940*c + 1925290/7653)*b - 1537130/7653*c
|
||
|
+ ....: + 10130950)*a + (1343014/7653*c - 8349770)*b
|
||
|
+ ....: + 6477058*c - 2801449990/4002519)
|
||
|
+ sage: t.is_prime()
|
||
|
+ False
|
||
|
+
|
||
|
"""
|
||
|
try:
|
||
|
return self._pari_prime is not None
|
||
|
except AttributeError:
|
||
|
+ K = self.number_field().pari_nf()
|
||
|
+ I = self.pari_hnf()
|
||
|
+ # This would be better, but it is broken in pari 2.13.3.
|
||
|
+ # self._pari_prime = K.idealismaximal(I) or None
|
||
|
+ # Instead we factor I, but only if the norm is a prime power
|
||
|
+ n = K.idealnorm(I)
|
||
|
+ if n.denominator() > 1 or not n.isprimepower():
|
||
|
+ self._pari_prime = None
|
||
|
+ return False
|
||
|
F = self.factor() # factorization with caching
|
||
|
if len(F) != 1 or F[0][1] != 1:
|
||
|
self._pari_prime = None
|
||
|
--
|
||
|
cgit v1.0-1-gd88e
|
||
|
|