#include #include #include #include "gmp.h" /* pow10tab[i] = 10^{2^i} */ mpz_t pow10tab[32]; int pow10tabdigs[32]; int pow10tabdoneto; void maketabs(int i) { if (i == 0) { mpz_init_set_ui(pow10tab[0],10); pow10tabdoneto = 0; pow10tabdigs[0] = 1; for (i = 1;i <= 31;i++) pow10tabdigs[i] = 2 * pow10tabdigs[i-1]; } else { while (i > pow10tabdoneto) { mpz_init(pow10tab[++pow10tabdoneto]); mpz_pow_ui(pow10tab[pow10tabdoneto],pow10tab[pow10tabdoneto-1],2); } } } char *my_mpz_get_str(mpz_t x,char *p,int len) { mpz_t q,r; int i,j; char buffer[30]; i = mpz_sizeinbase(x,10); if (i <= 20) { if (len == 0) { mpz_get_str(p,10,x); } else { mpz_get_str(buffer,10,x); j = strlen(buffer); while (j < len) { j++; *p++ = '0'; } strcpy(p,buffer); } return strchr(p,0); } for (j = 0;pow10tabdigs[j] < i-1;j++); j--; maketabs(j); mpz_init(q); mpz_init(r); mpz_fdiv_qr(q,r,x,pow10tab[j]); if (len == 0) { p = my_mpz_get_str(q,p,0); } else { p = my_mpz_get_str(q,p,len-pow10tabdigs[j]); } p = my_mpz_get_str(r,p,pow10tabdigs[j]); mpz_clear(r); mpz_clear(q); return p; } int main(void) { mpz_t x,y; char *p; int i; maketabs(0); mpz_init(x); mpz_init_set_str(y,"12345678901",10); mpz_pow_ui(x,y,11111); p = malloc(1000000); for (i = 0;i < 100;i++) { my_mpz_get_str(x,p,0); } /*puts(p);*/ free(p); mpz_clear(x); mpz_clear(y); return 0; }