#include #include #include #include /* we can pack the pairs into integers… */ #define P(a,b) (( (a-'A')<<6 )| (b-'A')) /* …and use them as keys for a lookup table */ enum {maxk=P('Z'+1,'Z')}; MP_INT counts[maxk], tcounts[maxk]; void pcounts(int c) { int i,k; MP_INT min,max,n; mpz_init(&min); mpz_init(&max); mpz_init(&n); for(i='A';i<='Z';i++) { k=P(i,'z'); mpz_set(&n, &counts[k]); if (mpz_cmp_ui(&n,0)){ if (!mpz_cmp_ui(&min,0)) mpz_set(&min,&n); if (mpz_cmp(&n, &min) < 0) mpz_set(&min,&n); else if (mpz_cmp(&n, &max) > 0) mpz_set(&max,&n); } } mpz_sub(&n, &max, &min); char *r = mpz_get_str(NULL, 10, &n); size_t rlen = strlen(r); if (rlen > 20) printf("%d iterations: %lu digits %.10s...%s\n", c, rlen, r, r+(rlen-10)); else printf("%d iterations: %s\n", c, r); free(r); mpz_clear(&min); mpz_clear(&max); mpz_clear(&n); } int main(int argc, char **argv) { char tmpl[128], rules[128][3]={0}; int i,j,k, maxiter=40; MP_INT n; if (argc > 1) sscanf(argv[1], "%d",&maxiter); mpz_init(&n); for(i=0;i %c\n", &rules[i][0], &rules[i][1], &rules[i][2])==3;i++); for(i=0;i