#include #include #include "gmp.h" int gcd(int a,int b) { if(a<0) a=-a; if(b<0) b=-b; if(a==0) return b; if(b==0) return a; 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 */ if(modulus<0) modulus=-modulus; a%=modulus; if(a<0) 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 e,n,v[256],w[256],a[256],l,lc,temp,temp2,add,g,h,i,j,p,up,found,inv,limit,**res,**res2; int pos,ord,all,p2,possible,all2,*s,*r,*pr,*primes,*isprime,np,ct,stored_lc[64]; mpz_t B; mpz_t C; mpz_t E; mpz_t G; mpz_t K; mpz_t M; mpz_t P; mpz_t RES; mpz_t BEST; mpz_t ALPHA; mpz_t ALPHA2; mpz_t BETA; mpz_t TEMP; mpz_t MINUS_C; mpz_t BMINUSONE; mpz_init(B); mpz_init(C); mpz_init(E); mpz_init(G); mpz_init(K); mpz_init(M); mpz_init(P); mpz_init(RES); mpz_init(BEST); mpz_init(ALPHA); mpz_init(ALPHA2); mpz_init(BETA); mpz_init(TEMP); mpz_init(MINUS_C); mpz_init(BMINUSONE); 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++; gmp_scanf("%d%Zd%Zd%d%Zd",&n,&B,&C,&limit,&BEST); mpz_neg(MINUS_C,C); mpz_sub_ui(BMINUSONE,B,1); r=(int*) (malloc) (n*sizeof(int)); s=(int*) (malloc) (n*sizeof(int)); l=0; for(g=0;gw[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=(int**) (malloc) (l*sizeof(int*)); res2=(int**) (malloc) (l*sizeof(int*)); gmp_printf("Checking k%c%Zd%cn",'*',B,'^'); if(mpz_sgn(C)>0) gmp_printf("%c%Zd",'+',C); else gmp_printf("%Zd",C); gmp_printf(" sequence for exponent=%d, bound for primes in the covering set=%d, bound for k is %Zd\n",n,limit,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 { mpz_set_ui(ALPHA,0); mpz_set_ui(BETA,1); for(i=0;i<=pos;i++) { if(a[i]>=0) { mpz_mul_ui(ALPHA2,MINUS_C,res[i][a[i]]); temp=mpz_mod_ui(ALPHA2,ALPHA2,v[i]); mpz_sub(E,ALPHA2,ALPHA); temp=mpz_mod_ui(E,E,v[i]); temp2=mpz_mod_ui(TEMP,BETA,v[i]); inv=single_modinv(temp2,v[i]); mpz_mul_ui(E,E,inv); e=mpz_mod_ui(E,E,v[i]); mpz_addmul_ui(ALPHA,BETA,e); mpz_mul_ui(BETA,BETA,v[i]); } } mpz_set(K,ALPHA); if(all==n) { if(mpz_cmp(K,BEST)<0) { while(1) { if(mpz_cmp(K,BEST)>=0) break; mpz_add(TEMP,K,C); mpz_gcd(G,TEMP,BMINUSONE); if(mpz_cmp_ui(G,1)==0) break; mpz_add(K,K,BETA); } if(mpz_cmp(K,BEST)<0) { mpz_add(TEMP,K,C); mpz_gcd(G,TEMP,BMINUSONE); if(mpz_cmp_ui(G,1)==0) { mpz_set(BEST,K); found=1; printf("**************** Solution found ****************\n"); gmp_printf("%Zd\n",K); } } } while((pos>=0)&&(a[pos]==w[pos]-1)) pos--; if(pos>=0) a[pos]++; } else { mpz_set_ui(M,1); for(i=0;i<=pos;i++) if(a[i]>=0) mpz_mul_ui(M,M,v[i]); if(mpz_cmp(BEST,M)<0) { all2=all; while(mpz_cmp(BEST,K)>0) { all=all2; for(i=0;i0) { all++; add=1; break; } } if(add==0) break; } } if(all==n) { mpz_add(TEMP,K,C); mpz_gcd(G,TEMP,BMINUSONE); if(mpz_cmp_ui(G,1)==0) { mpz_set(BEST,K); found=1; printf("**************** Solution found ****************\n"); gmp_printf("%Zd\n",K); } } mpz_add(K,K,M); } while((pos>=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