From 388b05f54be5419a1c0f68c765a6e6064301e1ac Mon Sep 17 00:00:00 2001 From: Jonathan Kliem Date: Tue, 26 Oct 2021 13:53:11 +0200 Subject: [PATCH] speed up conversion for complex double --- .../libs/pari/convert_sage_complex_double.pxd | 7 ++ .../libs/pari/convert_sage_complex_double.pyx | 69 +++++++++++++++++++ src/sage/rings/complex_double.pyx | 46 +++++++++++-- 3 files changed, 115 insertions(+), 7 deletions(-) diff --git a/src/sage/libs/pari/convert_sage_complex_double.pxd b/src/sage/libs/pari/convert_sage_complex_double.pxd index ebb3640c68b..51299d77759 100644 --- a/src/sage/libs/pari/convert_sage_complex_double.pxd +++ b/src/sage/libs/pari/convert_sage_complex_double.pxd @@ -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) diff --git a/src/sage/libs/pari/convert_sage_complex_double.pyx b/src/sage/libs/pari/convert_sage_complex_double.pyx index 5a04aff7f6e..d9b1f4a6a28 100644 --- a/src/sage/libs/pari/convert_sage_complex_double.pyx +++ b/src/sage/libs/pari/convert_sage_complex_double.pyx @@ -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()) diff --git a/src/sage/rings/complex_double.pyx b/src/sage/rings/complex_double.pyx index ecc326b4396..5f4e1ec0585 100644 --- a/src/sage/rings/complex_double.pyx +++ b/src/sage/rings/complex_double.pyx @@ -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 @@ -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): @@ -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""" @@ -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) @@ -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""" @@ -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""" @@ -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): """ @@ -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): """