Skip to content

Commit

Permalink
Trac #32600: sage.arith: Use sage.rings.abc and move some module-leve…
Browse files Browse the repository at this point in the history
…l imports into methods

(cherry-picked from #32432)

URL: https://trac.sagemath.org/32600
Reported by: mkoeppe
Ticket author(s): Matthias Koeppe
Reviewer(s): Travis Scrimshaw
  • Loading branch information
Release Manager committed Oct 12, 2021
2 parents 12f3702 + 5e5843a commit 3cb09dd
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions src/sage/arith/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,14 @@
from sage.misc.misc import powerset
from sage.misc.misc_c import prod

from sage.libs.pari.all import pari
from sage.libs.flint.arith import (bernoulli_number as flint_bernoulli,
dedekind_sum as flint_dedekind_sum)

from sage.structure.element import parent
from sage.structure.coerce import py_scalar_to_element

from sage.rings.rational_field import QQ
from sage.rings.integer_ring import ZZ
from sage.rings.integer import Integer, GCD_list
from sage.rings.rational import Rational
from sage.rings.real_mpfr import RealNumber
from sage.rings.complex_mpfr import ComplexNumber
from sage.rings.abc import RealField, ComplexField

from sage.rings.fast_arith import arith_int, arith_llong, prime_range

Expand Down Expand Up @@ -207,7 +202,7 @@ def algdep(z, degree, known_bits=None, use_bits=None, known_digits=None,
return None
return z.denominator()*x - z.numerator()

if isinstance(z, (RealNumber, ComplexNumber)):
if isinstance(z.parent(), (RealField, ComplexField)):

log2_10 = math.log(10,2)

Expand All @@ -221,7 +216,7 @@ def algdep(z, degree, known_bits=None, use_bits=None, known_digits=None,
if use_bits is not None:
prec = int(use_bits)

is_complex = isinstance(z, ComplexNumber)
is_complex = isinstance(z.parent(), ComplexField)
n = degree+1
from sage.matrix.constructor import matrix
M = matrix(ZZ, n, n+1+int(is_complex))
Expand Down Expand Up @@ -266,6 +261,7 @@ def norm(v):
raise NotImplementedError("proof and height bound only implemented for real and complex numbers")

else:
from sage.libs.pari.all import pari
y = pari(z)
f = y.algdep(degree)

Expand Down Expand Up @@ -366,8 +362,10 @@ def bernoulli(n, algorithm='default', num_threads=1):
if n >= 100000:
from warnings import warn
warn("flint is known to not be accurate for large Bernoulli numbers")
from sage.libs.flint.arith import bernoulli_number as flint_bernoulli
return flint_bernoulli(n)
elif algorithm == 'pari':
from sage.libs.pari.all import pari
x = pari(n).bernfrac() # Use the PARI C library
return Rational(x)
elif algorithm == 'gap':
Expand Down Expand Up @@ -465,6 +463,7 @@ def factorial(n, algorithm='gmp'):
if algorithm == 'gmp':
return ZZ(n).factorial()
elif algorithm == 'pari':
from sage.libs.pari.all import pari
return pari.factorial(n)
else:
raise ValueError('unknown algorithm')
Expand Down Expand Up @@ -3031,6 +3030,7 @@ def __call__(self, n):
return ZZ(0)
if n<=2:
return ZZ(1)
from sage.libs.pari.all import pari
return ZZ(pari(n).eulerphi())

def plot(self, xmin=1, xmax=50, pointsize=30, rgbcolor=(0,0,1), join=True,
Expand Down Expand Up @@ -3609,7 +3609,7 @@ def binomial(x, m, **kwds):
return P(x.binomial(m, **kwds))

# case 3: rational, real numbers, complex numbers -> use pari
if isinstance(x, (Rational, RealNumber, ComplexNumber)):
if isinstance(x, Rational) or isinstance(P, (RealField, ComplexField)):
return P(x.__pari__().binomial(m))

# case 4: naive method
Expand Down Expand Up @@ -4101,6 +4101,7 @@ def primitive_root(n, check=True):
sage: primitive_root(mpz(-46))
5
"""
from sage.libs.pari.all import pari
if not check:
return ZZ(pari(n).znprimroot())
n = ZZ(n).abs()
Expand Down Expand Up @@ -4160,6 +4161,7 @@ def nth_prime(n):
"""
if n <= 0:
raise ValueError("nth prime meaningless for non-positive n (=%s)" % n)
from sage.libs.pari.all import pari
return ZZ(pari.prime(n))


Expand Down Expand Up @@ -4278,6 +4280,7 @@ def __call__(self, n):
# Use fast PARI algorithm
if n == 0:
return ZZ.zero()
from sage.libs.pari.all import pari
return ZZ(pari(n).moebius())


Expand Down Expand Up @@ -4363,6 +4366,8 @@ def range(self, start, stop=None, step=None):
return self.range(start, 0, step) + [ZZ.zero()] +\
self.range(step, stop, step)

from sage.libs.pari.all import pari

if step == 1:
v = pari('vector(%s, i, moebius(i-1+%s))'%(
stop-start, start))
Expand Down Expand Up @@ -4492,6 +4497,7 @@ def number_of_divisors(n):
m = ZZ(n)
if m.is_zero():
raise ValueError("input must be nonzero")
from sage.libs.pari.all import pari
return ZZ(pari(m).numdiv())


Expand Down Expand Up @@ -4566,6 +4572,7 @@ def hilbert_symbol(a, b, p, algorithm="pari"):
if algorithm == "pari":
if p == -1:
p = 0
from sage.libs.pari.all import pari
return ZZ(pari(a).hilbert(b, p))

elif algorithm == 'direct':
Expand Down Expand Up @@ -5872,6 +5879,7 @@ def dedekind_sum(p, q, algorithm='default'):
- :wikipedia:`Dedekind\_sum`
"""
if algorithm == 'default' or algorithm == 'flint':
from sage.libs.flint.arith import dedekind_sum as flint_dedekind_sum
return flint_dedekind_sum(p, q)

if algorithm == 'pari':
Expand Down

0 comments on commit 3cb09dd

Please sign in to comment.