#include #include #include "../../primes/primetab.cc" typedef long long ptype; typedef long long pptype; // primepowers static const int blocksize=250000; static ptype phi[blocksize]; static ptype val[blocksize]; static const int nump=10000; ptype gcd(ptype h, ptype l) { while(l) { h%=l; if(!h)return l; l%=h; } return h; } int main(int i, char**argv) { ptype min=00000000ll; int interesting=0; while(min<600000000ll) { const ptype proxymin=min+!min; const int proxysize=blocksize-!min; fprintf(stderr, "BLOCK: %lli + %i\n", proxymin, proxysize); fflush(NULL); for(int i=0; iproxymin+proxysize) break; // only trial divide to half way ptype phicontrib=p-1; pptype pp=1; pptype index; do { pp*=p; index=pp-1; // as far into the array as we could ever start index-=(proxymin+index)%pp; // now index>=0 in array, do this one //if(0 && index %lli ; %lli (%lli left)\n", // index+proxymin, pp, val[index], phi[index], // (index+proxymin)/val[index]); index+=pp; } phicontrib=p; } while(index>=pp); } for(int i=0; i>1)) { // must factorise // printf("%u has prime %u left\n", (proxymin+i), (proxymin+i)/val[i]); ph *= (p/val[i]-1); } // want p-1 (thanks Erick!) --p; ptype g=gcd(p, ph); if(ph<100*g) { ++interesting; printf("%i) p=%lli phi=%lli (gcd=%lli) ratio=%lli/%lli\n", interesting, p+1, ph, g, p/g, ph/g); } } min+=blocksize; } }