Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -199,18 +199,20 @@
from functools import total_ordering
from itertools import combinations_with_replacement

from sage.structure.element import RingElement
from sage.structure.unique_representation import UniqueRepresentation
from sage.structure.parent import Parent
from sage.calculus.var import var
from sage.calculus.functional import diff
from sage.symbolic.ring import SR
from sage.categories.rings import Rings
from sage.misc.lazy_import import lazy_import
from sage.misc.misc_c import prod
from sage.rings.integer import Integer
from sage.rings.integer_ring import ZZ
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
from sage.categories.rings import Rings
from sage.structure.element import RingElement
from sage.structure.parent import Parent
from sage.structure.richcmp import richcmp_by_eq_and_lt
from sage.structure.unique_representation import UniqueRepresentation

lazy_import("sage.calculus.var", "var")
lazy_import("sage.calculus.functional", "diff")
lazy_import("sage.symbolic.ring", "SR")


@total_ordering
Expand Down
5 changes: 3 additions & 2 deletions src/sage/rings/complex_arb.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ 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.rational_field import QQ
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
Expand Down Expand Up @@ -569,8 +571,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 other is not QQ and isinstance(other, NumberField):
emb = other.coerce_embedding()
return emb is not None and self.has_coerce_map_from(emb.codomain())

Expand Down
12 changes: 8 additions & 4 deletions src/sage/rings/complex_mpc.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,11 @@ from sage.structure.parent cimport Parent
from sage.structure.element cimport Element
from sage.structure.richcmp cimport rich_to_bool
from sage.categories.map cimport Map
from sage.libs.pari.all import pari

try:
from sage.libs.pari.all import pari, pari_gen, PariError
except ImportError:
pari_gen = PariError = ()

from sage.rings.integer cimport Integer
from sage.rings.complex_mpfr cimport ComplexNumber
Expand Down Expand Up @@ -842,7 +846,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
elif isinstance(z, ComplexNumber):
mpc_set_fr_fr(self.value, (<ComplexNumber>z).__re, (<ComplexNumber>z).__im, rnd)
return
elif isinstance(z, sage.libs.pari.all.pari_gen):
elif isinstance(z, pari_gen):
real, imag = z.real(), z.imag()
elif isinstance(z, (list, tuple)):
real, imag = z
Expand Down Expand Up @@ -2238,7 +2242,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
"""
try:
return self._parent(self.__pari__().eta(not omit_frac))
except sage.libs.pari.all.PariError:
except PariError:
raise ValueError("value must be in the upper half plane")

def gamma(self):
Expand All @@ -2264,7 +2268,7 @@ cdef class MPComplexNumber(sage.structure.element.FieldElement):
"""
try:
return self._parent(self.__pari__().gamma())
except sage.libs.pari.all.PariError:
except PariError:
from sage.rings.infinity import UnsignedInfinityRing
return UnsignedInfinityRing.gen()

Expand Down
33 changes: 9 additions & 24 deletions src/sage/rings/complex_mpfr.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,9 @@ except ImportError:

# Some objects that are not imported at startup in order to break
# circular imports
NumberFieldElement_quadratic = None
AlgebraicNumber_base = None
AlgebraicNumber = None
AlgebraicReal = None
NumberFieldElement_quadratic = ()
AA = None
QQbar = None
SR = None
CDF = CLF = RLF = None
def late_import():
"""
Expand All @@ -82,25 +78,14 @@ def late_import():
sage: sage.rings.complex_mpfr.late_import()
"""
global NumberFieldElement_quadratic
global AlgebraicNumber_base
global AlgebraicNumber
global AlgebraicReal
global UniversalCyclotomicField
global AA, QQbar, SR
global AA, QQbar
global CLF, RLF, CDF
if NumberFieldElement_quadratic is None:
import sage.rings.number_field.number_field
import sage.rings.number_field.number_field_element_quadratic as nfeq
NumberFieldElement_quadratic = nfeq.NumberFieldElement_quadratic
import sage.rings.qqbar
AlgebraicNumber_base = sage.rings.qqbar.AlgebraicNumber_base
AlgebraicNumber = sage.rings.qqbar.AlgebraicNumber
AlgebraicReal = sage.rings.qqbar.AlgebraicReal
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
AA = sage.rings.qqbar.AA
QQbar = sage.rings.qqbar.QQbar
import sage.symbolic.ring
SR = sage.symbolic.ring.SR
if CLF is None:
try:
from sage.rings.number_field.number_field_element_quadratic import NumberFieldElement_quadratic
from sage.rings.qqbar import AA, QQbar
except ImportError:
pass
from sage.rings.real_lazy import CLF, RLF
from sage.rings.complex_double import CDF

