Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
speed up conversion for complex double
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonathan Kliem committed Oct 26, 2021
1 parent 16d2850 commit 388b05f
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 7 deletions.
7 changes: 7 additions & 0 deletions src/sage/libs/pari/convert_sage_complex_double.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,10 @@ from sage.rings.complex_double cimport ComplexDoubleElement
cpdef ComplexDoubleElement pari_to_cdf(Gen g)

cpdef Gen new_gen_from_complex_double_element(ComplexDoubleElement self)

cpdef ComplexDoubleElement complex_double_element_eta(ComplexDoubleElement self, int flag)
cpdef ComplexDoubleElement complex_double_element_agm(ComplexDoubleElement self, right)
cpdef ComplexDoubleElement complex_double_element_dilog(ComplexDoubleElement self)
cpdef ComplexDoubleElement complex_double_element_gamma(ComplexDoubleElement self)
cpdef ComplexDoubleElement complex_double_element_gamma_inc(ComplexDoubleElement self, t)
cpdef ComplexDoubleElement complex_double_element_zeta(ComplexDoubleElement self)
69 changes: 69 additions & 0 deletions src/sage/libs/pari/convert_sage_complex_double.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,72 @@ cpdef Gen new_gen_from_complex_double_element(ComplexDoubleElement self):
return new_gen_from_double(self._complex.real)
else:
return new_t_COMPLEX_from_double(self._complex.real, self._complex.imag)


cpdef ComplexDoubleElement complex_double_element_eta(ComplexDoubleElement self, int flag):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_eta
sage: a = CDF(1,1)
sage: complex_double_element_eta(a, 0)
0.9981290699259585
sage: complex_double_element_eta(a, 1)
0.7420487758365647 + 0.1988313702299107*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).eta(flag))


cpdef ComplexDoubleElement complex_double_element_agm(ComplexDoubleElement self, right):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_agm
sage: complex_double_element_agm(CDF(1, 1), CDF(2, 2))
1.4567910310469068 + 1.4567910310469068*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).agm(right))


cpdef ComplexDoubleElement complex_double_element_dilog(ComplexDoubleElement self):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_dilog
sage: complex_double_element_dilog(CDF(1, 1))
0.6168502750680849 + 1.4603621167531196*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).dilog())


cpdef ComplexDoubleElement complex_double_element_gamma(ComplexDoubleElement self):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_gamma
sage: complex_double_element_gamma(CDF(1, 1))
0.49801566811835607 - 0.15494982830181067*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).gamma())


cpdef ComplexDoubleElement complex_double_element_gamma_inc(ComplexDoubleElement self, t):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_gamma_inc
sage: complex_double_element_gamma_inc(CDF(1, 1), CDF(2, 2))
0.054695987717541285 - 0.04676800059213122*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).incgam(t))


cpdef ComplexDoubleElement complex_double_element_zeta(ComplexDoubleElement self):
"""
TESTS::
sage: from sage.libs.pari.convert_sage_complex_double import complex_double_element_zeta
sage: complex_double_element_zeta(CDF(1, 2))
0.5981655697623818 - 0.35185474521784527*I
"""
return pari_to_cdf(new_gen_from_complex_double_element(self).zeta())
46 changes: 39 additions & 7 deletions src/sage/rings/complex_double.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ try:
except ImportError:
pari_gen = ()


new_gen_from_complex_double_element = None
complex_double_element_eta = None
complex_double_element_agm = None
complex_double_element_dilog = None
complex_double_element_gamma = None
complex_double_element_gamma_inc = None
complex_double_element_zeta = None


from . import complex_mpfr

from .complex_mpfr import ComplexField
Expand Down Expand Up @@ -1140,7 +1150,9 @@ cdef class ComplexDoubleElement(FieldElement):
sage: pari(CDF(I))
1.00000000000000*I
"""
from sage.libs.pari.convert_sage_complex_double import new_gen_from_complex_double_element
global new_gen_from_complex_double_element
if new_gen_from_complex_double_element is None:
from sage.libs.pari.convert_sage_complex_double import new_gen_from_complex_double_element
return new_gen_from_complex_double_element(self)

def __mpc__(self):
Expand Down Expand Up @@ -2241,8 +2253,12 @@ cdef class ComplexDoubleElement(FieldElement):
# this, PARI can easily underflow.
return ComplexDoubleElement(0,0)

global complex_double_element_eta
if complex_double_element_eta is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_eta

cdef int flag = 0 if omit_frac else 1
return pari_to_cdf(self.__pari__().eta(flag))
return complex_double_element_eta(self, flag)

def agm(self, right, algorithm="optimal"):
r"""
Expand Down Expand Up @@ -2307,7 +2323,10 @@ cdef class ComplexDoubleElement(FieldElement):
cdef double d, e, eps = 2.0**-51

if algorithm == "pari":
return pari_to_cdf(self.__pari__().agm(right))
global complex_double_element_agm
if complex_double_element_agm is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_agm
return complex_double_element_agm(self, right)

if not isinstance(right, ComplexDoubleElement):
right = CDF(right)
Expand Down Expand Up @@ -2357,7 +2376,10 @@ cdef class ComplexDoubleElement(FieldElement):
sage: CDF(10000000,10000000).dilog()
-134.411774490731 + 38.79396299904504*I
"""
return pari_to_cdf(self.__pari__().dilog())
global complex_double_element_dilog
if complex_double_element_dilog is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_dilog
return complex_double_element_dilog(self)

def gamma(self):
r"""
Expand Down Expand Up @@ -2385,7 +2407,10 @@ cdef class ComplexDoubleElement(FieldElement):
return CC(self).gamma()
except TypeError:
pass
return pari_to_cdf(self.__pari__().gamma())
global complex_double_element_gamma
if complex_double_element_gamma is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_gamma
return complex_double_element_gamma(self)

def gamma_inc(self, t):
r"""
Expand All @@ -2400,7 +2425,10 @@ cdef class ComplexDoubleElement(FieldElement):
sage: CDF(2,0).gamma_inc(CDF(1,1))
0.7070920963459381 - 0.4203536409598115*I
"""
return pari_to_cdf(self.__pari__().incgam(t))
global complex_double_element_gamma_inc
if complex_double_element_gamma_inc is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_gamma_inc
return complex_double_element_gamma_inc(self, t)

def zeta(self):
"""
Expand All @@ -2419,7 +2447,11 @@ cdef class ComplexDoubleElement(FieldElement):
if self._complex.real == 1 and self._complex.imag == 0:
from .infinity import unsigned_infinity
return unsigned_infinity
return pari_to_cdf(self.__pari__().zeta())

global complex_double_element_zeta
if complex_double_element_zeta is None:
from sage.libs.pari.convert_sage_complex_double import complex_double_element_zeta
return complex_double_element_zeta(self)

def algdep(self, long n):
"""
Expand Down

0 comments on commit 388b05f

Please sign in to comment.