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