From 7b02fb249669c48ff7ae76da44e79a0693948749 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 23 Jan 2023 21:04:07 -0800 Subject: [PATCH 1/9] sage.structure.element.NumberFieldElement: New ABC --- .../number_field/number_field_element.pxd | 4 +++- .../number_field/number_field_element.pyx | 2 +- src/sage/structure/element.pxd | 3 +++ src/sage/structure/element.pyx | 24 +++++++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/number_field/number_field_element.pxd b/src/sage/rings/number_field/number_field_element.pxd index d7e62edf18c..62b3b0bd0f2 100644 --- a/src/sage/rings/number_field/number_field_element.pxd +++ b/src/sage/rings/number_field/number_field_element.pxd @@ -3,13 +3,15 @@ from sage.libs.gmp.types cimport mpz_t from sage.rings.integer cimport Integer from sage.rings.polynomial.polynomial_element cimport Polynomial from sage.structure.element cimport FieldElement, RingElement, ModuleElement +from sage.structure.element cimport NumberFieldElement as NumberFieldElement_base from sage.structure.parent cimport Parent from sage.structure.parent_base cimport ParentWithBase from sage.libs.ntl.types cimport ZZ_c, ZZX_c from sage.libs.ntl.ntl_ZZX cimport ntl_ZZX from sage.libs.ntl.ntl_ZZ cimport ntl_ZZ -cdef class NumberFieldElement(FieldElement): + +cdef class NumberFieldElement(NumberFieldElement_base): cdef ZZX_c __numerator cdef ZZ_c __denominator # Pointers to the defining polynomial (with numerator) for the field. diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 30f9c8ba57f..36be1dcef9f 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -190,7 +190,7 @@ def _inverse_mod_generic(elt, I): return I.small_residue(y) -cdef class NumberFieldElement(FieldElement): +cdef class NumberFieldElement(NumberFieldElement_base): """ An element of a number field. diff --git a/src/sage/structure/element.pxd b/src/sage/structure/element.pxd index 5c6e295a4b8..4694dfcc72b 100644 --- a/src/sage/structure/element.pxd +++ b/src/sage/structure/element.pxd @@ -230,6 +230,9 @@ cdef class EuclideanDomainElement(PrincipalIdealDomainElement): cdef class FieldElement(CommutativeRingElement): cpdef _floordiv_(self, other) +cdef class NumberFieldElement(FieldElement): + pass + cdef class AlgebraElement(RingElement): pass diff --git a/src/sage/structure/element.pyx b/src/sage/structure/element.pyx index e9430f0b086..5912f443ae6 100644 --- a/src/sage/structure/element.pyx +++ b/src/sage/structure/element.pyx @@ -46,6 +46,7 @@ abstract base classes. PrincipalIdealDomainElement EuclideanDomainElement FieldElement + NumberFieldElement CommutativeAlgebraElement Expression AlgebraElement @@ -4263,6 +4264,29 @@ cdef class FieldElement(CommutativeRingElement): other = self.parent()(other) return bool(self) or other.is_zero() + +cdef class NumberFieldElement(FieldElement): + r""" + Abstract base class for :class:`~sage.rings.number_field.number_field_element.NumberFieldElement` + + This class is defined for the purpose of :func:`isinstance` tests. It should not be + instantiated. + + EXAMPLES:: + + sage: sage: k. = NumberField(x^3 + x + 1) + sage: isinstance(a, sage.structure.element.NumberFieldElement) + True + + By design, there is a unique direct subclass:: + + sage: len(sage.structure.element.NumberFieldElement.__subclasses__()) <= 1 + True + """ + + pass + + def is_AlgebraElement(x): """ Return ``True`` if x is of type AlgebraElement. From a9dacbe0f717ac312be98609228a936afaf8a4e3 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 23 Jan 2023 21:26:20 -0800 Subject: [PATCH 2/9] is_NumberFieldElement: Deprecate, replace uses by isinstance --- src/sage/rings/finite_rings/residue_field.pyx | 5 ++--- src/sage/rings/number_field/number_field_element.pyx | 6 +++++- src/sage/schemes/elliptic_curves/heegner.py | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 270f92a66e7..6270e665dcc 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -160,9 +160,8 @@ from sage.rings.finite_rings.finite_field_ntl_gf2e import FiniteField_ntl_gf2e from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn from sage.rings.finite_rings.finite_field_pari_ffelt import FiniteField_pari_ffelt from sage.rings.ideal import is_Ideal -from sage.structure.element cimport Element +from sage.structure.element cimport Element, NumberFieldElement -from sage.rings.number_field.number_field_element import is_NumberFieldElement from sage.rings.number_field.number_field_ideal import is_NumberFieldIdeal from sage.modules.free_module_element import FreeModuleElement @@ -295,7 +294,7 @@ class ResidueFieldFactory(UniqueFactory): if not is_Ideal(p): if isinstance(p, (int, Integer, Rational)): p = ZZ.ideal(p) - elif is_NumberFieldElement(p): + elif isinstance(p, NumberFieldElement): if p.parent().is_field(): p = p.parent().ring_of_integers().ideal(p) else: diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 36be1dcef9f..6e5f7c8023c 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -113,6 +113,10 @@ def is_NumberFieldElement(x): sage: is_NumberFieldElement(a+1) True """ + from sage.misc.superseded import deprecation + deprecation(34931, + 'is_NumberFieldElement is deprecated; ' + 'use isinstance(..., sage.structure.element.NumberFieldElement) instead') return isinstance(x, NumberFieldElement) @@ -3855,7 +3859,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): """ from .number_field_ideal import is_NumberFieldIdeal if not is_NumberFieldIdeal(P): - if is_NumberFieldElement(P): + if isinstance(P, NumberFieldElement): P = self.number_field().fractional_ideal(P) else: raise TypeError("P must be an ideal") diff --git a/src/sage/schemes/elliptic_curves/heegner.py b/src/sage/schemes/elliptic_curves/heegner.py index 298f44fedc6..8d267417a53 100644 --- a/src/sage/schemes/elliptic_curves/heegner.py +++ b/src/sage/schemes/elliptic_curves/heegner.py @@ -97,6 +97,7 @@ from sage.misc.verbose import verbose from sage.misc.cachefunc import cached_method +from sage.structure.element import NumberFieldElement from sage.structure.sage_object import SageObject from sage.structure.richcmp import (richcmp_method, richcmp, richcmp_not_equal, rich_to_bool) @@ -2679,7 +2680,7 @@ def __init__(self, N, D, c=ZZ(1), f=None, check=True): elif isinstance(f, BinaryQF): # convert from BinaryQF f = tuple(f) - elif sage.rings.number_field.number_field_element.is_NumberFieldElement(f): + elif isinstance(f, NumberFieldElement): # tau = number field element g = f.minpoly() if g.degree() != 2: From 1cc09cccbde3b3eafb4f123d4f06ae8cb8cace28 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 23 Jan 2023 22:14:05 -0800 Subject: [PATCH 3/9] Replace some imports of NumberFieldElement classes by ABC --- src/sage/interfaces/maxima_lib.py | 10 +++++++--- src/sage/rings/integer_ring.pyx | 2 +- src/sage/rings/universal_cyclotomic_field.py | 4 ++-- src/sage/schemes/elliptic_curves/cm.py | 5 ++++- src/sage/symbolic/expression_conversions.py | 17 ++++++++++------- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py index c54de09c544..ac6610e7552 100644 --- a/src/sage/interfaces/maxima_lib.py +++ b/src/sage/interfaces/maxima_lib.py @@ -1164,6 +1164,8 @@ def reduce_load_MaximaLib(): import sage.rings.real_double import sage.symbolic.expression import sage.symbolic.integration.integral + +from sage.structure.element import NumberFieldElement from sage.symbolic.operators import FDerivativeOperator, add_vararg, mul_vararg car=EclObject("car") @@ -1523,9 +1525,11 @@ def pyobject_to_max(obj): """ if isinstance(obj,sage.rings.rational.Rational): return EclObject(obj) if (obj.denom().is_one()) else EclObject([[rat], obj.numer(),obj.denom()]) - elif isinstance(obj,sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]: - re, im = obj.list() - return EclObject([[mplus], pyobject_to_max(re), [[mtimes], pyobject_to_max(im), max_i]]) + elif isinstance(obj, NumberFieldElement): + from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_quadratic + if isinstance(obj, NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]: + re, im = obj.list() + return EclObject([[mplus], pyobject_to_max(re), [[mtimes], pyobject_to_max(im), max_i]]) return EclObject(obj) # This goes from SR to EclObject diff --git a/src/sage/rings/integer_ring.pyx b/src/sage/rings/integer_ring.pyx index 7ba77ca2aa2..39661e76d62 100644 --- a/src/sage/rings/integer_ring.pyx +++ b/src/sage/rings/integer_ring.pyx @@ -60,6 +60,7 @@ from sage.categories.basic import EuclideanDomains from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets from sage.structure.coerce cimport is_numpy_type from sage.structure.element cimport parent +from sage.structure.element import NumberFieldElement from sage.structure.parent_gens import ParentWithGens from sage.structure.parent cimport Parent from sage.structure.richcmp cimport rich_to_bool @@ -414,7 +415,6 @@ cdef class IntegerRing_class(PrincipalIdealDomain): if x in self: return self - from sage.rings.number_field.number_field_element import NumberFieldElement if isinstance(x, NumberFieldElement): K, from_K = parent(x).subfield(x) return K.order(K.gen()) diff --git a/src/sage/rings/universal_cyclotomic_field.py b/src/sage/rings/universal_cyclotomic_field.py index d238bce3450..f5d17093d21 100644 --- a/src/sage/rings/universal_cyclotomic_field.py +++ b/src/sage/rings/universal_cyclotomic_field.py @@ -167,7 +167,8 @@ from sage.structure.richcmp import rich_to_bool from sage.structure.unique_representation import UniqueRepresentation -from sage.structure.element import FieldElement, parent +from sage.structure.element import FieldElement, parent, NumberFieldElement + from sage.structure.coerce import py_scalar_to_element from sage.categories.morphism import Morphism from sage.rings.ring import Field @@ -1537,7 +1538,6 @@ def _element_constructor_(self, elt): import sage.rings.abc P = parent(elt) if isinstance(P, sage.rings.abc.NumberField_cyclotomic): - from sage.rings.number_field.number_field_element import NumberFieldElement if isinstance(elt, NumberFieldElement): from sage.rings.number_field.number_field import CyclotomicField n = P.gen().multiplicative_order() diff --git a/src/sage/schemes/elliptic_curves/cm.py b/src/sage/schemes/elliptic_curves/cm.py index 6d56371ce93..f44e3e8947c 100644 --- a/src/sage/schemes/elliptic_curves/cm.py +++ b/src/sage/schemes/elliptic_curves/cm.py @@ -42,6 +42,8 @@ PolynomialRing) from sage.misc.cachefunc import cached_function +from sage.structure.element import NumberFieldElement + @cached_function def hilbert_class_polynomial(D, algorithm=None): @@ -623,7 +625,6 @@ def is_cm_j_invariant(j, method='new'): True """ # First we check that j is an algebraic number: - from sage.rings.all import NumberFieldElement, NumberField if not isinstance(j, NumberFieldElement) and j not in QQ: raise NotImplementedError("is_cm_j_invariant() is only implemented for number field elements") @@ -670,6 +671,8 @@ def is_cm_j_invariant(j, method='new'): K = j.parent() if h < K.absolute_degree(): + from sage.rings.number_field.number_field import NumberField + K = NumberField(jpol, 'j') j = K.gen() diff --git a/src/sage/symbolic/expression_conversions.py b/src/sage/symbolic/expression_conversions.py index 3b11fb8651e..37ca97168bf 100644 --- a/src/sage/symbolic/expression_conversions.py +++ b/src/sage/symbolic/expression_conversions.py @@ -20,10 +20,9 @@ from sage.rings.rational_field import QQ from sage.symbolic.ring import SR -from sage.structure.element import Expression +from sage.structure.element import Expression, NumberFieldElement from sage.functions.all import exp from sage.symbolic.operators import arithmetic_operators, relation_operators, FDerivativeOperator, add_vararg, mul_vararg -from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_gaussian from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField @@ -441,9 +440,10 @@ def pyobject(self, ex, obj): sage: ii.pyobject(pi, pi.pyobject()) 'Pi' """ - if (self.interface.name() in ['pari', 'gp'] and - isinstance(obj, NumberFieldElement_gaussian)): - return repr(obj) + if (self.interface.name() in ['pari', 'gp'] and isinstance(obj, NumberFieldElement)): + from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_gaussian + if isinstance(obj, NumberFieldElement_gaussian): + return repr(obj) try: return getattr(obj, self.name_init)() except AttributeError: @@ -1020,10 +1020,13 @@ def pyobject(self, ex, obj): """ try: result = getattr(obj, self.name_init)() - if isinstance(obj, NumberFieldElement_gaussian): - return "((%s)::EXPR COMPLEX INT)" % result except AttributeError: result = repr(obj) + else: + if isinstance(obj, NumberFieldElement): + from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_gaussian + if isinstance(obj, NumberFieldElement_gaussian): + return "((%s)::EXPR COMPLEX INT)" % result return "((%s)::EXPR INT)" % result def symbol(self, ex): From 4dfefbf9e0cfc6f4aa4a402b6a053ffe6e838792 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 23 Jan 2023 22:28:35 -0800 Subject: [PATCH 4/9] src/sage/rings/number_field/number_field_element.pyx: Update doctest with deprecation warning --- src/sage/rings/number_field/number_field_element.pyx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 6e5f7c8023c..3d212f23a49 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -108,6 +108,10 @@ def is_NumberFieldElement(x): sage: from sage.rings.number_field.number_field_element import is_NumberFieldElement sage: is_NumberFieldElement(2) + doctest:warning... + DeprecationWarning: is_NumberFieldElement is deprecated; + use isinstance(..., sage.structure.element.NumberFieldElement) instead + See https://trac.sagemath.org/34931 for details. False sage: k. = NumberField(x^7 + 17*x + 1) sage: is_NumberFieldElement(a+1) From bacff9613fa0dd6b2a39b424371315f318d099c7 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 24 Jan 2023 19:26:50 -0800 Subject: [PATCH 5/9] src/sage/rings/number_field/__init__.py: Remove --- src/sage/rings/number_field/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/sage/rings/number_field/__init__.py diff --git a/src/sage/rings/number_field/__init__.py b/src/sage/rings/number_field/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 From 3e95ebf75d9ccf231381840770077d118c0010d0 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 25 Jan 2023 18:38:15 -0800 Subject: [PATCH 6/9] src/sage/structure/element.pyx: Fix up doctest --- src/sage/structure/element.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/structure/element.pyx b/src/sage/structure/element.pyx index 5912f443ae6..42b7bce9d49 100644 --- a/src/sage/structure/element.pyx +++ b/src/sage/structure/element.pyx @@ -4274,7 +4274,7 @@ cdef class NumberFieldElement(FieldElement): EXAMPLES:: - sage: sage: k. = NumberField(x^3 + x + 1) + sage: k. = NumberField(x^3 + x + 1) sage: isinstance(a, sage.structure.element.NumberFieldElement) True From 30cabf8b98081d8f74e2aeebfe968d6a53bd2c65 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Thu, 16 Feb 2023 22:16:49 -0800 Subject: [PATCH 7/9] src/sage/rings/integer_ring.pyx: One cimport instead of import --- src/sage/rings/integer_ring.pyx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sage/rings/integer_ring.pyx b/src/sage/rings/integer_ring.pyx index 39661e76d62..beb5714293b 100644 --- a/src/sage/rings/integer_ring.pyx +++ b/src/sage/rings/integer_ring.pyx @@ -59,8 +59,7 @@ import sage.rings.ideal from sage.categories.basic import EuclideanDomains from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets from sage.structure.coerce cimport is_numpy_type -from sage.structure.element cimport parent -from sage.structure.element import NumberFieldElement +from sage.structure.element cimport parent, NumberFieldElement from sage.structure.parent_gens import ParentWithGens from sage.structure.parent cimport Parent from sage.structure.richcmp cimport rich_to_bool From 34be642131bd0624a880fec4d858028bfe4b2e65 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 18 Feb 2023 12:06:55 -0800 Subject: [PATCH 8/9] sage.rings.number_field.number_field_element_base: New --- src/sage/interfaces/maxima_lib.py | 4 +-- src/sage/rings/finite_rings/residue_field.pyx | 5 +-- src/sage/rings/integer_ring.pyx | 5 +-- .../number_field/number_field_element.pxd | 3 +- .../number_field/number_field_element.pyx | 2 +- .../number_field_element_base.pxd | 5 +++ .../number_field_element_base.pyx | 33 +++++++++++++++++++ src/sage/rings/universal_cyclotomic_field.py | 5 +-- src/sage/schemes/elliptic_curves/cm.py | 4 +-- src/sage/schemes/elliptic_curves/heegner.py | 4 +-- src/sage/structure/element.pxd | 3 -- src/sage/structure/element.pyx | 23 ------------- src/sage/symbolic/expression_conversions.py | 7 ++-- 13 files changed, 59 insertions(+), 44 deletions(-) create mode 100644 src/sage/rings/number_field/number_field_element_base.pxd create mode 100644 src/sage/rings/number_field/number_field_element_base.pyx diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py index ac6610e7552..5c6ee6311de 100644 --- a/src/sage/interfaces/maxima_lib.py +++ b/src/sage/interfaces/maxima_lib.py @@ -1165,7 +1165,7 @@ def reduce_load_MaximaLib(): import sage.symbolic.expression import sage.symbolic.integration.integral -from sage.structure.element import NumberFieldElement +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base from sage.symbolic.operators import FDerivativeOperator, add_vararg, mul_vararg car=EclObject("car") @@ -1525,7 +1525,7 @@ def pyobject_to_max(obj): """ if isinstance(obj,sage.rings.rational.Rational): return EclObject(obj) if (obj.denom().is_one()) else EclObject([[rat], obj.numer(),obj.denom()]) - elif isinstance(obj, NumberFieldElement): + elif isinstance(obj, NumberFieldElement_base): from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_quadratic if isinstance(obj, NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]: re, im = obj.list() diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 2726848663b..60d343f17dc 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -160,7 +160,8 @@ from sage.rings.finite_rings.finite_field_ntl_gf2e import FiniteField_ntl_gf2e from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn from sage.rings.finite_rings.finite_field_pari_ffelt import FiniteField_pari_ffelt from sage.rings.ideal import is_Ideal -from sage.structure.element cimport Element, NumberFieldElement +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base +from sage.structure.element cimport Element from sage.rings.number_field.number_field_ideal import is_NumberFieldIdeal @@ -294,7 +295,7 @@ class ResidueFieldFactory(UniqueFactory): if not is_Ideal(p): if isinstance(p, (int, Integer, Rational)): p = ZZ.ideal(p) - elif isinstance(p, NumberFieldElement): + elif isinstance(p, NumberFieldElement_base): if p.parent().is_field(): p = p.parent().ring_of_integers().ideal(p) else: diff --git a/src/sage/rings/integer_ring.pyx b/src/sage/rings/integer_ring.pyx index beb5714293b..09b239a7dea 100644 --- a/src/sage/rings/integer_ring.pyx +++ b/src/sage/rings/integer_ring.pyx @@ -58,8 +58,9 @@ import sage.libs.pari.all import sage.rings.ideal from sage.categories.basic import EuclideanDomains from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base from sage.structure.coerce cimport is_numpy_type -from sage.structure.element cimport parent, NumberFieldElement +from sage.structure.element cimport parent from sage.structure.parent_gens import ParentWithGens from sage.structure.parent cimport Parent from sage.structure.richcmp cimport rich_to_bool @@ -414,7 +415,7 @@ cdef class IntegerRing_class(PrincipalIdealDomain): if x in self: return self - if isinstance(x, NumberFieldElement): + if isinstance(x, NumberFieldElement_base): K, from_K = parent(x).subfield(x) return K.order(K.gen()) diff --git a/src/sage/rings/number_field/number_field_element.pxd b/src/sage/rings/number_field/number_field_element.pxd index 62b3b0bd0f2..9b6917223a0 100644 --- a/src/sage/rings/number_field/number_field_element.pxd +++ b/src/sage/rings/number_field/number_field_element.pxd @@ -1,9 +1,8 @@ cimport sage.structure.element from sage.libs.gmp.types cimport mpz_t from sage.rings.integer cimport Integer +from sage.rings.number_field.number_field_element_base cimport NumberFieldElement_base from sage.rings.polynomial.polynomial_element cimport Polynomial -from sage.structure.element cimport FieldElement, RingElement, ModuleElement -from sage.structure.element cimport NumberFieldElement as NumberFieldElement_base from sage.structure.parent cimport Parent from sage.structure.parent_base cimport ParentWithBase from sage.libs.ntl.types cimport ZZ_c, ZZX_c diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index c908cda14d2..8dadb3d7ac6 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -5,7 +5,7 @@ # distutils: extra_link_args = NTL_LIBEXTRA # distutils: language = c++ """ -Number Field Elements +Number field elements (implementation using NTL) AUTHORS: diff --git a/src/sage/rings/number_field/number_field_element_base.pxd b/src/sage/rings/number_field/number_field_element_base.pxd new file mode 100644 index 00000000000..060f0c754c4 --- /dev/null +++ b/src/sage/rings/number_field/number_field_element_base.pxd @@ -0,0 +1,5 @@ +from sage.structure.element cimport FieldElement + + +cdef class NumberFieldElement_base(FieldElement): + pass diff --git a/src/sage/rings/number_field/number_field_element_base.pyx b/src/sage/rings/number_field/number_field_element_base.pyx new file mode 100644 index 00000000000..5385833f1d4 --- /dev/null +++ b/src/sage/rings/number_field/number_field_element_base.pyx @@ -0,0 +1,33 @@ +r""" +Number field elements (abstract base class) +""" + +# **************************************************************************** +# Copyright (C) 2023 Matthias Koeppe +# +# Distributed under the terms of the GNU General Public License (GPL) +# as published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# https://www.gnu.org/licenses/ +# **************************************************************************** + +cdef class NumberFieldElement_base(FieldElement): + r""" + Abstract base class for :class:`~sage.rings.number_field.number_field_element.NumberFieldElement` + + This class is defined for the purpose of :func:`isinstance` tests. It should not be + instantiated. + + EXAMPLES:: + + sage: k. = NumberField(x^3 + x + 1) + sage: isinstance(a, sage.rings.number_field.number_field_element_base.NumberFieldElement_base) + True + + By design, there is a unique direct subclass:: + + sage: len(sage.rings.number_field.number_field_element_base.NumberFieldElement_base.__subclasses__()) <= 1 + True + """ + + pass diff --git a/src/sage/rings/universal_cyclotomic_field.py b/src/sage/rings/universal_cyclotomic_field.py index f5d17093d21..5b51d7b9557 100644 --- a/src/sage/rings/universal_cyclotomic_field.py +++ b/src/sage/rings/universal_cyclotomic_field.py @@ -167,7 +167,7 @@ from sage.structure.richcmp import rich_to_bool from sage.structure.unique_representation import UniqueRepresentation -from sage.structure.element import FieldElement, parent, NumberFieldElement +from sage.structure.element import FieldElement, parent from sage.structure.coerce import py_scalar_to_element from sage.categories.morphism import Morphism @@ -177,6 +177,7 @@ from sage.rings.rational import Rational from sage.rings.integer_ring import ZZ +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base from sage.rings.rational_field import QQ from sage.rings.infinity import Infinity from sage.rings.qqbar import AA, QQbar @@ -1538,7 +1539,7 @@ def _element_constructor_(self, elt): import sage.rings.abc P = parent(elt) if isinstance(P, sage.rings.abc.NumberField_cyclotomic): - if isinstance(elt, NumberFieldElement): + if isinstance(elt, NumberFieldElement_base): from sage.rings.number_field.number_field import CyclotomicField n = P.gen().multiplicative_order() elt = CyclotomicField(n)(elt) diff --git a/src/sage/schemes/elliptic_curves/cm.py b/src/sage/schemes/elliptic_curves/cm.py index 6c7a793adce..02a24908f1c 100644 --- a/src/sage/schemes/elliptic_curves/cm.py +++ b/src/sage/schemes/elliptic_curves/cm.py @@ -42,7 +42,7 @@ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.misc.cachefunc import cached_function -from sage.structure.element import NumberFieldElement +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base @cached_function @@ -626,7 +626,7 @@ def is_cm_j_invariant(j, method='new'): True """ # First we check that j is an algebraic number: - if not isinstance(j, NumberFieldElement) and j not in QQ: + if not isinstance(j, NumberFieldElement_base) and j not in QQ: raise NotImplementedError("is_cm_j_invariant() is only implemented for number field elements") # for j in ZZ we have a lookup-table: diff --git a/src/sage/schemes/elliptic_curves/heegner.py b/src/sage/schemes/elliptic_curves/heegner.py index 2ff01cb58d4..7b9894f0ae2 100644 --- a/src/sage/schemes/elliptic_curves/heegner.py +++ b/src/sage/schemes/elliptic_curves/heegner.py @@ -117,7 +117,7 @@ from sage.rings.real_mpfr import RealField from sage.quadratic_forms.all import (BinaryQF, BinaryQF_reduced_representatives) -from sage.structure.element import NumberFieldElement +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base from sage.structure.sage_object import SageObject from sage.structure.richcmp import (richcmp_method, richcmp, richcmp_not_equal, rich_to_bool) @@ -2684,7 +2684,7 @@ def __init__(self, N, D, c=ZZ(1), f=None, check=True): elif isinstance(f, BinaryQF): # convert from BinaryQF f = tuple(f) - elif isinstance(f, NumberFieldElement): + elif isinstance(f, NumberFieldElement_base): # tau = number field element g = f.minpoly() if g.degree() != 2: diff --git a/src/sage/structure/element.pxd b/src/sage/structure/element.pxd index 4694dfcc72b..5c6e295a4b8 100644 --- a/src/sage/structure/element.pxd +++ b/src/sage/structure/element.pxd @@ -230,9 +230,6 @@ cdef class EuclideanDomainElement(PrincipalIdealDomainElement): cdef class FieldElement(CommutativeRingElement): cpdef _floordiv_(self, other) -cdef class NumberFieldElement(FieldElement): - pass - cdef class AlgebraElement(RingElement): pass diff --git a/src/sage/structure/element.pyx b/src/sage/structure/element.pyx index fd191a85ab4..c88ae348859 100644 --- a/src/sage/structure/element.pyx +++ b/src/sage/structure/element.pyx @@ -46,7 +46,6 @@ abstract base classes. PrincipalIdealDomainElement EuclideanDomainElement FieldElement - NumberFieldElement CommutativeAlgebraElement Expression AlgebraElement @@ -4265,28 +4264,6 @@ cdef class FieldElement(CommutativeRingElement): return bool(self) or other.is_zero() -cdef class NumberFieldElement(FieldElement): - r""" - Abstract base class for :class:`~sage.rings.number_field.number_field_element.NumberFieldElement` - - This class is defined for the purpose of :func:`isinstance` tests. It should not be - instantiated. - - EXAMPLES:: - - sage: k. = NumberField(x^3 + x + 1) - sage: isinstance(a, sage.structure.element.NumberFieldElement) - True - - By design, there is a unique direct subclass:: - - sage: len(sage.structure.element.NumberFieldElement.__subclasses__()) <= 1 - True - """ - - pass - - def is_AlgebraElement(x): """ Return ``True`` if x is of type AlgebraElement. diff --git a/src/sage/symbolic/expression_conversions.py b/src/sage/symbolic/expression_conversions.py index 37ca97168bf..9fc4b41e7f8 100644 --- a/src/sage/symbolic/expression_conversions.py +++ b/src/sage/symbolic/expression_conversions.py @@ -20,9 +20,10 @@ from sage.rings.rational_field import QQ from sage.symbolic.ring import SR -from sage.structure.element import Expression, NumberFieldElement +from sage.structure.element import Expression from sage.functions.all import exp from sage.symbolic.operators import arithmetic_operators, relation_operators, FDerivativeOperator, add_vararg, mul_vararg +from sage.rings.number_field.number_field_element_base import NumberFieldElement_base from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField @@ -440,7 +441,7 @@ def pyobject(self, ex, obj): sage: ii.pyobject(pi, pi.pyobject()) 'Pi' """ - if (self.interface.name() in ['pari', 'gp'] and isinstance(obj, NumberFieldElement)): + if (self.interface.name() in ['pari', 'gp'] and isinstance(obj, NumberFieldElement_base)): from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_gaussian if isinstance(obj, NumberFieldElement_gaussian): return repr(obj) @@ -1023,7 +1024,7 @@ def pyobject(self, ex, obj): except AttributeError: result = repr(obj) else: - if isinstance(obj, NumberFieldElement): + if isinstance(obj, NumberFieldElement_base): from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_gaussian if isinstance(obj, NumberFieldElement_gaussian): return "((%s)::EXPR COMPLEX INT)" % result From 0c894e0b675e410d7770dbb272c2afdd726a5cde Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 20 Feb 2023 18:40:10 -0800 Subject: [PATCH 9/9] src/sage/rings/number_field/number_field_element.pyx: Update doctest output (trac->github) --- src/sage/rings/number_field/number_field_element.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 7955bf37d07..87fab32e2d8 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -111,7 +111,7 @@ def is_NumberFieldElement(x): doctest:warning... DeprecationWarning: is_NumberFieldElement is deprecated; use isinstance(..., sage.structure.element.NumberFieldElement) instead - See https://trac.sagemath.org/34931 for details. + See https://github.com/sagemath/sage/issues/34931 for details. False sage: k. = NumberField(x^7 + 17*x + 1) sage: is_NumberFieldElement(a+1)