diff --git a/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_orders.rst b/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_orders.rst index 1c03f15d526..47b8e5f7fc6 100644 --- a/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_orders.rst +++ b/src/doc/en/thematic_tutorials/explicit_methods_in_number_theory/nf_orders.rst @@ -99,7 +99,6 @@ with ideals in non-maximal orders. sage: K. = NumberField(x^3 + 2) sage: R = K.order(3*a) sage: R.ideal(5) - doctest:warning ... FutureWarning: ... Ideal (5, 15*a, 45*a^2) of Order generated by 3*a in Number Field in a with defining polynomial x^3 + 2 sage: R.ideal(5).factor() Traceback (most recent call last): diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index 117f1223d9e..1f6a7a94444 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -2380,7 +2380,8 @@ class DirichletGroupFactory(UniqueFactory): :: - sage: r4 = CyclotomicField(4).ring_of_integers() + sage: K = CyclotomicField(4) + sage: r4 = K.ring_of_integers() sage: G = DirichletGroup(60, r4) sage: G.gens() (Dirichlet character modulo 60 of conductor 4 @@ -2393,8 +2394,7 @@ class DirichletGroupFactory(UniqueFactory): zeta4 sage: parent(val) Gaussian Integers generated by zeta4 in Cyclotomic Field of order 4 and degree 2 - sage: r4_29_0 = r4.residue_field(r4.ideal(29).factor()[0][0]); r4_29_0(val) - doctest:warning ... DeprecationWarning: ... + sage: r4_29_0 = r4.residue_field(K(29).factor()[0][0]); r4_29_0(val) 17 sage: r4_29_0(val) * GF(29)(3) 22 diff --git a/src/sage/rings/number_field/number_field_element_quadratic.pyx b/src/sage/rings/number_field/number_field_element_quadratic.pyx index e3062448708..a0e90d1d63d 100644 --- a/src/sage/rings/number_field/number_field_element_quadratic.pyx +++ b/src/sage/rings/number_field/number_field_element_quadratic.pyx @@ -2866,7 +2866,7 @@ cdef class OrderElement_quadratic(NumberFieldElement_quadratic): -13 sage: w.inverse_mod(13).parent() == OE True - sage: w.inverse_mod(2*OE) + sage: w.inverse_mod(2) Traceback (most recent call last): ... ZeroDivisionError: w is not invertible modulo Fractional ideal (2) diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py index c214c385179..e54d2f454af 100644 --- a/src/sage/rings/number_field/order.py +++ b/src/sage/rings/number_field/order.py @@ -503,21 +503,21 @@ def ideal(self, *args, **kwds): """ Return the integral ideal with given generators. + .. NOTE:: + + This method constructs an ideal of this (not necessarily maximal) order. + To construct a fractional ideal in the ambient number field, use + :meth:`~sage.rings.number_field.number_field.NumberField_generic.fractional_ideal`. + EXAMPLES:: sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + 7) sage: R = K.maximal_order() - sage: R.ideal(2/3 + 7*a, a) - Traceback (most recent call last): - ... - ValueError: ideal must be integral; - use fractional_ideal to create a non-integral ideal. - sage: R.ideal(7*a, 77 + 28*a) - Fractional ideal (7) + sage: R.ideal([7*a, 77 + 28*a]) + Ideal (7/2*a + 7/2, 7*a) of Maximal Order generated by 1/2*a + 1/2 in Number Field in a with defining polynomial x^2 + 7 sage: R = K.order(4*a) sage: R.ideal(8) - doctest:warning ... FutureWarning: ... Ideal (8, 32*a) of Order of conductor 8 generated by 4*a in Number Field in a with defining polynomial x^2 + 7 @@ -526,36 +526,22 @@ def ideal(self, *args, **kwds): sage: R = EquationOrder(x^2 + 2, 'a'); R Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 2 sage: (3,15)*R - doctest:warning ... DeprecationWarning: ... - Fractional ideal (3) + Ideal (3, 3*a) of Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 2 The zero ideal is handled properly:: sage: R.ideal(0) - Ideal (0) of Number Field in a with defining polynomial x^2 + 2 - """ - if kwds.get('future', False) or not self.is_maximal(): - if 'future' in kwds: - del kwds['future'] - from sage.rings.number_field.order_ideal import NumberFieldOrderIdeal - return NumberFieldOrderIdeal(self, *args, **kwds) - if kwds.get('warn', True): - if 'warn' in kwds: - del kwds['warn'] - from sage.misc.superseded import deprecation - deprecation(34198, 'In the future, constructing an ideal of the ring of ' - 'integers of a number field will use an implementation ' - 'compatible with ideals of other (non-maximal) orders, ' - 'rather than returning an integral fractional ideal of ' - 'its containing number field. Use .fractional_ideal(), ' - 'together with an .is_integral() check if desired, to ' - 'emulate the current behavior.\nSet warn=0 to silence ' - 'this warning, and future=1 to activate the upcoming ' - 'behavior already.') - I = self.number_field().ideal(*args, **kwds) - if not I.is_integral(): - raise ValueError("ideal must be integral; use fractional_ideal to create a non-integral ideal.") - return I + Ideal (0) of Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 2 + """ + # these keyword arguments are ignored since there used to be optional + # arguments with these names for controlling deprecated/future behavior; + # see #34806 and #35762 + if 'warn' in kwds: + del kwds['warn'] + if 'future' in kwds: + del kwds['future'] + from sage.rings.number_field.order_ideal import NumberFieldOrderIdeal + return NumberFieldOrderIdeal(self, *args, **kwds) def _coerce_map_from_(self, R): """ @@ -587,10 +573,9 @@ def __mul__(self, right): sage: Ok = k.maximal_order(); Ok Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: Ok * (11, a + 7) - doctest:warning ... DeprecationWarning: ... - Fractional ideal (11, a + 7) + Ideal (8*a + 1, 11*a) of Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: (11, a + 7) * Ok - Fractional ideal (11, a + 7) + Ideal (8*a + 1, 11*a) of Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 """ return self.ideal(right) @@ -610,7 +595,7 @@ def __rmul__(self, left): sage: (6, 1/2*a + 11/2)*Ok # random output Fractional ideal (6, 1/2*a + 11/2) sage: 17*Ok - Fractional ideal (17) + Ideal (17/2*a + 17/2, 17*a) of Maximal Order generated by 1/2*a + 1/2 in Number Field in a with defining polynomial x^2 + 431 """ return self.ideal(left) diff --git a/src/sage/rings/number_field/order_ideal.py b/src/sage/rings/number_field/order_ideal.py index da5515b2164..772c4ad3a9a 100644 --- a/src/sage/rings/number_field/order_ideal.py +++ b/src/sage/rings/number_field/order_ideal.py @@ -9,13 +9,6 @@ ideals of non-maximal orders (compared to the maximal case). This should hopefully change in the future. -TESTS: - -This module is currently experimental:: - - sage: import sage.rings.number_field.order_ideal - doctest:warning ... - EXAMPLES:: sage: O = QuadraticField(-1).order(5*i) @@ -75,9 +68,6 @@ from sage.rings.polynomial.polynomial_ring import polygens from sage.rings.ideal import Ideal_generic -from sage.misc.superseded import experimental_warning -experimental_warning(34198, 'Ideals of non-maximal orders are an experimental feature. Be wary of bugs.') - import sage.rings.number_field.order #TODO I*u works when u lies in I.ring().number_field(), but u*I doesn't