Expand Down Expand Up @@ -586,7 +571,7 @@ class ComplexField_class(sage.rings.abc.ComplexField):
# parts of real elements) that get picked for conversion from UCF both
# to CC and to other types of complex fields depend in which order the
# coercions are discovered.
if isinstance(S, UniversalCyclotomicField):
if isinstance(S, sage.rings.abc.UniversalCyclotomicField):
return self._generic_coerce_map(S)
return self._coerce_map_via([CLF], S)

Expand Down
6 changes: 5 additions & 1 deletion src/sage/rings/fraction_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,11 @@ def _element_constructor_(self, x, y=None, coerce=True):
x = py_scalar_to_element(x)
y = py_scalar_to_element(y)

from sage.libs.pari.all import pari_gen
try:
from sage.libs.pari.all import pari_gen
except ImportError:
pari_gen = ()

if isinstance(x, pari_gen) and x.type() == 't_POL':
# This recursive approach is needed because PARI
# represents multivariate polynomials as iterated
Expand Down
16 changes: 12 additions & 4 deletions src/sage/rings/infinity.py
Original file line number Diff line number Diff line change
Expand Up @@ -1285,7 +1285,10 @@ def _pushout_(self, other):
sage: QQbar(-2*i)*infinity # needs sage.rings.number_field sage.symbolic
(-I)*Infinity
"""
from sage.symbolic.ring import SR
try:
from sage.symbolic.ring import SR
except ImportError:
return None
if SR.has_coerce_map_from(other):
return SR

Expand Down Expand Up @@ -1801,10 +1804,15 @@ def test_comparison(ring):
...
AssertionError: testing -1000.0 in Symbolic Ring: id = ...
"""
from sage.symbolic.ring import SR

from sage.rings.rational_field import QQ
elements = [-1e3, 99.9999, -SR(2).sqrt(), 0, 1,
3 ** (-QQ.one() / 3), SR.pi(), 100000]
elements = [-1e3, 99.9999, 0, 1, 100000]
try:
from sage.symbolic.ring import SR
except ImportError:
pass
else:
elements += [-SR(2).sqrt(), SR.pi(), 3 ** (-QQ.one() / 3)]
elements.append(ring.an_element())
elements.extend(ring.some_elements())
for z in elements:
Expand Down
2 changes: 0 additions & 2 deletions src/sage/rings/integer_ring.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ import sage.rings.infinity
import sage.rings.rational
import sage.rings.rational_field
import sage.rings.ideal
import sage.libs.pari.all
import sage.rings.ideal
from sage.categories.basic import EuclideanDomains, DedekindDomains
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
from sage.categories.noetherian_rings import NoetherianRings
Expand Down
7 changes: 4 additions & 3 deletions src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -215,16 +215,18 @@ from sage.libs.singular.ring cimport singular_ring_new, singular_ring_reference,

# polynomial imports
from sage.rings.polynomial.multi_polynomial_ring import MPolynomialRing_polydict, MPolynomialRing_polydict_domain
from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
from sage.rings.polynomial.multi_polynomial_element import MPolynomial_polydict
from sage.rings.polynomial.multi_polynomial_ideal import MPolynomialIdeal
from sage.rings.polynomial.polydict cimport ETuple
from sage.rings.polynomial.polynomial_ring import is_PolynomialRing

# base ring imports
import sage.rings.abc
import sage.structure.element

from sage.rings.rational cimport Rational
from sage.rings.rational_field import QQ
import sage.rings.abc
from sage.rings.integer_ring import is_IntegerRing, ZZ
from sage.rings.integer cimport Integer
from sage.rings.number_field.number_field_base cimport NumberField
Expand Down Expand Up @@ -950,8 +952,7 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
raise
return new_MP(self, _p)

