Ticket #864: trac_864-pari_int_long_conversion.patch

File trac_864-pari_int_long_conversion.patch, 3.6 KB (added by pbruin, 8 years ago)
  • sage/libs/pari/gen.pyx

    # HG changeset patch
    # User Peter Bruin <P.Bruin@warwick.ac.uk>
    # Date 1383048543 0
    # Node ID c2ec2f5c1b6d54a1288b517a7a8e8b1ffbfd6095
    # Parent  909180b6bbccd52134ebdcd60618a9cb6d10c926
    Trac 864: speed up conversion from PARI to Python int/long
    
    diff --git a/sage/libs/pari/gen.pyx b/sage/libs/pari/gen.pyx
    a b  
    15961596       
    15971597    def __int__(gen self):
    15981598        """
    1599         Return Python int. Very fast, and if the number is too large to fit
    1600         into a C int, a Python long is returned instead.
     1599        Convert ``self`` to a Python integer.
     1600
     1601        If the number is too large to fit into a Pyhon ``int``, a
     1602        Python ``long`` is returned instead.
    16011603       
    16021604        EXAMPLES::
    16031605       
     
    16171619            -2147483648
    16181620            sage: int(pari("Pol(10)"))
    16191621            10
    1620         """
    1621         cdef GEN x
    1622         cdef long lx, *xp
    1623         if  typ(self.g)==t_POL and self.poldegree()<=0:
    1624             # Change a constant polynomial to its constant term
    1625             x = constant_term(self.g)
    1626         else:
    1627             x = self.g
    1628         if typ(x) != t_INT:
    1629             raise TypeError, "gen must be of PARI type t_INT or t_POL of degree 0"
    1630         if not signe(x):
    1631             return 0
    1632         lx = lgefint(x)-3   # take 1 to account for the MSW
    1633         xp = int_MSW(x)
    1634         # special case 1 word so we return int if it fits
    1635         if not lx:
    1636             if   signe(x) |  xp[0] > 0:     # both positive
    1637                 return xp[0]
    1638             elif signe(x) & -xp[0] < 0:     # both negative
    1639                 return -xp[0]
    1640         i = <ulong>xp[0]
    1641         while lx:
    1642             xp = int_precW(xp)
    1643             i = i << BITS_IN_LONG | <ulong>xp[0]
    1644             lx = lx-1
    1645         if signe(x) > 0:
    1646             return i
    1647         else:
    1648             return -i
    1649         # NOTE: Could use int_unsafe below, which would be much faster, but
    1650         # the default PARI prints annoying stuff to the screen when
    1651         # the number is large.
     1622            sage: int(pari("Mod(2, 7)"))
     1623            2
     1624        """
     1625        return int(Integer(self))
    16521626
    16531627    def int_unsafe(gen self):
    16541628        """
     
    18201794   
    18211795    def __long__(gen self):
    18221796        """
    1823         Return Python long.
    1824         """
    1825         return long(int(self))
     1797        Convert ``self`` to a Python ``long``.
     1798
     1799        EXAMPLES::
     1800
     1801            sage: long(pari(0))
     1802            0L
     1803            sage: long(pari(10))
     1804            10L
     1805            sage: long(pari(-10))
     1806            -10L
     1807            sage: long(pari(123456789012345678901234567890))
     1808            123456789012345678901234567890L
     1809            sage: long(pari(-123456789012345678901234567890))
     1810            -123456789012345678901234567890L
     1811            sage: long(pari(2^31-1))
     1812            2147483647L
     1813            sage: long(pari(-2^31))
     1814            -2147483648L
     1815            sage: long(pari("Pol(10)"))
     1816            10L
     1817            sage: long(pari("Mod(2, 7)"))
     1818            2L
     1819        """
     1820        return long(Integer(self))
    18261821   
    18271822    def __float__(gen self):
    18281823        """
  • sage/rings/finite_rings/element_ext_pari.py

    diff --git a/sage/rings/finite_rings/element_ext_pari.py b/sage/rings/finite_rings/element_ext_pari.py
    a b  
    712712            sage: int(a)
    713713            Traceback (most recent call last):
    714714            ...
    715             TypeError: gen must be of PARI type t_INT or t_POL of degree 0
     715            TypeError: Unable to coerce PARI a to an Integer
    716716        """
    717717        try:
    718718            return int(self.__value.lift().lift())