Use GMP as default implementation of integers in Python3

Victor Stinner victor.stinner at haypocalc.com
Wed Nov 5 01:16:17 CET 2008


Hi,

First, I have a questions about GMP: I'm unable to find the pow() function 
with only mpz_t arguments. mpz_powm() only uses mpz_t variables but it 
computes the modulo, not just base^exp. How can I compute base^exp with an 
exponent bigger than a unsigned long? Eg. 2^(2^40) with a 32 bits CPU.

--

I wrote a patch for the Python language to use the GMP library for the 
integers. My patch works correctly but Python is a little bit slower (3% to 
14%) because most of the time, integers are (very) small. I guess that the 
most common range is [-2^32-1; 2^32-1]. Should I use a better memory 
allocator? I also changed it to use Python memory managment. How can I speed 
it Python+GMP?

In Python2, an integer is 31 bits + sign and automatically switch to long 
integer (unlimited) on overflow. In Python3, all integers are long integers.
About the long integers:
 - base = 2^15 (32768)
 - multiply: grade school multiplicatin or Karatsuba (cutfoff = 70 digits,
   and 2x70 digits for square (a*a))
 - divide: no idea (see x_divrem())

The base is very small but was choosed because it works on any platform or 
CPU.

Do you know other successful integration of GMP in languages?

-- 
Victor Stinner aka haypo
http://www.haypocalc.com/blog/


More information about the gmp-discuss mailing list