#include #include #include void printint64(long long int n) { long long int M=n; int digit[20],i,len; if(M<0) printf("-"),M=-M; for(i=0;i<20;i++) digit[i]=M%10,M/=10; len=19; while((len>0)&&(digit[len]==0)) len--; while(len>=0) printf("%d",digit[len]),len--; printf("\n"); return; } int gcd(int a,int b) { int c; while(b>0) { if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) { a-=b; if(a>=b) a%=b; }}}}}}}} c=a,a=b,b=c; } return a; } int single_modinv (int a,int modulus) { /* start of single_modinv */ a%=modulus; int ps1, ps2, dividend, divisor, rem, q, t; int parity; q = 1; rem = a; dividend = modulus; divisor = a; ps1 = 1; ps2 = 0; parity = 0; while (divisor > 1) { rem = dividend - divisor; t = rem - divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; t -= divisor; if (t >= 0) { q += ps1; rem = t; if (rem >= divisor) { q = dividend/divisor; rem = dividend - q * divisor; q *= ps1; }}}}}}}}} q += ps2; parity = ~parity; dividend = divisor; divisor = rem; ps2 = ps1; ps1 = q; } if(parity==0) return (ps1); else return (modulus - ps1); } /* end of single_modinv from Mersenneforum.org*/ int main() { int N,b,w[32],A[32],L,LC,limit,temp,i,j,p,I,h,n,up,add,found; int pos,test,ord,all,p2,possible,all2,*S,*R,*pr,*primes,*isprime,np,ct,stored_LC[32]; long long int best,res,C,P,**RES,**RES2; long long int alpha,alpha2,beta,v[64],M,K,E; pr=(int*)(malloc)(6542*sizeof(int)); primes=(int*)(malloc)(6542*sizeof(int)); isprime=(int*)(malloc)(65536*sizeof(int)); for(i=0;i<65536;i++) isprime[i]=1; isprime[0]=0; isprime[1]=0; for(n=2;n<256;n++) { if(isprime[n]) { for(j=n*n;j<65536;j+=n) isprime[j]=0; } } np=0; for(n=0;n<65536;n++) if(isprime[n]) primes[np]=n,np++; scanf("%d%d%I64d%d%I64d",&N,&b,&C,&limit,&best); R=(int*) (malloc) (N*sizeof(int)); S=(int*) (malloc) (N*sizeof(int)); L=0; for(I=0;Iw[j+1]) { temp=v[j],v[j]=v[j+1],v[j+1]=temp; temp=w[j],w[j]=w[j+1],w[j+1]=temp; }}} RES=(long long int**) (malloc) (L*sizeof(long long int*)); RES2=(long long int**) (malloc) (L*sizeof(long long int*)); printf("Checking k%c%d%cn",'*',b,'^'); if(C>0) printf("%c%I64d",'+',C); else printf("%I64d",C); printf(" sequence for exponent=%d, bound for primes in the covering set=%d, bound for k is ",N,limit),printint64(best); printf("Examining primes in the covering set: "); for(i=0;i=0;i--) stored_LC[i]=gcd(w[i],stored_LC[i+1]); pos=0; for(i=0;i=0) { for(i=0;i=0) { for(j=A[i];jL-pos)) { while((pos>=0)&&(A[pos]==w[pos]-1)) pos--; if(pos>=0) A[pos]++; } else { alpha=0; beta=1; for(i=0;i<=pos;i++) { if(A[i]>=0) { alpha2=(RES[i][A[i]]*(-C))%v[i]; E=(((alpha2-alpha)%v[i])*single_modinv(beta%v[i],v[i]))%v[i]; if(E<0) E+=v[i]; alpha=E*beta+alpha; beta*=v[i]; } } K=alpha; if(all==N) { if(K1)) K+=beta; if(K=0)&&(A[pos]==w[pos]-1)) pos--; if(pos>=0) A[pos]++; } else { M=1; for(i=0;i<=pos;i++) if(A[i]>=0) M*=v[i]; if(bestK) { all=all2; for(i=0;i=0)&&(A[pos]==w[pos]-1)) pos--; if(pos>=0) A[pos]++; } else { if(pos!=L-1) { pos++; A[pos]=-1; } else { while((pos>=0)&&(A[pos]==w[pos]-1)) pos--; if(pos>=0) A[pos]++; } } } } } for(i=0;i