From 8d1ef9738367c86bea85194230c5c1b276a6755e Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 25 Jan 2023 00:26:51 -0800 Subject: [PATCH 01/18] Use try..except when importing polynomial implementation classes --- src/sage/rings/polynomial/polynomial_ring.py | 68 ++++++++++++------- .../polynomial/polynomial_ring_constructor.py | 4 +- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 74e6b061a09..4ceb677ca97 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -1804,16 +1804,24 @@ def __init__(self, base_ring, name="x", sparse=False, implementation=None, """ self._implementation_repr = '' if element_class is None: - implementation = self._implementation_names(implementation, base_ring, sparse)[0] - if base_ring is ZZ: - if implementation == 'NTL': - from sage.rings.polynomial.polynomial_integer_dense_ntl \ - import Polynomial_integer_dense_ntl as element_class - self._implementation_repr = ' (using NTL)' - elif implementation == 'FLINT': - element_class = Polynomial_integer_dense_flint + for implementation in self._implementation_names(implementation, base_ring, sparse): + if base_ring is ZZ: + if implementation == 'NTL': + try: + from sage.rings.polynomial.polynomial_integer_dense_ntl \ + import Polynomial_integer_dense_ntl as element_class + except ImportError: + continue + self._implementation_repr = ' (using NTL)' + elif implementation == 'FLINT': + try: + from .polynomial_integer_dense_flint \ + import Polynomial_integer_dense_flint as element_class + except ImportError: + continue + break PolynomialRing_commutative.__init__(self, base_ring, name=name, - sparse=sparse, element_class=element_class, category=category) + sparse=sparse, element_class=element_class, category=category) self._has_singular = can_convert_to_singular(self) @cached_method(key=lambda self, d, q, sign, lead: (d, q, sign, tuple([x if isinstance(x, (tuple, list)) else (x, 0) for x in lead]) if isinstance(lead, (tuple, list)) else ((lead, 0)))) @@ -2013,30 +2021,42 @@ def __init__(self, base_ring, name="x", sparse=False, element_class=None, catego sage: x^(10^20) # this should be fast x^100000000000000000000 """ - import sage.rings.complex_arb - - if not element_class: + def _element_class(): + if element_class: + return element_class if sparse: - element_class = polynomial_element_generic.Polynomial_generic_sparse_field - elif isinstance(base_ring, rational_field.RationalField): - from sage.rings.polynomial.polynomial_rational_flint import Polynomial_rational_flint - element_class = Polynomial_rational_flint + from sage.rings.polynomial.polynomial_element_generic import Polynomial_generic_sparse_field + return Polynomial_generic_sparse_field + if isinstance(base_ring, rational_field.RationalField): + try: + from sage.rings.polynomial.polynomial_rational_flint import Polynomial_rational_flint + return Polynomial_rational_flint + except ImportError: + pass elif is_NumberField(base_ring): if base_ring.is_absolute(): from sage.rings.polynomial.polynomial_number_field import Polynomial_absolute_number_field_dense - element_class = Polynomial_absolute_number_field_dense + return Polynomial_absolute_number_field_dense else: from sage.rings.polynomial.polynomial_number_field import Polynomial_relative_number_field_dense - element_class = Polynomial_relative_number_field_dense + return Polynomial_relative_number_field_dense elif isinstance(base_ring, sage.rings.abc.RealField): - element_class = PolynomialRealDense + try: + from .polynomial_real_mpfr_dense import PolynomialRealDense + return PolynomialRealDense + except ImportError: + pass elif isinstance(base_ring, sage.rings.abc.ComplexBallField): - from sage.rings.polynomial.polynomial_complex_arb import Polynomial_complex_arb - element_class = Polynomial_complex_arb - else: - element_class = polynomial_element_generic.Polynomial_generic_dense_field + try: + from sage.rings.polynomial.polynomial_complex_arb import Polynomial_complex_arb + return Polynomial_complex_arb + except ImportError: + pass + from sage.rings.polynomial.polynomial_element_generic import Polynomial_generic_dense_field + return Polynomial_generic_dense_field - PolynomialRing_integral_domain.__init__(self, base_ring, name=name, sparse=sparse, element_class=element_class, category=category) + PolynomialRing_integral_domain.__init__(self, base_ring, name=name, sparse=sparse, + element_class=_element_class(), category=category) def _ideal_class_(self, n=0): """ diff --git a/src/sage/rings/polynomial/polynomial_ring_constructor.py b/src/sage/rings/polynomial/polynomial_ring_constructor.py index 65e67cc3527..9530876c40e 100644 --- a/src/sage/rings/polynomial/polynomial_ring_constructor.py +++ b/src/sage/rings/polynomial/polynomial_ring_constructor.py @@ -819,10 +819,10 @@ def _multi_variate(base_ring, names, sparse=None, order="degrevlex", implementat implementation_names = set([implementation]) if implementation is None or implementation == "singular": - from sage.rings.polynomial.multi_polynomial_libsingular import MPolynomialRing_libsingular try: + from sage.rings.polynomial.multi_polynomial_libsingular import MPolynomialRing_libsingular R = MPolynomialRing_libsingular(base_ring, n, names, order) - except (TypeError, NotImplementedError): + except (ImportError, TypeError, NotImplementedError): if implementation is not None: raise else: From 0bcf1571b444bb950e5e9322e92f6506af2d3092 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 6 Mar 2023 18:41:35 -0800 Subject: [PATCH 02/18] PolynomialRing_dense_...: Fall back to other implementations on ImportError --- src/sage/rings/polynomial/polynomial_ring.py | 92 ++++++++++++-------- 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 4ceb677ca97..b4912b7c37c 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -2444,15 +2444,19 @@ def __init__(self, base_ring, name="x", element_class=None, implementation=None) ... ValueError: unknown implementation 'superfast' for dense polynomial rings over Finite Field in z6 of size 2^6 """ - implementation = self._implementation_names(implementation, base_ring)[0] - if implementation == "NTL": - from sage.libs.ntl.ntl_ZZ_pEContext import ntl_ZZ_pEContext - from sage.libs.ntl.ntl_ZZ_pX import ntl_ZZ_pX - from sage.rings.polynomial.polynomial_zz_pex import Polynomial_ZZ_pEX - - p = base_ring.characteristic() - self._modulus = ntl_ZZ_pEContext(ntl_ZZ_pX(list(base_ring.modulus()), p)) - element_class = Polynomial_ZZ_pEX + if element_class is None: + for implementation in self._implementation_names(implementation, base_ring): + if implementation == "NTL": + try: + from sage.libs.ntl.ntl_ZZ_pEContext import ntl_ZZ_pEContext + from sage.libs.ntl.ntl_ZZ_pX import ntl_ZZ_pX + from sage.rings.polynomial.polynomial_zz_pex import Polynomial_ZZ_pEX + except ImportError: + continue + p = base_ring.characteristic() + self._modulus = ntl_ZZ_pEContext(ntl_ZZ_pX(list(base_ring.modulus()), p)) + element_class = Polynomial_ZZ_pEX + break PolynomialRing_field.__init__(self, base_ring, sparse=False, name=name, element_class=element_class) @@ -3052,19 +3056,26 @@ def __init__(self, base_ring, name=None, element_class=None, """ if element_class is None: - implementation = self._implementation_names(implementation, base_ring)[0] - if implementation == "FLINT": - from .polynomial_zmod_flint import \ - Polynomial_zmod_flint as element_class - self._implementation_repr = '' - elif implementation == "NTL": - modulus = base_ring.order() - from . import polynomial_modn_dense_ntl as modn_dense_ntl - if modulus < ZZ(modn_dense_ntl.zz_p_max): - element_class = modn_dense_ntl.Polynomial_dense_modn_ntl_zz - else: - element_class = modn_dense_ntl.Polynomial_dense_modn_ntl_ZZ - self._implementation_repr = ' (using NTL)' + for implementation in self._implementation_names(implementation, base_ring): + if implementation == "FLINT": + try: + from .polynomial_zmod_flint import Polynomial_zmod_flint as element_class + except ImportError: + continue + self._implementation_repr = '' + elif implementation == "NTL": + modulus = base_ring.order() + try: + from . import polynomial_modn_dense_ntl as modn_dense_ntl + except ImportError: + continue + if modulus < ZZ(modn_dense_ntl.zz_p_max): + element_class = modn_dense_ntl.Polynomial_dense_modn_ntl_zz + else: + element_class = modn_dense_ntl.Polynomial_dense_modn_ntl_ZZ + self._implementation_repr = ' (using NTL)' + break + PolynomialRing_commutative.__init__(self, base_ring, name=name, element_class=element_class, category=category) @@ -3177,7 +3188,7 @@ def residue_field(self, ideal, names=None): class PolynomialRing_dense_mod_p(PolynomialRing_dense_finite_field, PolynomialRing_dense_mod_n, PolynomialRing_singular_repr): - def __init__(self, base_ring, name="x", implementation=None, category=None): + def __init__(self, base_ring, name="x", implementation=None, element_class=None, category=None): """ TESTS:: @@ -3213,19 +3224,28 @@ def __init__(self, base_ring, name="x", implementation=None, category=None): sage: R is S True """ - implementation = self._implementation_names(implementation, base_ring)[0] - if implementation == "FLINT": - from .polynomial_zmod_flint import \ - Polynomial_zmod_flint as element_class - self._implementation_repr = '' - elif implementation == "NTL": - from .polynomial_modn_dense_ntl import \ - Polynomial_dense_mod_p as element_class - self._implementation_repr = ' (using NTL)' - elif implementation == "GF2X": - from .polynomial_gf2x import \ - Polynomial_GF2X as element_class - self._implementation_repr = ' (using GF2X)' + if element_class is None: + for implementation in self._implementation_names(implementation, base_ring): + if implementation == "FLINT": + try: + from .polynomial_zmod_flint import Polynomial_zmod_flint as element_class + except ImportError: + continue + self._implementation_repr = '' + elif implementation == "NTL": + try: + from .polynomial_modn_dense_ntl import Polynomial_dense_mod_p as element_class + except ImportError: + continue + self._implementation_repr = ' (using NTL)' + elif implementation == "GF2X": + try: + from .polynomial_gf2x import Polynomial_GF2X as element_class + except ImportError: + continue + self._implementation_repr = ' (using GF2X)' + break + PolynomialRing_dense_mod_n.__init__(self, base_ring, name=name, element_class=element_class, category=category) From 3a96723172a4101b6e977b10a7959424c2e4bf92 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 12 Mar 2023 00:31:14 -0800 Subject: [PATCH 03/18] sage.rings.polynomial: Handle implementation better when implementations are missing --- src/sage/rings/polynomial/polynomial_ring.py | 21 +++++++++++++++++++ .../polynomial/polynomial_ring_constructor.py | 2 -- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index b4912b7c37c..e9ef53942df 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -1804,6 +1804,7 @@ def __init__(self, base_ring, name="x", sparse=False, implementation=None, """ self._implementation_repr = '' if element_class is None: + given_implementation = implementation for implementation in self._implementation_names(implementation, base_ring, sparse): if base_ring is ZZ: if implementation == 'NTL': @@ -1811,6 +1812,8 @@ def __init__(self, base_ring, name="x", sparse=False, implementation=None, from sage.rings.polynomial.polynomial_integer_dense_ntl \ import Polynomial_integer_dense_ntl as element_class except ImportError: + if given_implementation: + raise continue self._implementation_repr = ' (using NTL)' elif implementation == 'FLINT': @@ -1818,6 +1821,8 @@ def __init__(self, base_ring, name="x", sparse=False, implementation=None, from .polynomial_integer_dense_flint \ import Polynomial_integer_dense_flint as element_class except ImportError: + if given_implementation: + raise continue break PolynomialRing_commutative.__init__(self, base_ring, name=name, @@ -2445,6 +2450,7 @@ def __init__(self, base_ring, name="x", element_class=None, implementation=None) ValueError: unknown implementation 'superfast' for dense polynomial rings over Finite Field in z6 of size 2^6 """ if element_class is None: + given_implementation = implementation for implementation in self._implementation_names(implementation, base_ring): if implementation == "NTL": try: @@ -2452,6 +2458,8 @@ def __init__(self, base_ring, name="x", element_class=None, implementation=None) from sage.libs.ntl.ntl_ZZ_pX import ntl_ZZ_pX from sage.rings.polynomial.polynomial_zz_pex import Polynomial_ZZ_pEX except ImportError: + if given_implementation: + raise continue p = base_ring.characteristic() self._modulus = ntl_ZZ_pEContext(ntl_ZZ_pX(list(base_ring.modulus()), p)) @@ -3055,12 +3063,16 @@ def __init__(self, base_ring, name=None, element_class=None, sage: type(R.gen()) """ + self._implementation_repr = '' if element_class is None: + given_implementation = implementation for implementation in self._implementation_names(implementation, base_ring): if implementation == "FLINT": try: from .polynomial_zmod_flint import Polynomial_zmod_flint as element_class except ImportError: + if given_implementation: + raise continue self._implementation_repr = '' elif implementation == "NTL": @@ -3068,6 +3080,8 @@ def __init__(self, base_ring, name=None, element_class=None, try: from . import polynomial_modn_dense_ntl as modn_dense_ntl except ImportError: + if given_implementation: + raise continue if modulus < ZZ(modn_dense_ntl.zz_p_max): element_class = modn_dense_ntl.Polynomial_dense_modn_ntl_zz @@ -3225,23 +3239,30 @@ def __init__(self, base_ring, name="x", implementation=None, element_class=None, True """ if element_class is None: + given_implementation = implementation for implementation in self._implementation_names(implementation, base_ring): if implementation == "FLINT": try: from .polynomial_zmod_flint import Polynomial_zmod_flint as element_class except ImportError: + if given_implementation: + raise continue self._implementation_repr = '' elif implementation == "NTL": try: from .polynomial_modn_dense_ntl import Polynomial_dense_mod_p as element_class except ImportError: + if given_implementation: + raise continue self._implementation_repr = ' (using NTL)' elif implementation == "GF2X": try: from .polynomial_gf2x import Polynomial_GF2X as element_class except ImportError: + if given_implementation: + raise continue self._implementation_repr = ' (using GF2X)' break diff --git a/src/sage/rings/polynomial/polynomial_ring_constructor.py b/src/sage/rings/polynomial/polynomial_ring_constructor.py index 9530876c40e..5e344b0c66b 100644 --- a/src/sage/rings/polynomial/polynomial_ring_constructor.py +++ b/src/sage/rings/polynomial/polynomial_ring_constructor.py @@ -762,7 +762,6 @@ def _single_variate(base_ring, name, sparse=None, implementation=None, order=Non if specialized is not None: implementation_names = specialized._implementation_names_impl(implementation, base_ring, sparse) if implementation_names is not NotImplemented: - implementation = implementation_names[0] constructor = specialized # Generic implementations @@ -780,7 +779,6 @@ def _single_variate(base_ring, name, sparse=None, implementation=None, order=Non else: constructor = polynomial_ring.PolynomialRing_commutative implementation_names = constructor._implementation_names(implementation, base_ring, sparse) - implementation = implementation_names[0] # Only use names which are not supported by the specialized class. if specialized is not None: From c0d05352ff261585a989fa4c6469077df728b0d8 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 13 Mar 2023 13:47:51 -0700 Subject: [PATCH 04/18] src/sage/rings/polynomial/polynomial_ring.py: Add an 'implementation' keyword arg to all constructors --- src/sage/rings/polynomial/polynomial_ring.py | 27 ++++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index e9ef53942df..d51b8274d17 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -229,7 +229,8 @@ class PolynomialRing_general(ring.Algebra): Univariate polynomial ring over a ring. """ - def __init__(self, base_ring, name=None, sparse=False, element_class=None, category=None): + def __init__(self, base_ring, name=None, sparse=False, implementation=None, + element_class=None, category=None): """ EXAMPLES:: @@ -1667,7 +1668,8 @@ class PolynomialRing_commutative(PolynomialRing_general, ring.CommutativeAlgebra """ Univariate polynomial ring over a commutative ring. """ - def __init__(self, base_ring, name=None, sparse=False, element_class=None, category=None): + def __init__(self, base_ring, name=None, sparse=False, implementation=None, + element_class=None, category=None): if base_ring not in _CommutativeRings: raise TypeError("Base ring %s must be a commutative ring."%repr(base_ring)) # We trust that, if a category is given, that it is useful. @@ -2002,7 +2004,8 @@ def construction(self): class PolynomialRing_field(PolynomialRing_integral_domain, ring.PrincipalIdealDomain): - def __init__(self, base_ring, name="x", sparse=False, element_class=None, category=None): + def __init__(self, base_ring, name="x", sparse=False, implementation=None, + element_class=None, category=None): """ TESTS:: @@ -2846,7 +2849,8 @@ class PolynomialRing_cdvr(PolynomialRing_integral_domain): r""" A class for polynomial ring over complete discrete valuation rings """ - def __init__(self, base_ring, name=None, sparse=False, element_class=None, category=None): + def __init__(self, base_ring, name=None, sparse=False, implementation=None, + element_class=None, category=None): r""" TESTS:: @@ -2874,7 +2878,8 @@ class PolynomialRing_cdvf(PolynomialRing_cdvr, PolynomialRing_field): """ A class for polynomial ring over complete discrete valuation fields """ - def __init__(self, base_ring, name=None, sparse=False, element_class=None, category=None): + def __init__(self, base_ring, name=None, sparse=False, implementation=None, + element_class=None, category=None): r""" TESTS:: @@ -2902,7 +2907,7 @@ class PolynomialRing_dense_padic_ring_generic(PolynomialRing_cdvr): r""" A class for dense polynomial ring over padic rings """ - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): PolynomialRing_cdvr.__init__(self, base_ring, sparse=False, name=name, element_class=element_class, category=category) @staticmethod @@ -2929,7 +2934,7 @@ class PolynomialRing_dense_padic_field_generic(PolynomialRing_cdvf): r""" A class for dense polynomial ring over padic fields """ - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): PolynomialRing_cdvf.__init__(self, base_ring, sparse=False, name=name, element_class=element_class, category=category) @staticmethod @@ -2953,7 +2958,7 @@ def _implementation_names_impl(implementation, base_ring, sparse): class PolynomialRing_dense_padic_ring_capped_relative(PolynomialRing_dense_padic_ring_generic): - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): """ TESTS:: @@ -2973,7 +2978,7 @@ def __init__(self, base_ring, name=None, element_class=None, category=None): class PolynomialRing_dense_padic_ring_capped_absolute(PolynomialRing_dense_padic_ring_generic): - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): """ TESTS:: @@ -2992,7 +2997,7 @@ def __init__(self, base_ring, name=None, element_class=None, category=None): class PolynomialRing_dense_padic_ring_fixed_mod(PolynomialRing_dense_padic_ring_generic): - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): """ TESTS:: @@ -3012,7 +3017,7 @@ def __init__(self, base_ring, name=None, element_class=None, category=None): class PolynomialRing_dense_padic_field_capped_relative(PolynomialRing_dense_padic_field_generic): - def __init__(self, base_ring, name=None, element_class=None, category=None): + def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): """ TESTS:: From ca3f6a461e4548fd9b898a6aa6c1556fdc7939ca Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 13 Mar 2023 14:10:57 -0700 Subject: [PATCH 05/18] src/sage/rings/polynomial/polynomial_ring.py: Pass keyword 'implementation' to super __init__ --- src/sage/rings/polynomial/polynomial_ring.py | 55 +++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index d51b8274d17..44d54cf3fa7 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -1679,7 +1679,8 @@ def __init__(self, base_ring, name=None, sparse=False, implementation=None, else: category = polynomial_default_category(base_ring.category(), 1) PolynomialRing_general.__init__(self, base_ring, name=name, - sparse=sparse, element_class=element_class, category=category) + sparse=sparse, implementation=implementation, + element_class=element_class, category=category) def quotient_by_principal_ideal(self, f, names=None, **kwds): """ @@ -1828,7 +1829,8 @@ def __init__(self, base_ring, name="x", sparse=False, implementation=None, continue break PolynomialRing_commutative.__init__(self, base_ring, name=name, - sparse=sparse, element_class=element_class, category=category) + sparse=sparse, implementation=implementation, + element_class=element_class, category=category) self._has_singular = can_convert_to_singular(self) @cached_method(key=lambda self, d, q, sign, lead: (d, q, sign, tuple([x if isinstance(x, (tuple, list)) else (x, 0) for x in lead]) if isinstance(lead, (tuple, list)) else ((lead, 0)))) @@ -2063,7 +2065,8 @@ def _element_class(): from sage.rings.polynomial.polynomial_element_generic import Polynomial_generic_dense_field return Polynomial_generic_dense_field - PolynomialRing_integral_domain.__init__(self, base_ring, name=name, sparse=sparse, + PolynomialRing_integral_domain.__init__(self, base_ring, name=name, + sparse=sparse, implementation=implementation, element_class=_element_class(), category=category) def _ideal_class_(self, n=0): @@ -2469,7 +2472,7 @@ def __init__(self, base_ring, name="x", element_class=None, implementation=None) element_class = Polynomial_ZZ_pEX break PolynomialRing_field.__init__(self, base_ring, sparse=False, name=name, - element_class=element_class) + implementation=implementation, element_class=element_class) @staticmethod def _implementation_names_impl(implementation, base_ring, sparse): @@ -2871,7 +2874,9 @@ def __init__(self, base_ring, name=None, sparse=False, implementation=None, else: from sage.rings.polynomial.polynomial_element_generic import Polynomial_generic_dense_cdvr element_class = Polynomial_generic_dense_cdvr - PolynomialRing_integral_domain.__init__(self, base_ring, name, sparse, element_class=element_class, category=category) + PolynomialRing_integral_domain.__init__(self, base_ring, name, sparse, + implementation=implementation, + element_class=element_class, category=category) class PolynomialRing_cdvf(PolynomialRing_cdvr, PolynomialRing_field): @@ -2900,7 +2905,9 @@ def __init__(self, base_ring, name=None, sparse=False, implementation=None, else: from sage.rings.polynomial.polynomial_element_generic import Polynomial_generic_dense_cdvf element_class = Polynomial_generic_dense_cdvf - PolynomialRing_field.__init__(self, base_ring, name, sparse, element_class=element_class, category=category) + PolynomialRing_field.__init__(self, base_ring, name, sparse, + implementation=implementation, element_class=element_class, + category=category) class PolynomialRing_dense_padic_ring_generic(PolynomialRing_cdvr): @@ -2908,7 +2915,9 @@ class PolynomialRing_dense_padic_ring_generic(PolynomialRing_cdvr): A class for dense polynomial ring over padic rings """ def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): - PolynomialRing_cdvr.__init__(self, base_ring, sparse=False, name=name, element_class=element_class, category=category) + PolynomialRing_cdvr.__init__(self, base_ring, sparse=False, name=name, + implementation=implementation, element_class=element_class, + category=category) @staticmethod def _implementation_names_impl(implementation, base_ring, sparse): @@ -2935,7 +2944,9 @@ class PolynomialRing_dense_padic_field_generic(PolynomialRing_cdvf): A class for dense polynomial ring over padic fields """ def __init__(self, base_ring, name=None, implementation=None, element_class=None, category=None): - PolynomialRing_cdvf.__init__(self, base_ring, sparse=False, name=name, element_class=element_class, category=category) + PolynomialRing_cdvf.__init__(self, base_ring, sparse=False, name=name, + implementation=implementation, element_class=element_class, + category=category) @staticmethod def _implementation_names_impl(implementation, base_ring, sparse): @@ -2973,8 +2984,9 @@ def __init__(self, base_ring, name=None, implementation=None, element_class=None polynomial_padic_capped_relative_dense import \ Polynomial_padic_capped_relative_dense element_class = Polynomial_padic_capped_relative_dense - PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, - name=name, element_class=element_class, category=category) + PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, name=name, + implementation=implementation, + element_class=element_class, category=category) class PolynomialRing_dense_padic_ring_capped_absolute(PolynomialRing_dense_padic_ring_generic): @@ -2992,8 +3004,9 @@ def __init__(self, base_ring, name=None, implementation=None, element_class=None from sage.rings.polynomial.padics.polynomial_padic_flat import \ Polynomial_padic_flat element_class = Polynomial_padic_flat - PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, - name=name, element_class=element_class, category=category) + PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, name=name, + implementation=implementation, + element_class=element_class, category=category) class PolynomialRing_dense_padic_ring_fixed_mod(PolynomialRing_dense_padic_ring_generic): @@ -3012,8 +3025,9 @@ def __init__(self, base_ring, name=None, implementation=None, element_class=None from sage.rings.polynomial.padics.polynomial_padic_flat import \ Polynomial_padic_flat element_class = Polynomial_padic_flat - PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, - name=name, element_class=element_class, category=category) + PolynomialRing_dense_padic_ring_generic.__init__(self, base_ring, name=name, + implementation=implementation, + element_class=element_class, category=category) class PolynomialRing_dense_padic_field_capped_relative(PolynomialRing_dense_padic_field_generic): @@ -3032,8 +3046,9 @@ def __init__(self, base_ring, name=None, implementation=None, element_class=None polynomial_padic_capped_relative_dense import \ Polynomial_padic_capped_relative_dense element_class = Polynomial_padic_capped_relative_dense - PolynomialRing_dense_padic_field_generic.__init__(self, base_ring, - name=name, element_class=element_class, category=category) + PolynomialRing_dense_padic_field_generic.__init__(self, base_ring, name=name, + implementation=implementation, + element_class=element_class, category=category) class PolynomialRing_dense_mod_n(PolynomialRing_commutative): @@ -3095,8 +3110,8 @@ def __init__(self, base_ring, name=None, element_class=None, self._implementation_repr = ' (using NTL)' break - PolynomialRing_commutative.__init__(self, base_ring, name=name, - element_class=element_class, category=category) + PolynomialRing_commutative.__init__(self, base_ring, name=name, implementation=implementation, + element_class=element_class, category=category) @staticmethod def _implementation_names_impl(implementation, base_ring, sparse): @@ -3272,8 +3287,8 @@ def __init__(self, base_ring, name="x", implementation=None, element_class=None, self._implementation_repr = ' (using GF2X)' break - PolynomialRing_dense_mod_n.__init__(self, base_ring, name=name, - element_class=element_class, category=category) + PolynomialRing_dense_mod_n.__init__(self, base_ring, name=name, implementation=implementation, + element_class=element_class, category=category) self._has_singular = can_convert_to_singular(self) From 58712e2e31bd8c39764c5b49391f5204f214a80c Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 13 Mar 2023 14:11:41 -0700 Subject: [PATCH 06/18] src/sage/rings/polynomial/polynomial_ring.py: Fix setting of self._implementation_repr --- src/sage/rings/polynomial/polynomial_ring.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 44d54cf3fa7..c804370475a 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -3083,8 +3083,8 @@ def __init__(self, base_ring, name=None, element_class=None, sage: type(R.gen()) """ - self._implementation_repr = '' if element_class is None: + self._implementation_repr = '' given_implementation = implementation for implementation in self._implementation_names(implementation, base_ring): if implementation == "FLINT": From a0f6fef93781723f33f3286a7b533d496b759585 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 4 Mar 2023 10:58:08 -0800 Subject: [PATCH 07/18] Replace isinstance(..., sage.rings.number_field.number_field.NumberField_generic) outside of sage.rings.number_field --- src/sage/algebras/splitting_algebra.py | 4 ++-- src/sage/arith/misc.py | 4 ++-- src/sage/modular/dirichlet.py | 8 ++++---- src/sage/rings/complex_arb.pyx | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/sage/algebras/splitting_algebra.py b/src/sage/algebras/splitting_algebra.py index e19a2bb6d9a..d960d5d0ca0 100644 --- a/src/sage/algebras/splitting_algebra.py +++ b/src/sage/algebras/splitting_algebra.py @@ -708,8 +708,8 @@ def create_roots(monic_polynomial, warning=True): # as coercion # ------------------------------------------------------------------------------------- reset_coercion = False - from sage.rings.number_field.number_field import NumberField_generic - if isinstance(base_ring, NumberField_generic): + from sage.rings.number_field.number_field_base import NumberField + if isinstance(base_ring, NumberField): reset_coercion = True elif base_ring.is_finite() and not base_ring.is_prime_field(): reset_coercion = True diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index 8be5f952d68..e095f3e3ce6 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -555,8 +555,8 @@ def is_prime(n): R = n.parent() if R.is_field(): # number fields redefine .is_prime(), see #32340 - from sage.rings.number_field.number_field import NumberField_generic - if not isinstance(R, NumberField_generic): + from sage.rings.number_field.number_field_base import NumberField + if not isinstance(R, NumberField): import warnings s = f'Testing primality in {R}, which is a field, ' \ 'hence the result will always be False. ' diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index 47f116abdd6..792192019f8 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -60,7 +60,6 @@ import sage.misc.prandom as random import sage.modules.free_module_element as free_module_element import sage.rings.abc -import sage.rings.number_field.number_field as number_field from sage.arith.functions import lcm from sage.arith.misc import bernoulli, kronecker, factor, gcd, fundamental_discriminant, euler_phi, valuation @@ -77,7 +76,8 @@ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ -from sage.rings.number_field.number_field import CyclotomicField +from sage.rings.number_field.number_field import CyclotomicField, NumberField as NumberField_constructor +from sage.rings.number_field.number_field_base import NumberField as NumberField_base from sage.rings.power_series_ring import PowerSeriesRing from sage.rings.rational_field import RationalField, QQ, is_RationalField from sage.rings.ring import is_Ring @@ -1039,7 +1039,7 @@ def fixed_field(self): sage: psi.fixed_field() Number Field in a with defining polynomial x^5 + x^4 - 12*x^3 - 21*x^2 + x + 5 """ - return number_field.NumberField(self.fixed_field_polynomial(), 'a') + return NumberField(self.fixed_field_polynomial(), 'a') @cached_method def decomposition(self): @@ -1903,7 +1903,7 @@ def minimize_base_ring(self): K = IntegerModRing(p) elif self.order() <= 2: K = QQ - elif (isinstance(R, number_field.NumberField_generic) + elif (isinstance(R, NumberField_base) and euler_phi(self.order()) < R.absolute_degree()): K = CyclotomicField(self.order()) else: diff --git a/src/sage/rings/complex_arb.pyx b/src/sage/rings/complex_arb.pyx index 797f5122d40..c3014c9821f 100644 --- a/src/sage/rings/complex_arb.pyx +++ b/src/sage/rings/complex_arb.pyx @@ -179,6 +179,7 @@ from sage.libs.gsl.complex cimport gsl_complex_rect from sage.rings.real_double cimport RealDoubleElement from sage.rings.complex_double cimport ComplexDoubleElement from sage.rings.integer cimport Integer +from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.polynomial_complex_arb cimport Polynomial_complex_arb from sage.rings.real_arb cimport mpfi_to_arb, arb_to_mpfi from sage.rings.real_arb import RealBallField @@ -562,8 +563,7 @@ class ComplexBallField(UniqueRepresentation, sage.rings.abc.ComplexBallField): elif isinstance(other, ComplexBallField): return other._prec >= self._prec - import sage.rings.number_field.number_field as number_field - if isinstance(other, number_field.NumberField_generic): + if isinstance(other, NumberField): emb = other.coerce_embedding() return emb is not None and self.has_coerce_map_from(emb.codomain()) From a3e48e9fb62c8cf7c11aa52fe80707b770c4c336 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 00:06:45 -0700 Subject: [PATCH 08/18] sage.rings: Fix numberfield imports --- .../rings/polynomial/multi_polynomial_element.py | 12 +++++++++--- src/sage/rings/polynomial/polynomial_element.pyx | 11 ++++++++--- .../rings/polynomial/polynomial_quotient_ring.py | 4 ++-- src/sage/rings/qqbar_decorators.py | 3 ++- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/sage/rings/polynomial/multi_polynomial_element.py b/src/sage/rings/polynomial/multi_polynomial_element.py index d96e9bfb9cc..cda91523623 100644 --- a/src/sage/rings/polynomial/multi_polynomial_element.py +++ b/src/sage/rings/polynomial/multi_polynomial_element.py @@ -67,9 +67,6 @@ from sage.rings.rational_field import QQ from sage.rings.fraction_field import FractionField -from sage.rings.number_field.order import is_NumberFieldOrder -from sage.categories.number_fields import NumberFields -from sage.rings.real_mpfr import RealField class MPolynomial_element(MPolynomial): @@ -1026,8 +1023,11 @@ def global_height(self, prec=None): prec = 53 if self.is_zero(): + from sage.rings.real_mpfr import RealField return RealField(prec).zero() + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields from sage.rings.qqbar import QQbar, number_field_elements_from_algebraics K = self.base_ring() @@ -1083,6 +1083,9 @@ def local_height(self, v, prec=None): sage: f.local_height(2, prec=2) 0.75 """ + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields + if prec is None: prec = 53 @@ -1131,6 +1134,9 @@ def local_height_arch(self, i, prec=None): sage: f.local_height_arch(0, prec=2) 1.0 """ + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields + if prec is None: prec = 53 diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index 88a25eae183..f933e45a1bb 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -135,9 +135,6 @@ from sage.categories.morphism cimport Morphism from sage.misc.superseded import deprecation_cython as deprecation, deprecated_function_alias from sage.misc.cachefunc import cached_method -from sage.rings.number_field.order import is_NumberFieldOrder, Order as NumberFieldOrder -from sage.categories.number_fields import NumberFields - cpdef is_Polynomial(f): """ @@ -5832,6 +5829,8 @@ cdef class Polynomial(CommutativePolynomial): if self.is_zero(): return RealField(prec).zero() + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields from sage.rings.qqbar import QQbar, number_field_elements_from_algebraics K = self.base_ring() @@ -5887,6 +5886,9 @@ cdef class Polynomial(CommutativePolynomial): sage: f.local_height(2, prec=2) 0.75 """ + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields + if prec is None: prec = 53 @@ -5935,6 +5937,9 @@ cdef class Polynomial(CommutativePolynomial): sage: f.local_height_arch(0, prec=2) 1.0 """ + from sage.rings.number_field.order import is_NumberFieldOrder + from sage.categories.number_fields import NumberFields + if prec is None: prec = 53 diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py index ab35434ca30..ad84d1362f6 100644 --- a/src/sage/rings/polynomial/polynomial_quotient_ring.py +++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py @@ -37,7 +37,6 @@ #***************************************************************************** -import sage.rings.number_field.all from . import polynomial_element import sage.rings.rational_field import sage.rings.complex_mpfr @@ -1213,7 +1212,8 @@ def number_field(self): if not isinstance(self.base_ring(), sage.rings.rational_field.RationalField): raise NotImplementedError("Computation of number field only implemented for quotients of the polynomial ring over the rational field.") - return sage.rings.number_field.all.NumberField(self.modulus(), self.variable_name()) + from sage.rings.number_field.number_field import NumberField + return NumberField(self.modulus(), self.variable_name()) def polynomial_ring(self): """ diff --git a/src/sage/rings/qqbar_decorators.py b/src/sage/rings/qqbar_decorators.py index e18fac73cdc..1f79a55bdbe 100644 --- a/src/sage/rings/qqbar_decorators.py +++ b/src/sage/rings/qqbar_decorators.py @@ -87,7 +87,7 @@ def wrapper(*args, **kwds): from sage.rings.polynomial.multi_polynomial import MPolynomial from sage.rings.polynomial.multi_polynomial_sequence import PolynomialSequence, is_PolynomialSequence from sage.rings.ideal import Ideal, Ideal_generic - from sage.rings.qqbar import AlgebraicField_common, number_field_elements_from_algebraics + from sage.rings.abc import AlgebraicField_common if not any(isinstance(a, (Polynomial, MPolynomial, Ideal_generic)) and isinstance(a.base_ring(), AlgebraicField_common) @@ -110,6 +110,7 @@ def wrapper(*args, **kwds): # We need minimal=True if these elements are over AA, because # same_field=True might trigger an exception otherwise. + from sage.rings.qqbar import number_field_elements_from_algebraics numfield, new_elems, morphism = number_field_elements_from_algebraics(orig_elems, same_field=True, minimal=True) elem_dict = dict(zip(orig_elems, new_elems)) From 1cc6b9a50b0e1b80c2f2278ff0421def8d749cee Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 00:14:46 -0700 Subject: [PATCH 09/18] src/sage/modular/dirichlet.py: Fix up import --- src/sage/modular/dirichlet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index 792192019f8..63d10bb4f35 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -76,7 +76,7 @@ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ -from sage.rings.number_field.number_field import CyclotomicField, NumberField as NumberField_constructor +from sage.rings.number_field.number_field import CyclotomicField, NumberField from sage.rings.number_field.number_field_base import NumberField as NumberField_base from sage.rings.power_series_ring import PowerSeriesRing from sage.rings.rational_field import RationalField, QQ, is_RationalField From 340110fbe53e72e1f11faa6484c2ffe99243f007 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 00:25:59 -0700 Subject: [PATCH 10/18] Import is_NumberField from sage.rings.number_field.number_field_base --- src/sage/algebras/quatalg/quaternion_algebra.py | 2 +- src/sage/categories/pushout.py | 2 +- src/sage/rings/number_field/number_field.py | 2 +- src/sage/rings/padics/padic_valuation.py | 8 ++++---- src/sage/rings/polynomial/polynomial_element.pyx | 5 +++-- src/sage/schemes/elliptic_curves/constructor.py | 2 +- src/sage/schemes/elliptic_curves/ell_local_data.py | 2 +- src/sage/schemes/plane_conics/constructor.py | 2 +- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/sage/algebras/quatalg/quaternion_algebra.py b/src/sage/algebras/quatalg/quaternion_algebra.py index 58bc0da3d24..ad45e5a6501 100644 --- a/src/sage/algebras/quatalg/quaternion_algebra.py +++ b/src/sage/algebras/quatalg/quaternion_algebra.py @@ -46,7 +46,7 @@ from sage.rings.ideal import Ideal_fractional from sage.rings.rational_field import is_RationalField, QQ from sage.rings.infinity import infinity -from sage.rings.number_field.number_field import is_NumberField +from sage.rings.number_field.number_field_base import is_NumberField from sage.rings.power_series_ring import PowerSeriesRing from sage.structure.category_object import normalize_names from sage.structure.parent import Parent diff --git a/src/sage/categories/pushout.py b/src/sage/categories/pushout.py index 6c5b08e003a..4b9ddc42383 100644 --- a/src/sage/categories/pushout.py +++ b/src/sage/categories/pushout.py @@ -3462,7 +3462,7 @@ def merge(self, other): # nothing else helps, hence, we move to the pushout of the codomains of the embeddings try: P = pushout(self.embeddings[0].parent(), other.embeddings[0].parent()) - from sage.rings.number_field.number_field import is_NumberField + from sage.rings.number_field.number_field_base import is_NumberField if is_NumberField(P): return P.construction()[0] except CoercionException: diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index d157026ddf8..40f341b782a 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -918,7 +918,7 @@ def QuadraticField(D, name='a', check=True, embedding=True, latex_name='sqrt', * :: - sage: from sage.rings.number_field.number_field import is_NumberField + sage: from sage.rings.number_field.number_field_base import is_NumberField sage: type(K) sage: is_NumberField(K) diff --git a/src/sage/rings/padics/padic_valuation.py b/src/sage/rings/padics/padic_valuation.py index a495435493d..2178c918c92 100644 --- a/src/sage/rings/padics/padic_valuation.py +++ b/src/sage/rings/padics/padic_valuation.py @@ -122,7 +122,7 @@ def create_key_and_extra_args(self, R, prime=None, approximants=None): from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ from sage.rings.padics.padic_generic import pAdicGeneric - from sage.rings.number_field.number_field import is_NumberField + from sage.rings.number_field.number_field_base import is_NumberField from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing if R.characteristic() != 0: @@ -362,7 +362,7 @@ def _normalize_number_field_data(self, R): """ from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing - from sage.rings.number_field.number_field import is_NumberField + from sage.rings.number_field.number_field_base import is_NumberField if is_NumberField(R.fraction_field()): L = R.fraction_field() G = L.relative_polynomial() @@ -395,7 +395,7 @@ def create_object(self, version, key, **extra_args): from sage.rings.padics.padic_generic import pAdicGeneric from sage.rings.valuation.valuation_space import DiscretePseudoValuationSpace from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing - from sage.rings.number_field.number_field import is_NumberField + from sage.rings.number_field.number_field_base import is_NumberField R = key[0] parent = DiscretePseudoValuationSpace(R) if isinstance(R, pAdicGeneric): @@ -803,7 +803,7 @@ def extensions(self, ring): return self._extensions_to_quotient(ring) elif self.domain().is_subring(ring.base_ring()): return sum([w.extensions(ring) for w in self.extensions(ring.base_ring())], []) - from sage.rings.number_field.number_field import is_NumberField + from sage.rings.number_field.number_field_base import is_NumberField if is_NumberField(ring.fraction_field()): if ring.base_ring().fraction_field() is self.domain().fraction_field(): approximants = self.mac_lane_approximants(ring.fraction_field().relative_polynomial().change_ring(self.domain()), assume_squarefree=True, require_incomparability=True) diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index f933e45a1bb..99458444721 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -5261,8 +5261,6 @@ cdef class Polynomial(CommutativePolynomial): sage: (PolynomialRing(Integers(31),name='x').0+5).root_field('a') Ring of integers modulo 31 """ - from sage.rings.number_field.number_field import is_NumberField, NumberField - R = self.base_ring() if not R.is_integral_domain(): raise ValueError("the base ring must be a domain") @@ -5273,6 +5271,9 @@ cdef class Polynomial(CommutativePolynomial): if self.degree() <= 1: return R.fraction_field() + from sage.rings.number_field.number_field import NumberField + from sage.rings.number_field.number_field_base import is_NumberField + if is_IntegerRing(R): return NumberField(self, names) diff --git a/src/sage/schemes/elliptic_curves/constructor.py b/src/sage/schemes/elliptic_curves/constructor.py index d924bd8f45c..3050a0fddbb 100644 --- a/src/sage/schemes/elliptic_curves/constructor.py +++ b/src/sage/schemes/elliptic_curves/constructor.py @@ -28,7 +28,7 @@ import sage.rings.abc from sage.rings.polynomial.multi_polynomial_ring import is_MPolynomialRing from sage.rings.finite_rings.finite_field_constructor import is_FiniteField -from sage.rings.number_field.number_field import is_NumberField +from sage.rings.number_field.number_field_base import is_NumberField from sage.rings.polynomial.multi_polynomial import MPolynomial from sage.rings.ring import is_Ring diff --git a/src/sage/schemes/elliptic_curves/ell_local_data.py b/src/sage/schemes/elliptic_curves/ell_local_data.py index 541492f527e..261f6e7be4d 100644 --- a/src/sage/schemes/elliptic_curves/ell_local_data.py +++ b/src/sage/schemes/elliptic_curves/ell_local_data.py @@ -95,7 +95,7 @@ from sage.rings.integer import Integer from sage.rings.number_field.number_field_ideal import is_NumberFieldFractionalIdeal -from sage.rings.number_field.number_field import is_NumberField +from sage.rings.number_field.number_field_base import is_NumberField from sage.rings.ideal import is_Ideal from .constructor import EllipticCurve diff --git a/src/sage/schemes/plane_conics/constructor.py b/src/sage/schemes/plane_conics/constructor.py index abff2935854..61e02097c1a 100644 --- a/src/sage/schemes/plane_conics/constructor.py +++ b/src/sage/schemes/plane_conics/constructor.py @@ -37,7 +37,7 @@ from sage.rings.polynomial.multi_polynomial_ring import is_MPolynomialRing from sage.rings.fraction_field import is_FractionField -from sage.rings.number_field.number_field import is_NumberField +from sage.rings.number_field.number_field_base import is_NumberField from sage.schemes.projective.projective_space import ProjectiveSpace from sage.schemes.projective.projective_point import SchemeMorphism_point_projective_field from sage.schemes.affine.affine_point import SchemeMorphism_point_affine From 2a797cd68e87833be1dede7825ba93971dc9044b Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 00:51:52 -0700 Subject: [PATCH 11/18] Replace is_NumberField by isinstance(...) using git grep -l 'base import is_NumberField' | xargs sed -E -i.bak 's/is_NumberField\(([A-Za-z_]*(\(\))?)\)/isinstance(\1, NumberField)/;s/base import is_NumberField/base import NumberField/' --- .../algebras/quatalg/quaternion_algebra.py | 4 +-- src/sage/categories/pushout.py | 4 +-- src/sage/matrix/matrix2.pyx | 6 ++-- src/sage/modular/modsym/space.py | 4 +-- src/sage/rings/morphism.pyx | 6 ++-- src/sage/rings/number_field/number_field.py | 6 ++-- .../rings/number_field/number_field_base.pyx | 8 ++--- .../number_field/number_field_element.pyx | 8 ++--- .../rings/number_field/number_field_rel.py | 4 +-- src/sage/rings/padics/padic_valuation.py | 10 +++--- .../rings/polynomial/polynomial_element.pyx | 8 ++--- .../polynomial/polynomial_quotient_ring.py | 4 +-- src/sage/rings/polynomial/polynomial_ring.py | 4 +-- src/sage/rings/rational.pyx | 8 ++--- src/sage/rings/real_arb.pyx | 4 +-- src/sage/schemes/elliptic_curves/Qcurves.py | 2 +- .../schemes/elliptic_curves/constructor.py | 4 +-- src/sage/schemes/elliptic_curves/ell_field.py | 2 +- .../schemes/elliptic_curves/ell_local_data.py | 4 +-- src/sage/schemes/elliptic_curves/height.py | 4 +-- .../elliptic_curves/isogeny_small_degree.py | 36 +++++++++---------- src/sage/schemes/plane_conics/constructor.py | 4 +-- 22 files changed, 72 insertions(+), 72 deletions(-) diff --git a/src/sage/algebras/quatalg/quaternion_algebra.py b/src/sage/algebras/quatalg/quaternion_algebra.py index ad45e5a6501..aabccc80d3d 100644 --- a/src/sage/algebras/quatalg/quaternion_algebra.py +++ b/src/sage/algebras/quatalg/quaternion_algebra.py @@ -46,7 +46,7 @@ from sage.rings.ideal import Ideal_fractional from sage.rings.rational_field import is_RationalField, QQ from sage.rings.infinity import infinity -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.power_series_ring import PowerSeriesRing from sage.structure.category_object import normalize_names from sage.structure.parent import Parent @@ -657,7 +657,7 @@ def __init__(self, base_ring, a, b, names='i,j,k'): self._b = b if is_RationalField(base_ring) and a.denominator() == 1 == b.denominator(): self.Element = QuaternionAlgebraElement_rational_field - elif (is_NumberField(base_ring) and base_ring.degree() > 2 and base_ring.is_absolute() and + elif (isinstance(base_ring, NumberField) and base_ring.degree() > 2 and base_ring.is_absolute() and a.denominator() == 1 == b.denominator() and base_ring.defining_polynomial().is_monic()): # This QuaternionAlgebraElement_number_field class is not # designed to work with elements of a quadratic field. To diff --git a/src/sage/categories/pushout.py b/src/sage/categories/pushout.py index 4b9ddc42383..cbeb1f30cb0 100644 --- a/src/sage/categories/pushout.py +++ b/src/sage/categories/pushout.py @@ -3462,8 +3462,8 @@ def merge(self, other): # nothing else helps, hence, we move to the pushout of the codomains of the embeddings try: P = pushout(self.embeddings[0].parent(), other.embeddings[0].parent()) - from sage.rings.number_field.number_field_base import is_NumberField - if is_NumberField(P): + from sage.rings.number_field.number_field_base import NumberField + if isinstance(P, NumberField): return P.construction()[0] except CoercionException: return None diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx index 3f022f421ee..24f06ae3c52 100644 --- a/src/sage/matrix/matrix2.pyx +++ b/src/sage/matrix/matrix2.pyx @@ -89,7 +89,7 @@ from sage.misc.verbose import verbose, get_verbose from sage.categories.fields import Fields from sage.categories.integral_domains import IntegralDomains from sage.rings.ring import is_Ring -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.integer_ring import ZZ, is_IntegerRing from sage.rings.integer import Integer from sage.rings.rational_field import QQ, is_RationalField @@ -4457,7 +4457,7 @@ cdef class Matrix(Matrix1): raise ValueError("'padic' matrix kernel algorithm only available over the rationals and the integers, not over %s" % R) elif algorithm == 'flint' and not (is_IntegerRing(R) or is_RationalField(R)): raise ValueError("'flint' matrix kernel algorithm only available over the rationals and the integers, not over %s" % R) - elif algorithm == 'pari' and not (is_IntegerRing(R) or (is_NumberField(R) and not is_RationalField(R))): + elif algorithm == 'pari' and not (is_IntegerRing(R) or (isinstance(R, NumberField) and not is_RationalField(R))): raise ValueError("'pari' matrix kernel algorithm only available over non-trivial number fields and the integers, not over %s" % R) elif algorithm == 'generic' and R not in _Fields: raise ValueError("'generic' matrix kernel algorithm only available over a field, not over %s" % R) @@ -4514,7 +4514,7 @@ cdef class Matrix(Matrix1): except AttributeError: pass - if M is None and is_NumberField(R): + if M is None and isinstance(R, NumberField): format, M = self._right_kernel_matrix_over_number_field() if M is None and R in _Fields: diff --git a/src/sage/modular/modsym/space.py b/src/sage/modular/modsym/space.py index 273ba7eed8d..9297b4d4313 100644 --- a/src/sage/modular/modsym/space.py +++ b/src/sage/modular/modsym/space.py @@ -35,7 +35,7 @@ from sage.rings.integer_ring import ZZ from sage.rings.integer import Integer from sage.rings.infinity import infinity -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.power_series_ring import PowerSeriesRing from sage.rings.rational_field import QQ from sage.structure.all import Sequence, SageObject @@ -1046,7 +1046,7 @@ def _q_expansion_module_rational(self, prec): if not self.is_cuspidal(): raise ValueError("self must be cuspidal") K = self.base_ring() - if not is_NumberField(K): + if not isinstance(K, NumberField): raise TypeError("self must be over QQ or a number field.") n = K.degree() if n == 1: diff --git a/src/sage/rings/morphism.pyx b/src/sage/rings/morphism.pyx index f7f83974425..807d35362dd 100644 --- a/src/sage/rings/morphism.pyx +++ b/src/sage/rings/morphism.pyx @@ -3161,7 +3161,7 @@ def _tensor_product_ring(B, A): ValueError: term ordering must be global """ from .finite_rings.finite_field_base import is_FiniteField - from .number_field.number_field_base import is_NumberField + from .number_field.number_field_base import NumberField from .polynomial.multi_polynomial_ring import is_MPolynomialRing from .polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing from .polynomial.polynomial_ring import is_PolynomialRing @@ -3178,7 +3178,7 @@ def _tensor_product_ring(B, A): def term_order(A): # univariate rings do not have a term order if (is_PolynomialRing(A) or is_PolynomialQuotientRing(A) - or ((is_NumberField(A) or is_FiniteField(A)) + or ((isinstance(A, NumberField) or is_FiniteField(A)) and not A.is_prime_field())): return TermOrder('lex', 1) try: @@ -3201,7 +3201,7 @@ def _tensor_product_ring(B, A): elif is_QuotientRing(A): to_R = A.ambient().hom(R_gens_A, R, check=False) return list(to_R(A.defining_ideal()).gens()) - elif ((is_NumberField(A) or is_FiniteField(A)) + elif ((isinstance(A, NumberField) or is_FiniteField(A)) and not A.is_prime_field()): to_R = A.polynomial_ring().hom(R_gens_A, R, check=False) return [to_R(A.polynomial())] diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 40f341b782a..ae12cadcffe 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -918,10 +918,10 @@ def QuadraticField(D, name='a', check=True, embedding=True, latex_name='sqrt', * :: - sage: from sage.rings.number_field.number_field_base import is_NumberField + sage: from sage.rings.number_field.number_field_base import NumberField sage: type(K) - sage: is_NumberField(K) + sage: isinstance(K, NumberField) True Quadratic number fields are cached:: @@ -8308,7 +8308,7 @@ def _coerce_map_from_(self, R): if is_NumberFieldOrder(R) and self.has_coerce_map_from(R.number_field()): return self._generic_coerce_map(R) # R is not QQ by the above tests - if is_NumberField(R) and R.coerce_embedding() is not None: + if isinstance(R, NumberField) and R.coerce_embedding() is not None: if self.coerce_embedding() is not None: try: return number_field_morphisms.EmbeddedNumberFieldMorphism(R, self) diff --git a/src/sage/rings/number_field/number_field_base.pyx b/src/sage/rings/number_field/number_field_base.pyx index 26d09cf9ed3..fd12fc10b9e 100644 --- a/src/sage/rings/number_field/number_field_base.pyx +++ b/src/sage/rings/number_field/number_field_base.pyx @@ -9,13 +9,13 @@ TESTS:: """ -def is_NumberField(x): +def isinstance(x, NumberField): """ Return True if x is of number field type. EXAMPLES:: - sage: from sage.rings.number_field.number_field_base import is_NumberField + sage: from sage.rings.number_field.number_field_base import NumberField sage: is_NumberField(NumberField(x^2+1,'a')) True sage: is_NumberField(QuadraticField(-97,'theta')) @@ -25,9 +25,9 @@ def is_NumberField(x): Note that the rational numbers QQ are a number field.:: - sage: is_NumberField(QQ) + sage: isinstance(QQ, NumberField) True - sage: is_NumberField(ZZ) + sage: isinstance(ZZ, NumberField) False """ return isinstance(x, NumberField) diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 1d296d46928..a4a843688fd 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -1664,8 +1664,8 @@ cdef class NumberFieldElement(FieldElement): return self.is_norm(L, element=True, proof=proof)[0] K = self.parent() - from sage.rings.number_field.number_field_base import is_NumberField - if not is_NumberField(L): + from sage.rings.number_field.number_field_base import NumberField + if not isinstance(L, NumberField): raise ValueError("L (=%s) must be a NumberField in is_norm" % L) from sage.rings.number_field.number_field import is_AbsoluteNumberField @@ -3804,8 +3804,8 @@ cdef class NumberFieldElement(FieldElement): if base is self.parent(): return MatrixSpace(base,1)([self]) if base is not None and base is not self.base_ring(): - from sage.rings.number_field.number_field_base import is_NumberField - if is_NumberField(base): + from sage.rings.number_field.number_field_base import NumberField + if isinstance(base, NumberField): return self._matrix_over_base(base) else: return self._matrix_over_base_morphism(base) diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py index 8ecb87fce28..35a519b9272 100644 --- a/src/sage/rings/number_field/number_field_rel.py +++ b/src/sage/rings/number_field/number_field_rel.py @@ -93,7 +93,7 @@ from .number_field import (NumberField, NumberField_generic, put_natural_embedding_first, proof_flag, is_NumberFieldHomsetCodomain) -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.number_field.order import (RelativeOrder, is_NumberFieldOrder, relative_order_from_ring_generators) from sage.rings.number_field.morphism import RelativeNumberFieldHomomorphism_from_abs @@ -277,7 +277,7 @@ def __init__(self, base, polynomial, name, raise NotImplementedError("Embeddings not implemented for relative number fields") if names is not None: name = names - if not is_NumberField(base): + if not isinstance(base, NumberField): raise TypeError("base (=%s) must be a number field"%base) if not isinstance(polynomial, polynomial_element.Polynomial): try: diff --git a/src/sage/rings/padics/padic_valuation.py b/src/sage/rings/padics/padic_valuation.py index 2178c918c92..a820dd75aa8 100644 --- a/src/sage/rings/padics/padic_valuation.py +++ b/src/sage/rings/padics/padic_valuation.py @@ -122,7 +122,7 @@ def create_key_and_extra_args(self, R, prime=None, approximants=None): from sage.rings.integer_ring import ZZ from sage.rings.rational_field import QQ from sage.rings.padics.padic_generic import pAdicGeneric - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing if R.characteristic() != 0: @@ -362,7 +362,7 @@ def _normalize_number_field_data(self, R): """ from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField if is_NumberField(R.fraction_field()): L = R.fraction_field() G = L.relative_polynomial() @@ -395,7 +395,7 @@ def create_object(self, version, key, **extra_args): from sage.rings.padics.padic_generic import pAdicGeneric from sage.rings.valuation.valuation_space import DiscretePseudoValuationSpace from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField R = key[0] parent = DiscretePseudoValuationSpace(R) if isinstance(R, pAdicGeneric): @@ -410,7 +410,7 @@ def create_object(self, version, key, **extra_args): approximants = extra_args['approximants'] parent = DiscretePseudoValuationSpace(R) K = R.fraction_field() - if is_NumberField(K): + if isinstance(K, NumberField): G = K.relative_polynomial() elif is_PolynomialQuotientRing(R): G = R.modulus() @@ -803,7 +803,7 @@ def extensions(self, ring): return self._extensions_to_quotient(ring) elif self.domain().is_subring(ring.base_ring()): return sum([w.extensions(ring) for w in self.extensions(ring.base_ring())], []) - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField if is_NumberField(ring.fraction_field()): if ring.base_ring().fraction_field() is self.domain().fraction_field(): approximants = self.mac_lane_approximants(ring.fraction_field().relative_polynomial().change_ring(self.domain()), assume_squarefree=True, require_incomparability=True) diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index 99458444721..2d41c9430b0 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -4751,7 +4751,7 @@ cdef class Polynomial(CommutativePolynomial): raise TypeError("You must specify the name of the generator.") name = normalize_names(1, names)[0] - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField from sage.rings.finite_rings.finite_field_base import is_FiniteField f = self.monic() # Given polynomial, made monic @@ -4760,7 +4760,7 @@ cdef class Polynomial(CommutativePolynomial): F = F.fraction_field() f = self.change_ring(F) - if is_NumberField(F): + if isinstance(F, NumberField): from sage.rings.number_field.splitting_field import splitting_field return splitting_field(f, name, map, **kwds) elif is_FiniteField(F): @@ -5272,12 +5272,12 @@ cdef class Polynomial(CommutativePolynomial): return R.fraction_field() from sage.rings.number_field.number_field import NumberField - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField if is_IntegerRing(R): return NumberField(self, names) - if sage.rings.rational_field.is_RationalField(R) or is_NumberField(R): + if sage.rings.rational_field.is_RationalField(R) or isinstance(R, NumberField): return NumberField(self, names) return R.fraction_field()[self._parent.variable_name()].quotient(self, names) diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py index ad84d1362f6..d378de2b156 100644 --- a/src/sage/rings/polynomial/polynomial_quotient_ring.py +++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py @@ -1296,9 +1296,9 @@ def _S_decomposition(self, S): sage: len(iso_classes[1][1]) 2 """ - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField K = self.base_ring() - if not is_NumberField(K) or not self.__polynomial.is_squarefree(): + if not isinstance(K, NumberField) or not self.__polynomial.is_squarefree(): raise NotImplementedError from sage.rings.ideal import is_Ideal diff --git a/src/sage/rings/polynomial/polynomial_ring.py b/src/sage/rings/polynomial/polynomial_ring.py index 74e6b061a09..832014cd49d 100644 --- a/src/sage/rings/polynomial/polynomial_ring.py +++ b/src/sage/rings/polynomial/polynomial_ring.py @@ -154,7 +154,7 @@ from sage.rings.rational_field import QQ from sage.rings.integer_ring import ZZ from sage.rings.integer import Integer -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.libs.pari.all import pari_gen from sage.rings.polynomial.polynomial_ring_constructor import polynomial_default_category @@ -2021,7 +2021,7 @@ def __init__(self, base_ring, name="x", sparse=False, element_class=None, catego elif isinstance(base_ring, rational_field.RationalField): from sage.rings.polynomial.polynomial_rational_flint import Polynomial_rational_flint element_class = Polynomial_rational_flint - elif is_NumberField(base_ring): + elif isinstance(base_ring, NumberField): if base_ring.is_absolute(): from sage.rings.polynomial.polynomial_number_field import Polynomial_absolute_number_field_dense element_class = Polynomial_absolute_number_field_dense diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index 72ee560677c..b1605651e3b 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -1469,8 +1469,8 @@ cdef class Rational(sage.structure.element.FieldElement): if not element: return self.is_norm(L, element=True, proof=proof)[0] - from sage.rings.number_field.number_field_base import is_NumberField - if not is_NumberField(L): + from sage.rings.number_field.number_field_base import NumberField + if not isinstance(L, NumberField): raise ValueError("L (=%s) must be a NumberField in is_norm" % L) if L.degree() == 1 or self.is_zero(): return True, L(self) @@ -1551,8 +1551,8 @@ cdef class Rational(sage.structure.element.FieldElement): - Marco Streng (2010-12-03) """ - from sage.rings.number_field.number_field_base import is_NumberField - if not is_NumberField(K): + from sage.rings.number_field.number_field_base import NumberField + if not isinstance(K, NumberField): raise ValueError("K must be a NumberField in bnfisnorm") a, b = K.pari_bnf(proof=proof).bnfisnorm(self, flag=extra_primes) diff --git a/src/sage/rings/real_arb.pyx b/src/sage/rings/real_arb.pyx index 23a41c2bf6a..9730462dfa7 100644 --- a/src/sage/rings/real_arb.pyx +++ b/src/sage/rings/real_arb.pyx @@ -492,8 +492,8 @@ class RealBallField(UniqueRepresentation, sage.rings.abc.RealBallField): if other in [AA, RLF]: return True - from sage.rings.number_field.number_field_base import is_NumberField - if is_NumberField(other): + from sage.rings.number_field.number_field_base import NumberField + if isinstance(other, NumberField): emb = other.coerce_embedding() return emb is not None and self.has_coerce_map_from(emb.codomain()) diff --git a/src/sage/schemes/elliptic_curves/Qcurves.py b/src/sage/schemes/elliptic_curves/Qcurves.py index 4c9e8f3718a..ebd1e14765f 100644 --- a/src/sage/schemes/elliptic_curves/Qcurves.py +++ b/src/sage/schemes/elliptic_curves/Qcurves.py @@ -204,7 +204,7 @@ def is_Q_curve(E, maxp=100, certificate=False, verbose=False): TypeError: Elliptic Curve defined by ... must be an elliptic curve defined over a number field """ - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField if verbose: print(f"Checking whether {E} is a Q-curve") diff --git a/src/sage/schemes/elliptic_curves/constructor.py b/src/sage/schemes/elliptic_curves/constructor.py index 3050a0fddbb..0bd93554065 100644 --- a/src/sage/schemes/elliptic_curves/constructor.py +++ b/src/sage/schemes/elliptic_curves/constructor.py @@ -28,7 +28,7 @@ import sage.rings.abc from sage.rings.polynomial.multi_polynomial_ring import is_MPolynomialRing from sage.rings.finite_rings.finite_field_constructor import is_FiniteField -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.multi_polynomial import MPolynomial from sage.rings.ring import is_Ring @@ -471,7 +471,7 @@ def create_object(self, version, key, **kwds): if R is rings.QQ: from .ell_rational_field import EllipticCurve_rational_field return EllipticCurve_rational_field(x, **kwds) - elif is_NumberField(R): + elif isinstance(R, NumberField): from .ell_number_field import EllipticCurve_number_field return EllipticCurve_number_field(R, x) elif isinstance(R, sage.rings.abc.pAdicField): diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 107e0669da2..189d23fb291 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1871,7 +1871,7 @@ def compute_model(E, name): raise TypeError('not an elliptic curve') if name == 'minimal': - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField if not is_NumberField(E.base_field()): raise ValueError('can only compute minimal model for curves over number fields') return E.global_minimal_model(semi_global=True) diff --git a/src/sage/schemes/elliptic_curves/ell_local_data.py b/src/sage/schemes/elliptic_curves/ell_local_data.py index 261f6e7be4d..ff0847d871e 100644 --- a/src/sage/schemes/elliptic_curves/ell_local_data.py +++ b/src/sage/schemes/elliptic_curves/ell_local_data.py @@ -95,7 +95,7 @@ from sage.rings.integer import Integer from sage.rings.number_field.number_field_ideal import is_NumberFieldFractionalIdeal -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.rings.ideal import is_Ideal from .constructor import EllipticCurve @@ -1145,7 +1145,7 @@ def check_prime(K, P): else: raise TypeError("%s is neither an element of QQ or an ideal of %s" % (P, ZZ)) - if not is_NumberField(K): + if not isinstance(K, NumberField): raise TypeError("%s is not a number field" % (K,)) if is_NumberFieldFractionalIdeal(P) or P in K: diff --git a/src/sage/schemes/elliptic_curves/height.py b/src/sage/schemes/elliptic_curves/height.py index 019dd555941..929eb056b35 100644 --- a/src/sage/schemes/elliptic_curves/height.py +++ b/src/sage/schemes/elliptic_curves/height.py @@ -801,9 +801,9 @@ def __init__(self, E): from sage.schemes.elliptic_curves.ell_generic import is_EllipticCurve if is_EllipticCurve(E): self.E = E - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField K = E.base_ring() - if is_NumberField(K): + if isinstance(K, NumberField): self.K = K else: raise ValueError("EllipticCurveCanonicalHeight class can only be created from an elliptic curve defined over a number field") diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py index 65cbbc29a35..e4021853481 100644 --- a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py +++ b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py @@ -321,8 +321,8 @@ def isogenies_prime_degree_genus_0(E, l=None, minimal_models=True): kernels = [ker.monic() for ker in kernels] E1 = EllipticCurve([-27*c4,-54*c6]) w = E.isomorphism_to(E1) - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None isogs = [E1.isogeny(kernel=ker, model=model) for ker in kernels] isogs = [isog * w for isog in isogs] return isogs @@ -657,8 +657,8 @@ def isogenies_sporadic_Q(E, l=None, minimal_models=True): R = PolynomialRing(F, 'X') n = len(f) ker = R([d**(n-i-1) * f[i] for i in range(n)]) - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None isog = Ew.isogeny(kernel=ker, degree=l, model=model, check=False) isog = isog * E_to_Ew return [isog] @@ -703,7 +703,7 @@ def isogenies_2(E, minimal_models=True): x2 = sorted(f2.roots(multiplicities=False)) x = f2.parent().gen() ff = [x-x2i for x2i in x2] - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField model = "minimal" if minimal_models and is_NumberField(E.base_field()) else None isogs = [E.isogeny(f, model=model) for f in ff] return isogs @@ -751,7 +751,7 @@ def isogenies_3(E, minimal_models=True): x3 = sorted(f3.roots(multiplicities=False)) x = f3.parent().gen() ff = [x - x3i for x3i in x3] - from sage.rings.number_field.number_field_base import is_NumberField + from sage.rings.number_field.number_field_base import NumberField model = "minimal" if minimal_models and is_NumberField(E.base_field()) else None isogs = [E.isogeny(f, model=model) for f in ff] return isogs @@ -818,8 +818,8 @@ def isogenies_5_0(E, minimal_models=True): if not betas: return [] gammas = [(beta**2 *(beta**3-140*a))/(120*a) for beta in betas] - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None isogs = [Ew.isogeny(x**2+beta*x+gamma, model=model) for beta,gamma in zip(betas,gammas)] iso = E.isomorphism_to(Ew) isogs = [isog * iso for isog in isogs] @@ -904,8 +904,8 @@ def isogenies_5_1728(E, minimal_models=True): raise ValueError("j-invariant must be 1728.") if F.characteristic() in [2,3,5]: raise NotImplementedError("Not implemented in characteristic 2, 3 or 5.") - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None # quick test for a negative answer (from Fricke module) square5 = F(5).is_square() square1 = F(-1).is_square() @@ -1017,8 +1017,8 @@ def isogenies_7_0(E, minimal_models=True): Ew = E.short_weierstrass_model() iso = E.isomorphism_to(Ew) a = Ew.a6() - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None # there will be 2 endomorphisms if -3 is a square: @@ -1115,8 +1115,8 @@ def isogenies_7_1728(E, minimal_models=True): return [] ts.sort() isogs = [] - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None x = polygen(F) for t0 in ts: s2 = a/t0 @@ -1216,8 +1216,8 @@ def isogenies_13_0(E, minimal_models=True): Ew = E.short_weierstrass_model() iso = E.isomorphism_to(Ew) a = Ew.a6() - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None x = polygen(F) # there will be 2 endomorphisms if -3 is a square: @@ -1334,8 +1334,8 @@ def isogenies_13_1728(E, minimal_models=True): Ew = E.short_weierstrass_model() iso = E.isomorphism_to(Ew) a = Ew.a4() - from sage.rings.number_field.number_field_base import is_NumberField - model = "minimal" if minimal_models and is_NumberField(F) else None + from sage.rings.number_field.number_field_base import NumberField + model = "minimal" if minimal_models and isinstance(F, NumberField) else None x = polygen(F) # we will have two endomorphisms if -1 is a square: diff --git a/src/sage/schemes/plane_conics/constructor.py b/src/sage/schemes/plane_conics/constructor.py index 61e02097c1a..af2134652a9 100644 --- a/src/sage/schemes/plane_conics/constructor.py +++ b/src/sage/schemes/plane_conics/constructor.py @@ -37,7 +37,7 @@ from sage.rings.polynomial.multi_polynomial_ring import is_MPolynomialRing from sage.rings.fraction_field import is_FractionField -from sage.rings.number_field.number_field_base import is_NumberField +from sage.rings.number_field.number_field_base import NumberField from sage.schemes.projective.projective_space import ProjectiveSpace from sage.schemes.projective.projective_point import SchemeMorphism_point_projective_field from sage.schemes.affine.affine_point import SchemeMorphism_point_affine @@ -237,7 +237,7 @@ def Conic(base_field, F=None, names=None, unique=True): return ProjectiveConic_finite_field(P2, F) if is_RationalField(base_field): return ProjectiveConic_rational_field(P2, F) - if is_NumberField(base_field): + if isinstance(base_field, NumberField): return ProjectiveConic_number_field(P2, F) if is_FractionField(base_field) and (is_PolynomialRing(base_field.ring()) or is_MPolynomialRing(base_field.ring())): return ProjectiveConic_rational_function_field(P2, F) From 9d6948b874b931a2bd1b41c9d58fd5153777f2bd Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 00:59:24 -0700 Subject: [PATCH 12/18] Replace remaining uses of is_NumberField by isinstance(...) --- src/sage/categories/number_fields.py | 4 ++-- src/sage/rings/padics/padic_valuation.py | 6 +++--- src/sage/rings/polynomial/polynomial_singular_interface.py | 7 ++++--- src/sage/schemes/elliptic_curves/Qcurves.py | 2 +- src/sage/schemes/elliptic_curves/ell_field.py | 2 +- src/sage/schemes/elliptic_curves/isogeny_small_degree.py | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/sage/categories/number_fields.py b/src/sage/categories/number_fields.py index c29e4c57255..8386ea03912 100644 --- a/src/sage/categories/number_fields.py +++ b/src/sage/categories/number_fields.py @@ -89,8 +89,8 @@ def __contains__(self, x): sage: ZZ in NumberFields() False """ - import sage.rings.number_field.number_field_base - return sage.rings.number_field.number_field_base.is_NumberField(x) + from sage.rings.number_field.number_field_base import NumberField + return isinstance(x, NumberField) def _call_(self, x): r""" diff --git a/src/sage/rings/padics/padic_valuation.py b/src/sage/rings/padics/padic_valuation.py index a820dd75aa8..e1be8472585 100644 --- a/src/sage/rings/padics/padic_valuation.py +++ b/src/sage/rings/padics/padic_valuation.py @@ -133,7 +133,7 @@ def create_key_and_extra_args(self, R, prime=None, approximants=None): return self.create_key_for_integers(R, prime), {} elif isinstance(R, pAdicGeneric): return self.create_key_for_local_ring(R, prime), {} - elif is_NumberField(R.fraction_field()) or is_PolynomialQuotientRing(R): + elif isinstance(R.fraction_field(), NumberField) or is_PolynomialQuotientRing(R): return self.create_key_and_extra_args_for_number_field(R, prime, approximants=approximants) else: raise NotImplementedError("p-adic valuations not implemented for %r"%(R,)) @@ -363,7 +363,7 @@ def _normalize_number_field_data(self, R): """ from sage.rings.polynomial.polynomial_quotient_ring import is_PolynomialQuotientRing from sage.rings.number_field.number_field_base import NumberField - if is_NumberField(R.fraction_field()): + if isinstance(R.fraction_field(), NumberField): L = R.fraction_field() G = L.relative_polynomial() K = L.base_ring() @@ -804,7 +804,7 @@ def extensions(self, ring): elif self.domain().is_subring(ring.base_ring()): return sum([w.extensions(ring) for w in self.extensions(ring.base_ring())], []) from sage.rings.number_field.number_field_base import NumberField - if is_NumberField(ring.fraction_field()): + if isinstance(ring.fraction_field(), NumberField): if ring.base_ring().fraction_field() is self.domain().fraction_field(): approximants = self.mac_lane_approximants(ring.fraction_field().relative_polynomial().change_ring(self.domain()), assume_squarefree=True, require_incomparability=True) return [pAdicValuation(ring, approximant, approximants) for approximant in approximants] diff --git a/src/sage/rings/polynomial/polynomial_singular_interface.py b/src/sage/rings/polynomial/polynomial_singular_interface.py index 2b5bfd4bf94..ff0f4b80606 100644 --- a/src/sage/rings/polynomial/polynomial_singular_interface.py +++ b/src/sage/rings/polynomial/polynomial_singular_interface.py @@ -46,6 +46,7 @@ from sage.rings.function_field.function_field import RationalFunctionField from sage.rings.finite_rings.finite_field_base import is_FiniteField from sage.rings.integer_ring import ZZ +from sage.rings.number_field.number_field_base import NumberField import sage.rings.finite_rings.finite_field_constructor @@ -121,7 +122,7 @@ def _do_singular_init_(singular, base_ring, char, _vars, order): return R, minpoly - elif number_field.number_field_base.is_NumberField(base_ring) and base_ring.is_absolute(): + elif isinstance(base_ring, NumberField) and base_ring.is_absolute(): # not the rationals! gen = str(base_ring.gen()) poly = base_ring.polynomial() @@ -334,7 +335,7 @@ def _singular_(self, singular=singular): if self.base_ring() is ZZ or self.base_ring().is_prime_field(): return R if sage.rings.finite_rings.finite_field_constructor.is_FiniteField(self.base_ring()) or \ - (number_field.number_field_base.is_NumberField(self.base_ring()) and self.base_ring().is_absolute()): + (isinstance(self.base_ring(), NumberField) and self.base_ring().is_absolute()): R.set_ring() # sorry for that, but needed for minpoly if singular.eval('minpoly') != f"({self.__minpoly})": singular.eval(f"minpoly={self.__minpoly}") @@ -429,7 +430,7 @@ def can_convert_to_singular(R): return True elif sage.rings.finite_rings.finite_field_constructor.is_FiniteField(base_ring): return base_ring.characteristic() <= 2147483647 - elif number_field.number_field_base.is_NumberField(base_ring): + elif isinstance(base_ring, NumberField): return base_ring.is_absolute() elif sage.rings.fraction_field.is_FractionField(base_ring): B = base_ring.base_ring() diff --git a/src/sage/schemes/elliptic_curves/Qcurves.py b/src/sage/schemes/elliptic_curves/Qcurves.py index ebd1e14765f..d526915ac3f 100644 --- a/src/sage/schemes/elliptic_curves/Qcurves.py +++ b/src/sage/schemes/elliptic_curves/Qcurves.py @@ -210,7 +210,7 @@ def is_Q_curve(E, maxp=100, certificate=False, verbose=False): print(f"Checking whether {E} is a Q-curve") try: - assert is_NumberField(E.base_field()) + assert isinstance(E.base_field(), NumberField) except (AttributeError, AssertionError): raise TypeError(f"{E} must be an elliptic curve defined over a number field") diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 189d23fb291..179ba94889d 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -1872,7 +1872,7 @@ def compute_model(E, name): if name == 'minimal': from sage.rings.number_field.number_field_base import NumberField - if not is_NumberField(E.base_field()): + if not isinstance(E.base_field(), NumberField): raise ValueError('can only compute minimal model for curves over number fields') return E.global_minimal_model(semi_global=True) diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py index e4021853481..8f740751da4 100644 --- a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py +++ b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py @@ -704,7 +704,7 @@ def isogenies_2(E, minimal_models=True): x = f2.parent().gen() ff = [x-x2i for x2i in x2] from sage.rings.number_field.number_field_base import NumberField - model = "minimal" if minimal_models and is_NumberField(E.base_field()) else None + model = "minimal" if minimal_models and isinstance(E.base_field(), NumberField) else None isogs = [E.isogeny(f, model=model) for f in ff] return isogs @@ -752,7 +752,7 @@ def isogenies_3(E, minimal_models=True): x = f3.parent().gen() ff = [x - x3i for x3i in x3] from sage.rings.number_field.number_field_base import NumberField - model = "minimal" if minimal_models and is_NumberField(E.base_field()) else None + model = "minimal" if minimal_models and isinstance(E.base_field(), NumberField) else None isogs = [E.isogeny(f, model=model) for f in ff] return isogs From 3c0ff68a39b2243e33300abfaa2e2f7b86e277d0 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 01:09:24 -0700 Subject: [PATCH 13/18] src/sage/rings/number_field/number_field_base.pyx: Repair and deprecate is_NumberField --- .../rings/number_field/number_field_base.pyx | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/sage/rings/number_field/number_field_base.pyx b/src/sage/rings/number_field/number_field_base.pyx index fd12fc10b9e..dd9a8b9d550 100644 --- a/src/sage/rings/number_field/number_field_base.pyx +++ b/src/sage/rings/number_field/number_field_base.pyx @@ -9,31 +9,43 @@ TESTS:: """ -def isinstance(x, NumberField): +def is_NumberField(x): """ - Return True if x is of number field type. + Return True if ``x`` is of number field type. + + This function is deprecated. EXAMPLES:: - sage: from sage.rings.number_field.number_field_base import NumberField - sage: is_NumberField(NumberField(x^2+1,'a')) + sage: from sage.rings.number_field.number_field_base import is_NumberField + sage: is_NumberField(NumberField(x^2 + 1, 'a')) + doctest:...: DeprecationWarning: the function is_NumberField is deprecated; use + isinstance(x, sage.rings.number_field.number_field_base.NumberField) instead + See https://github.com/sagemath/sage/issues/35283 for details. True - sage: is_NumberField(QuadraticField(-97,'theta')) + sage: is_NumberField(QuadraticField(-97, 'theta')) True sage: is_NumberField(CyclotomicField(97)) True - Note that the rational numbers QQ are a number field.:: + Note that the rational numbers ``QQ`` are a number field.:: - sage: isinstance(QQ, NumberField) + sage: is_NumberField(QQ) True - sage: isinstance(ZZ, NumberField) + sage: is_NumberField(ZZ) False """ + from sage.misc.superseded import deprecation + deprecation(35283, + "the function is_NumberField is deprecated; use " + "isinstance(x, sage.rings.number_field.number_field_base.NumberField) instead") + return isinstance(x, NumberField) + from sage.rings.ring cimport Field + cdef class NumberField(Field): r""" Base class for all number fields. From 012e16fad02f019afcca402d6506e93a18731108 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 11:31:16 -0700 Subject: [PATCH 14/18] src/sage/rings/polynomial/polynomial_element.pyx: Use sage.rings.abc.Order --- src/sage/rings/polynomial/polynomial_element.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index 2d41c9430b0..a6c605cf8a3 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -5109,7 +5109,7 @@ cdef class Polynomial(CommutativePolynomial): y = self._parent.quo(self).gen() from sage.groups.generic import order_from_multiple return n == order_from_multiple(y, n, n_prime_divs, operation="*") - elif isinstance(R, NumberFieldOrder): + elif isinstance(R, sage.rings.abc.Order): K = R.number_field() return K.fractional_ideal(self.coefficients()) == K.fractional_ideal(1) else: From 0eb6c59ffde3a5676fb6130e81cb249c78a15526 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 14:34:28 -0700 Subject: [PATCH 15/18] src/sage/rings/number_field/number_field.py: Fix isinstance --- src/sage/rings/number_field/number_field.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index ae12cadcffe..d48166fcb03 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -8308,7 +8308,7 @@ def _coerce_map_from_(self, R): if is_NumberFieldOrder(R) and self.has_coerce_map_from(R.number_field()): return self._generic_coerce_map(R) # R is not QQ by the above tests - if isinstance(R, NumberField) and R.coerce_embedding() is not None: + if isinstance(R, NumberField_generic) and R.coerce_embedding() is not None: if self.coerce_embedding() is not None: try: return number_field_morphisms.EmbeddedNumberFieldMorphism(R, self) From 9976c4cff12cda5677f3224e812cd6d381df5a34 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 18:43:08 -0700 Subject: [PATCH 16/18] src/sage/rings/number_field/number_field_rel.py: Fix up import --- src/sage/rings/number_field/number_field_rel.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py index 35a519b9272..3418423abc8 100644 --- a/src/sage/rings/number_field/number_field_rel.py +++ b/src/sage/rings/number_field/number_field_rel.py @@ -93,7 +93,6 @@ from .number_field import (NumberField, NumberField_generic, put_natural_embedding_first, proof_flag, is_NumberFieldHomsetCodomain) -from sage.rings.number_field.number_field_base import NumberField from sage.rings.number_field.order import (RelativeOrder, is_NumberFieldOrder, relative_order_from_ring_generators) from sage.rings.number_field.morphism import RelativeNumberFieldHomomorphism_from_abs @@ -277,7 +276,7 @@ def __init__(self, base, polynomial, name, raise NotImplementedError("Embeddings not implemented for relative number fields") if names is not None: name = names - if not isinstance(base, NumberField): + if not isinstance(base, NumberField_generic): raise TypeError("base (=%s) must be a number field"%base) if not isinstance(polynomial, polynomial_element.Polynomial): try: From e3162a61277e0b84bb70ccf84e75ac8983fb5c39 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 14 Mar 2023 20:38:34 -0700 Subject: [PATCH 17/18] src/sage/rings/polynomial/polynomial_element.pyx: Fix import/isinstance --- src/sage/rings/polynomial/polynomial_element.pyx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx index a6c605cf8a3..d486e4c5ae9 100644 --- a/src/sage/rings/polynomial/polynomial_element.pyx +++ b/src/sage/rings/polynomial/polynomial_element.pyx @@ -5271,13 +5271,14 @@ cdef class Polynomial(CommutativePolynomial): if self.degree() <= 1: return R.fraction_field() - from sage.rings.number_field.number_field import NumberField - from sage.rings.number_field.number_field_base import NumberField - if is_IntegerRing(R): + from sage.rings.number_field.number_field import NumberField return NumberField(self, names) - if sage.rings.rational_field.is_RationalField(R) or isinstance(R, NumberField): + from sage.rings.number_field.number_field_base import NumberField as NumberField_base + + if sage.rings.rational_field.is_RationalField(R) or isinstance(R, NumberField_base): + from sage.rings.number_field.number_field import NumberField return NumberField(self, names) return R.fraction_field()[self._parent.variable_name()].quotient(self, names) From 3cd6056f97b927cc7604655617dc7ea2898c9c97 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 15 Mar 2023 00:56:25 -0700 Subject: [PATCH 18/18] Fix up imports --- src/sage/algebras/splitting_algebra.py | 4 ++-- src/sage/arith/misc.py | 4 ++-- src/sage/modular/dirichlet.py | 5 ++--- src/sage/rings/complex_arb.pyx | 4 ++-- src/sage/rings/number_field/number_field.py | 2 +- src/sage/rings/number_field/number_field_rel.py | 3 ++- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/sage/algebras/splitting_algebra.py b/src/sage/algebras/splitting_algebra.py index d960d5d0ca0..e19a2bb6d9a 100644 --- a/src/sage/algebras/splitting_algebra.py +++ b/src/sage/algebras/splitting_algebra.py @@ -708,8 +708,8 @@ def create_roots(monic_polynomial, warning=True): # as coercion # ------------------------------------------------------------------------------------- reset_coercion = False - from sage.rings.number_field.number_field_base import NumberField - if isinstance(base_ring, NumberField): + from sage.rings.number_field.number_field import NumberField_generic + if isinstance(base_ring, NumberField_generic): reset_coercion = True elif base_ring.is_finite() and not base_ring.is_prime_field(): reset_coercion = True diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index e095f3e3ce6..8be5f952d68 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -555,8 +555,8 @@ def is_prime(n): R = n.parent() if R.is_field(): # number fields redefine .is_prime(), see #32340 - from sage.rings.number_field.number_field_base import NumberField - if not isinstance(R, NumberField): + from sage.rings.number_field.number_field import NumberField_generic + if not isinstance(R, NumberField_generic): import warnings s = f'Testing primality in {R}, which is a field, ' \ 'hence the result will always be False. ' diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index 63d10bb4f35..68b4eaaa4f1 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -76,8 +76,7 @@ from sage.rings.finite_rings.integer_mod_ring import IntegerModRing from sage.rings.integer import Integer from sage.rings.integer_ring import ZZ -from sage.rings.number_field.number_field import CyclotomicField, NumberField -from sage.rings.number_field.number_field_base import NumberField as NumberField_base +from sage.rings.number_field.number_field import CyclotomicField, NumberField, NumberField_generic from sage.rings.power_series_ring import PowerSeriesRing from sage.rings.rational_field import RationalField, QQ, is_RationalField from sage.rings.ring import is_Ring @@ -1903,7 +1902,7 @@ def minimize_base_ring(self): K = IntegerModRing(p) elif self.order() <= 2: K = QQ - elif (isinstance(R, NumberField_base) + elif (isinstance(R, NumberField_generic) and euler_phi(self.order()) < R.absolute_degree()): K = CyclotomicField(self.order()) else: diff --git a/src/sage/rings/complex_arb.pyx b/src/sage/rings/complex_arb.pyx index c3014c9821f..797f5122d40 100644 --- a/src/sage/rings/complex_arb.pyx +++ b/src/sage/rings/complex_arb.pyx @@ -179,7 +179,6 @@ from sage.libs.gsl.complex cimport gsl_complex_rect from sage.rings.real_double cimport RealDoubleElement from sage.rings.complex_double cimport ComplexDoubleElement from sage.rings.integer cimport Integer -from sage.rings.number_field.number_field_base import NumberField from sage.rings.polynomial.polynomial_complex_arb cimport Polynomial_complex_arb from sage.rings.real_arb cimport mpfi_to_arb, arb_to_mpfi from sage.rings.real_arb import RealBallField @@ -563,7 +562,8 @@ class ComplexBallField(UniqueRepresentation, sage.rings.abc.ComplexBallField): elif isinstance(other, ComplexBallField): return other._prec >= self._prec - if isinstance(other, NumberField): + import sage.rings.number_field.number_field as number_field + if isinstance(other, number_field.NumberField_generic): emb = other.coerce_embedding() return emb is not None and self.has_coerce_map_from(emb.codomain()) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index d48166fcb03..27954466d83 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -8308,7 +8308,7 @@ def _coerce_map_from_(self, R): if is_NumberFieldOrder(R) and self.has_coerce_map_from(R.number_field()): return self._generic_coerce_map(R) # R is not QQ by the above tests - if isinstance(R, NumberField_generic) and R.coerce_embedding() is not None: + if isinstance(R, number_field_base.NumberField) and R.coerce_embedding() is not None: if self.coerce_embedding() is not None: try: return number_field_morphisms.EmbeddedNumberFieldMorphism(R, self) diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py index 3418423abc8..88284bf8ed0 100644 --- a/src/sage/rings/number_field/number_field_rel.py +++ b/src/sage/rings/number_field/number_field_rel.py @@ -93,6 +93,7 @@ from .number_field import (NumberField, NumberField_generic, put_natural_embedding_first, proof_flag, is_NumberFieldHomsetCodomain) +from sage.rings.number_field.number_field_base import NumberField as NumberField_base from sage.rings.number_field.order import (RelativeOrder, is_NumberFieldOrder, relative_order_from_ring_generators) from sage.rings.number_field.morphism import RelativeNumberFieldHomomorphism_from_abs @@ -276,7 +277,7 @@ def __init__(self, base, polynomial, name, raise NotImplementedError("Embeddings not implemented for relative number fields") if names is not None: name = names - if not isinstance(base, NumberField_generic): + if not isinstance(base, NumberField_base): raise TypeError("base (=%s) must be a number field"%base) if not isinstance(polynomial, polynomial_element.Polynomial): try: