diff --git a/src/sage/libs/pari/gen.pyx b/src/sage/libs/pari/gen.pyx index 5dc5b7890f0..71b3f142d58 100644 --- a/src/sage/libs/pari/gen.pyx +++ b/src/sage/libs/pari/gen.pyx @@ -4862,7 +4862,7 @@ cdef class gen(sage.structure.element.RingElement): -2.18503986326152 sage: C. = ComplexField() sage: pari(i).tan() - 0.E-19 + 0.761594155955765*I + 0.761594155955765*I """ pari_catch_sig_on() return P.new_gen(gtan(x.g, prec_bits_to_words(precision))) @@ -4882,7 +4882,7 @@ cdef class gen(sage.structure.element.RingElement): 0.761594155955765 sage: C. = ComplexField() sage: z = pari(i); z - 0.E-19 + 1.00000000000000*I + 1.00000000000000*I sage: result = z.tanh() sage: result.real() <= 1e-18 True @@ -4967,7 +4967,7 @@ cdef class gen(sage.structure.element.RingElement): 1.18920711500272 + 0.E-19*I # 32-bit 1.18920711500272 + 2.71050543121376 E-20*I # 64-bit sage: pari(i).weber(1) - 1.09050773266526 + 0.E-19*I + 1.09050773266526 sage: pari(i).weber(2) 1.09050773266526 """ diff --git a/src/sage/rings/complex_double.pyx b/src/sage/rings/complex_double.pyx index 3ca3ca1811b..f3e0bc40c9a 100644 --- a/src/sage/rings/complex_double.pyx +++ b/src/sage/rings/complex_double.pyx @@ -1054,14 +1054,22 @@ cdef class ComplexDoubleElement(FieldElement): cdef GEN _gen(self): cdef GEN y - y = cgetg(3, t_COMPLEX) # allocate space for a complex number - set_gel(y, 1, pari.double_to_GEN(self._complex.dat[0])) - set_gel(y, 2, pari.double_to_GEN(self._complex.dat[1])) + if self._complex.dat[1] == 0: + # Return t_REAL + y = pari.double_to_GEN(self._complex.dat[0]) + else: + # Return t_COMPLEX + y = cgetg(3, t_COMPLEX) + if self._complex.dat[0] == 0: + set_gel(y, 1, gen_0) + else: + set_gel(y, 1, pari.double_to_GEN(self._complex.dat[0])) + set_gel(y, 2, pari.double_to_GEN(self._complex.dat[1])) return y def _pari_(self): """ - Return PARI version of ``self``. + Return PARI version of ``self``, as ``t_COMPLEX`` or ``t_REAL``. EXAMPLES:: @@ -1069,6 +1077,10 @@ cdef class ComplexDoubleElement(FieldElement): 1.00000000000000 + 2.00000000000000*I sage: pari(CDF(1,2)) 1.00000000000000 + 2.00000000000000*I + sage: pari(CDF(2.0)) + 2.00000000000000 + sage: pari(CDF(I)) + 1.00000000000000*I """ pari_catch_sig_on() return pari.new_gen(self._gen()) diff --git a/src/sage/rings/complex_number.pyx b/src/sage/rings/complex_number.pyx index 5fb02097125..df3d007d49a 100644 --- a/src/sage/rings/complex_number.pyx +++ b/src/sage/rings/complex_number.pyx @@ -544,7 +544,8 @@ cdef class ComplexNumber(sage.structure.element.FieldElement): def _pari_(self): r""" - Coerces ``self`` into a Pari ``complex`` object. + Coerces ``self`` into a PARI ``t_COMPLEX`` object, + or a ``t_REAL`` if ``self`` is real. EXAMPLES: @@ -553,14 +554,26 @@ cdef class ComplexNumber(sage.structure.element.FieldElement): sage: a = ComplexNumber(2,1) sage: pari(a) 2.00000000000000 + 1.00000000000000*I + sage: pari(a).type() + 't_COMPLEX' sage: type(pari(a)) sage: a._pari_() 2.00000000000000 + 1.00000000000000*I sage: type(a._pari_()) + sage: a = CC(pi) + sage: pari(a) + 3.14159265358979 + sage: pari(a).type() + 't_REAL' + sage: a = CC(-2).sqrt() + sage: pari(a) + 1.41421356237310*I """ - return sage.libs.pari.all.pari.complex(self.real()._pari_(), self.imag()._pari_()) + if self.is_real(): + return self.real()._pari_() + return sage.libs.pari.all.pari.complex(self.real() or 0, self.imag()) def _mpmath_(self, prec=None, rounding=None): """ diff --git a/src/sage/schemes/elliptic_curves/heegner.py b/src/sage/schemes/elliptic_curves/heegner.py index d292dff8888..3454b0afded 100644 --- a/src/sage/schemes/elliptic_curves/heegner.py +++ b/src/sage/schemes/elliptic_curves/heegner.py @@ -3152,7 +3152,7 @@ def numerical_approx(self, prec=53, algorithm=None): sage: E = EllipticCurve('37a'); P = E.heegner_point(-40); P Heegner point of discriminant -40 on elliptic curve of conductor 37 sage: P.numerical_approx() - (-6.68...e-16 + 1.41421356237310*I : 1.00000000000000 - 1.41421356237309*I : 1.00000000000000) + (-6.6...e-16 + 1.41421356237310*I : 1.00000000000000 - 1.41421356237309*I : 1.00000000000000) A rank 2 curve, where all Heegner points of conductor 1 are 0::