Skip to content

Commit 357ca10

Browse files
author
Release Manager
committed
gh-35100: New ABC sage.structure.element.NumberFieldElement, deprecate is_NumberFieldElement <!-- ^^^^^ Please provide a concise, informative and self-explanatory title. Don't put issue numbers in there, do this in the PR body below. For example, instead of "Fixes #1234" use "Introduce new method to calculate 1+1" --> ### 📚 Description Fixes #34931 <!-- Describe your changes here in detail --> <!-- Why is this change required? What problem does it solve? --> <!-- If it resolves an open issue, please link to the issue here. For example "Closes #1337" --> ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> <!-- If your change requires a documentation PR, please link it appropriately --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> - [x] I have made sure that the title is self-explanatory and the description concisely explains the PR. - [x] I have linked an issue or discussion. - [ ] I have created tests covering the changes. - [ ] I have updated the documentation accordingly. ### ⌛ Dependencies <!-- List all open pull requests that this PR logically depends on --> <!-- - #xyz: short description why this is a dependency - #abc: ... --> Depends on #35033 URL: #35100 Reported by: Matthias Köppe Reviewer(s): Matthias Köppe, Travis Scrimshaw
2 parents bcb02fe + 57fcada commit 357ca10

File tree

13 files changed

+84
-24
lines changed

13 files changed

+84
-24
lines changed

src/sage/interfaces/maxima_lib.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,8 @@ def reduce_load_MaximaLib():
11641164
import sage.rings.real_double
11651165
import sage.symbolic.expression
11661166
import sage.symbolic.integration.integral
1167+
1168+
from sage.rings.number_field.number_field_element_base import NumberFieldElement_base
11671169
from sage.symbolic.operators import FDerivativeOperator, add_vararg, mul_vararg
11681170

