Karim Belabas on Wed, 05 Dec 2007 00:21:23 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Can PARI use GNU MP integers and rationals? |
* Himanshu Jain [2007-12-04 23:13]: > Hi everybody, > > I am new to PARI/GP. The problem I am working > on contains numbers in GNU MP format. I need to use > the PARI library as well. > > Is there some way of converting GNU MP types mpz_t, > mpq_t to t_INT, t_FRAC using PARI library > routines. > > Some solutions I have in mind: first convert mpz_t to usual C > type say signed long and then convert that to t_INT. This may not > always work if the original mpz_t is large. Another idea is to convert > mpz_t to char* and then use gp_read_stream to obtain a GEN type. ( gp_read_str ) > Are there better solutions? Using GMP's documented interface, I don't think so. Glancing at the contents of /usr/include/gmp.h, something like the following should work in practice [ completely untested code follows ] : #define LIMBS(x) ((mp_limb_t *)((x)+2)) #define NLIMBS(x) (lgefint(x)-2) void GEN2mpz(mpz_t X, GEN x) { long l = NLIMBS(x); X->_mp_alloc = l; X->_mp_size = signe(x) > 0? l: -l; X->_mp_d = LIMBS(x); /* shallow! */ } GEN mpz2GEN(mpz_t X) { long l = X->_mp_size, lx = labs(l)+2; GEN x = cgeti(lx) x[1] = evalsigne(l > 0? 1: -1) | evallgefint(lx); for (i = 2; i < lx; i++) x[i] = X->_mp_d[i-2]; } Possibly after fixing the above (so that it compiles and runs as intended), implementing mpq2GEN and GEN2mpq should be easy, e.g. GEN mpq2GEN(mpq_t Q) { return gdiv(mpz2GEN(Q->_mpnum), mpz2GEN(Q->_mp_den)); } or (cleaner) GEN mpq2GEN(mpq_t Q) { pari_sp av = avma; return gerepileupto(av, gdiv(mpz2GEN(Q->_mpnum), mpz2GEN(Q->_mp_den)); } Hope this helps, K.B. -- Karim Belabas Tel: (+33) (0)5 40 00 26 17 Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `