diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index cb52a1b67f9..eca506fb694 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -3384,7 +3384,7 @@ def primes_above(self, x, degree=None): sage: F.prime_above(0) Traceback (most recent call last): ... - AttributeError: 'NumberFieldIdeal' object has no attribute 'prime_factors' + ValueError: Does not make sense to factor (0) """ if degree is not None: degree = ZZ(degree) @@ -3479,7 +3479,7 @@ def prime_above(self, x, degree=None): sage: F.prime_above(0) Traceback (most recent call last): ... - AttributeError: 'NumberFieldIdeal' object has no attribute 'prime_factors' + ValueError: Does not make sense to factor (0) """ ids = self.primes_above(x, degree) diff --git a/src/sage/rings/number_field/order_fractional_ideal.py b/src/sage/rings/number_field/order_fractional_ideal.py index f8f6e4870e4..cce7d3330e0 100644 --- a/src/sage/rings/number_field/order_fractional_ideal.py +++ b/src/sage/rings/number_field/order_fractional_ideal.py @@ -66,6 +66,19 @@ def _richcmp_(self, other, op): return NotImplemented return richcmp(self.free_module(), other.free_module(), op) + def is_zero(self): + r""" + Return whether this ideal is the zero ideal. + + EXAMPLES:: + + sage: K. = QuadraticField(5) + sage: O = K.order(a) + sage: O.ideal(0).is_zero() + True + """ + return all(x.is_zero() for x in self.gens()) + @cached_method def is_integral(self): """ @@ -200,14 +213,31 @@ def free_module(self): """ return basis_to_module(self.basis(), self.number_field()) - # def prime_factors(self): - # O = self.order() - # OK = O.integral_closure() + def prime_factors(self): + r""" + Return a list of the prime ideal factors of `self`. + + EXAMPLES:: + + In this example, 5 splits in `OK` but not in `O`. :: + + sage: K. = QuadraticField(-1) + sage: OK = K.maximal_order() + sage: O = K.order(5*a) + sage: OK.ideal(5).prime_factors() + [Fractional ideal (-a - 2), Fractional ideal (2*a + 1)] + sage: O.ideal(5).prime_factors() + [Fractional ideal (5, 5*a) of non-maximal order] + """ + if self.is_zero(): + raise ValueError("Does not make sense to factor (0)") + O = self.order() + OK = O.integral_closure() - # aOK = OK.ideal(self.gens()) - # above = aOK.prime_factors() + aOK = OK.ideal(self.gens()) + above = aOK.prime_factors() - # return [O.intersection(p) for p in above] + return list(set(O.intersection(p) for p in above)) def basis_to_module(B, K):