11691171
car=EclObject("car")
@@ -1523,9 +1525,11 @@ def pyobject_to_max(obj):
15231525
"""
15241526
if isinstance(obj,sage.rings.rational.Rational):
15251527
return EclObject(obj) if (obj.denom().is_one()) else EclObject([[rat], obj.numer(),obj.denom()])
1526-
elif isinstance(obj,sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]:
1527-
re, im = obj.list()
1528-
return EclObject([[mplus], pyobject_to_max(re), [[mtimes], pyobject_to_max(im), max_i]])
1528+
elif isinstance(obj, NumberFieldElement_base):
1529+
from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_quadratic
1530+
if isinstance(obj, NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]:
1531+
re, im = obj.list()
1532+
return EclObject([[mplus], pyobject_to_max(re), [[mtimes], pyobject_to_max(im), max_i]])
15291533
return EclObject(obj)
15301534

15311535
# This goes from SR to EclObject

src/sage/rings/finite_rings/residue_field.pyx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ from sage.rings.finite_rings.finite_field_ntl_gf2e import FiniteField_ntl_gf2e
160160
from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn
161161
from sage.rings.finite_rings.finite_field_pari_ffelt import FiniteField_pari_ffelt
162162
from sage.rings.ideal import is_Ideal
163+
from sage.rings.number_field.number_field_element_base import NumberFieldElement_base
163164
from sage.structure.element cimport Element
164165

165-
from sage.rings.number_field.number_field_element import is_NumberFieldElement
166166
from sage.rings.number_field.number_field_ideal import is_NumberFieldIdeal
167167

168168
from sage.modules.free_module_element import FreeModuleElement
@@ -295,7 +295,7 @@ class ResidueFieldFactory(UniqueFactory):
295295
if not is_Ideal(p):
296296
if isinstance(p, (int, Integer, Rational)):
297297
p = ZZ.ideal(p)
298-
elif is_NumberFieldElement(p):
298+
elif isinstance(p, NumberFieldElement_base):
299299
if p.parent().is_field():
300300
p = p.parent().ring_of_integers().ideal(p)
301301
else:

src/sage/rings/integer_ring.pyx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import sage.libs.pari.all
5858
import sage.rings.ideal
5959
from sage.categories.basic import EuclideanDomains
6060
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
61+
from sage.rings.number_field.number_field_element_base import NumberFieldElement_base
6162
from sage.structure.coerce cimport is_numpy_type
6263
from sage.structure.element cimport parent
6364
from sage.structure.parent_gens import ParentWithGens
@@ -414,8 +415,7 @@ cdef class IntegerRing_class(PrincipalIdealDomain):
414415
if x in self:
415416
return self
416417

417-
from sage.rings.number_field.number_field_element import NumberFieldElement
418-
if isinstance(x, NumberFieldElement):
418+
if isinstance(x, NumberFieldElement_base):
419419
K, from_K = parent(x).subfield(x)
420420
return K.order(K.gen())
421421

src/sage/rings/number_field/__init__.py

Whitespace-only changes.

src/sage/rings/number_field/number_field_element.pxd

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
cimport sage.structure.element
22
from sage.libs.gmp.types cimport mpz_t
33
from sage.rings.integer cimport Integer
4+
from sage.rings.number_field.number_field_element_base cimport NumberFieldElement_base
45
from sage.rings.polynomial.polynomial_element cimport Polynomial
5-
from sage.structure.element cimport FieldElement, RingElement, ModuleElement
66
from sage.structure.parent cimport Parent
77
from sage.structure.parent_base cimport ParentWithBase
88
from sage.libs.ntl.types cimport ZZ_c, ZZX_c
99
from sage.libs.ntl.ntl_ZZX cimport ntl_ZZX
1010
from sage.libs.ntl.ntl_ZZ cimport ntl_ZZ
1111

12-
cdef class NumberFieldElement(FieldElement):
12+
13+
cdef class NumberFieldElement(NumberFieldElement_base):
1314
cdef ZZX_c __numerator
1415
cdef ZZ_c __denominator
1516
# Pointers to the defining polynomial (with numerator) for the field.

src/sage/rings/number_field/number_field_element.pyx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# distutils: extra_link_args = NTL_LIBEXTRA
66
# distutils: language = c++
77
"""
8-
Number Field Elements
8+
Number field elements (implementation using NTL)
99
1010
AUTHORS:
1111
@@ -108,11 +108,19 @@ def is_NumberFieldElement(x):
108108
109109
sage: from sage.rings.number_field.number_field_element import is_NumberFieldElement
110110
sage: is_NumberFieldElement(2)
111+
doctest:warning...
112+
DeprecationWarning: is_NumberFieldElement is deprecated;
113+
use isinstance(..., sage.structure.element.NumberFieldElement) instead
114+
See https://github.com/sagemath/sage/issues/34931 for details.
111115
False
112116
sage: k.<a> = NumberField(x^7 + 17*x + 1)
113117
sage: is_NumberFieldElement(a+1)
114118
True
115119
"""
120+
from sage.misc.superseded import deprecation
121+
deprecation(34931,
122+
'is_NumberFieldElement is deprecated; '
123+
'use isinstance(..., sage.structure.element.NumberFieldElement) instead')
116124
return isinstance(x, NumberFieldElement)
117125

118126

@@ -189,7 +197,7 @@ def _inverse_mod_generic(elt, I):
189197
return I.small_residue(y)
190198

191199

192-
cdef class NumberFieldElement(FieldElement):
200+
cdef class NumberFieldElement(NumberFieldElement_base):
193201
"""
194202
An element of a number field.
195203
@@ -3884,7 +3892,7 @@ cdef class NumberFieldElement(FieldElement):
38843892
"""
38853893
from .number_field_ideal import is_NumberFieldIdeal
38863894
if not is_NumberFieldIdeal(P):
3887-
if is_NumberFieldElement(P):
3895+
if isinstance(P, NumberFieldElement):
38883896
P = self.number_field().fractional_ideal(P)
38893897
else:
38903898
raise TypeError("P must be an ideal")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from sage.structure.element cimport FieldElement
2+
3+
4+
cdef class NumberFieldElement_base(FieldElement):
5+
pass
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
r"""
2+
Number field elements (abstract base class)
3+
"""
4+
5+
# ****************************************************************************
6+
# Copyright (C) 2023 Matthias Koeppe
7+
#
8+
# Distributed under the terms of the GNU General Public License (GPL)
9+
# as published by the Free Software Foundation; either version 2 of
10+
# the License, or (at your option) any later version.
11+
# https://www.gnu.org/licenses/
12+
# ****************************************************************************
13+
14+
cdef class NumberFieldElement_base(FieldElement):
15+
r"""
16+
Abstract base class for :class:`~sage.rings.number_field.number_field_element.NumberFieldElement`
17+
18+
This class is defined for the purpose of :func:`isinstance` tests. It should not be
19+
instantiated.
20+
21+
EXAMPLES::
22+
23+
sage: k.<a> = NumberField(x^3 + x + 1)
24+
sage: isinstance(a, sage.rings.number_field.number_field_element_base.NumberFieldElement_base)
25+
True
26+
27+
By design, there is a unique direct subclass::
28+
29+
sage: len(sage.rings.number_field.number_field_element_base.NumberFieldElement_base.__subclasses__()) <= 1
30+
True
31+
"""
32+
33+
pass

src/sage/rings/universal_cyclotomic_field.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@
168168
from sage.structure.richcmp import rich_to_bool
169169
from sage.structure.unique_representation import UniqueRepresentation
170170
from sage.structure.element import FieldElement, parent
171+
171172
from sage.structure.coerce import py_scalar_to_element
172173
from sage.categories.morphism import Morphism
173174
from sage.rings.ring import Field
@@ -176,6 +177,7 @@
176177
from sage.rings.rational import Rational
177178

178179
from sage.rings.integer_ring import ZZ
180+
from sage.rings.number_field.number_field_element_base import NumberFieldElement_base
179181
from sage.rings.rational_field import QQ
180182
from sage.rings.infinity import Infinity
181183
from sage.rings.qqbar import AA, QQbar
@@ -1537,8 +1539,7 @@ def _element_constructor_(self, elt):
15371539
import sage.rings.abc
15381540
P = parent(elt)
15391541
if isinstance(P, sage.rings.abc.NumberField_cyclotomic):
1540-
from sage.rings.number_field.number_field_element import NumberFieldElement
1541-
if isinstance(elt, NumberFieldElement):
1542+
if isinstance(elt, NumberFieldElement_base):
15421543
from sage.rings.number_field.number_field import CyclotomicField
15431544
n = P.gen().multiplicative_order()
15441545
elt = CyclotomicField(n)(elt)

src/sage/schemes/elliptic_curves/cm.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
4343

4444
from sage.misc.cachefunc import cached_function
45+
from sage.rings.number_field.number_field_element_base import NumberFieldElement_base
46+
4547

4648
@cached_function
4749
def hilbert_class_polynomial(D, algorithm=None):
@@ -624,9 +626,7 @@ def is_cm_j_invariant(j, method='new'):
624626
True
625627
"""
626628
# First we check that j is an algebraic number:
627-
from sage.rings.number_field.number_field_element import NumberFieldElement
628-
from sage.rings.number_field.number_field import NumberField
629-
if not isinstance(j, NumberFieldElement) and j not in QQ:
629+
if not isinstance(j, NumberFieldElement_base) and j not in QQ:
630630
raise NotImplementedError("is_cm_j_invariant() is only implemented for number field elements")
631631

632632
# for j in ZZ we have a lookup-table:
@@ -672,6 +672,8 @@ def is_cm_j_invariant(j, method='new'):
672672

673673
K = j.parent()
674674
if h < K.absolute_degree():
675+
from sage.rings.number_field.number_field import NumberField
676+
675677
K = NumberField(jpol, 'j')
676678
j = K.gen()
677679

0 commit comments

Comments
 (0)