from sage.rings.polynomial.pbori.pbori import BooleanPolynomial
if isinstance(element, BooleanPolynomial):
if isinstance(element, sage.structure.element.Element) and isinstance(element.parent(), BooleanPolynomialRing_base):
if element.constant():
if element:
return self._one_element
Expand Down
4 changes: 3 additions & 1 deletion src/sage/rings/power_series_ring.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@
import sage.categories.commutative_rings as commutative_rings
import sage.misc.latex as latex
from sage.interfaces.abc import MagmaElement
from sage.misc.sage_eval import sage_eval
from sage.misc.lazy_import import lazy_import
from sage.rings import (
integer,
laurent_series_ring,
Expand Down Expand Up @@ -167,6 +167,8 @@

from sage.categories.complete_discrete_valuation import CompleteDiscreteValuationRings

lazy_import('sage.misc.sage_eval', 'sage_eval')

try:
from .laurent_series_ring import LaurentSeriesRing
from .laurent_series_ring_element import LaurentSeries
Expand Down
4 changes: 2 additions & 2 deletions src/sage/rings/quotient_ring.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ def QuotientRing(R, I, names=None, **kwds):
kwds.pop('implementation')
return BooleanPolynomialRing(R.ngens(), names=names, **kwds)
# workaround to silence warning from #34806
from sage.rings.number_field.order import Order
from sage.rings.abc import Order
if isinstance(R, Order):
if not R.is_maximal():
raise NotImplementedError('only implemented for maximal orders')
Expand Down Expand Up @@ -480,7 +480,7 @@ def __init__(self, R, I, names, category=None):
if R not in _Rings:
raise TypeError("The first argument must be a ring, but %s is not" % R)
# workaround to silence warning from #34806
from sage.rings.number_field.order import Order
from sage.rings.abc import Order
if isinstance(R, Order):
M = R.number_field().ideal_monoid()
else:
Expand Down
51 changes: 35 additions & 16 deletions src/sage/rings/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,17 +239,28 @@ def rings0():
"""
from sage.rings.integer_ring import IntegerRing
from sage.rings.rational_field import RationalField

v = [(IntegerRing, 'ring of integers'),
(RationalField, 'field of rational numbers'),
(integer_mod_ring, 'integers modulo n for n at most 50000'),
(prime_finite_field, 'a prime finite field with cardinality at most 10^20'),
(finite_field, 'finite field with degree at most 20 and prime at most 10^6'),
(small_finite_field, 'finite field with cardinality at most 2^16'),
(padic_field, 'a p-adic field'),
(quadratic_number_field, 'a quadratic number field'),
(absolute_number_field, 'an absolute number field of degree at most 10'),
(relative_number_field, 'a tower of at most 2 extensions each of degree at most 2')
]
(integer_mod_ring, 'integers modulo n for n at most 50000')]
try:
v += [(prime_finite_field, 'a prime finite field with cardinality at most 10^20'),
(finite_field, 'finite field with degree at most 20 and prime at most 10^6'),
(small_finite_field, 'finite field with cardinality at most 2^16')]
except ImportError:
pass

try:
v += [(padic_field, 'a p-adic field')]
except ImportError:
pass

try:
v += [(quadratic_number_field, 'a quadratic number field'),
(absolute_number_field, 'an absolute number field of degree at most 10'),
(relative_number_field, 'a tower of at most 2 extensions each of degree at most 2')]
except ImportError:
pass

return v

Expand Down Expand Up @@ -279,17 +290,25 @@ def rings1():
X = random_rings(level=0)
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
from sage.rings.power_series_ring import PowerSeriesRing
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
from sage.rings.integer_ring import ZZ

v = [(lambda: PolynomialRing(next(X), names='x'),
'univariate polynomial ring over level 0 ring'),
(lambda: PowerSeriesRing(next(X), names='x'),
'univariate power series ring over level 0 ring'),
(lambda: LaurentPolynomialRing(next(X), names='x'),
'univariate Laurent polynomial ring over level 0 ring'),
(lambda: PolynomialRing(next(X), abs(ZZ.random_element(x=2, y=10)),
names='x'),
'multivariate polynomial ring in between 2 and 10 variables over a level 0 ring')]
'univariate power series ring over level 0 ring')]

try:
from sage.rings.polynomial.laurent_polynomial_ring import LaurentPolynomialRing
except ImportError:
pass
else:
v += [(lambda: LaurentPolynomialRing(next(X), names='x'),
'univariate Laurent polynomial ring over level 0 ring')]

v += [(lambda: PolynomialRing(next(X), abs(ZZ.random_element(x=2, y=10)),
names='x'),
'multivariate polynomial ring in between 2 and 10 variables over a level 0 ring')]

return v


Expand Down