|Bill Allombert on Fri, 28 May 2010 00:09:09 +0200|
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
|Re: integer representation in pari|
On Thu, May 27, 2010 at 05:27:00PM -0400, Sam Steingold wrote: > Hi, > It appears that integers are represented differently on different platforms. > Specifically, the "byte" order is different. > I have two machines, both little-endian: > 32bit AMD with "GP/PARI CALCULATOR Version 2.3.4 (released)" > 64bit Intel Pentium D with "GP/PARI CALCULATOR Version 2.3.5 (released)" Unfortunately this is the next line which is of importance here. Specifically, it depends whether you use the GMP kernel or the PARI kernel. > (gdb) p readseq("7906420317433764459701366445") > $1 = 11282736 Instead of using the debugger, you could just \x in gp: 7906420317433764459701366445 \x [&=00000000010b6940] INT(lg=4,CLONE):0300000000000004 (+,lgefint=4):4000000000000004 3cbd223800046ead 00000000198c09a0 > so we can see that the number is represented as 3 "32-bit bytes" in > positions 2,3,4, > ***LOW*** bytes first So you use the GMP kernel on 32bit. > 64-bit machine: > (+ (ash 428607904 64) 4376692036787793581) > => 7906420317433764459701366445 > > so we can see that the number is represented as 2 "64-bit bytes" in > positions 2,3, > ***HIGH*** bytes first. So you use the PARI kernel on 64bit. > Where is this documented? In the documentation. Try ??libpari and look up the definition of t_INT page 21. > Where is this behavior defined? You can use ./Configure --with-gmp or ./Configure --without-gmp to force one kernel to be used. (--without-gmp is the default for PARI 2.3, --with-gmp is the default for PARI 2.4.3) > How do I know what byte order is used on which platform? Looks at the name of the libpari library: if it is named libpari-gmp.so.2 then it is using the GMP kernel. You can also check whether the C macro PARI_KERNEL_GMP is defined, but usually it is better to use int_W() to acces the mantissa. Cheers, Bill.