#include #include #include #include #include #include #include #include using namespace std; int main(int argc, char *argv[]) { mpz_t s,crt1,crt2,crt3; long a,b,c,d,i,j,n,o,p,q,qq,min,max,maxprime,prime,filelen,minvalue,minval,minval2; clock_t begin,tt; FILE *file,*fil,*fil2; long prim[10000]; char str1[100],str2[100],str3[100],str4[100],str[100],crt[100]; __uint128_t ull1,ull2,ull3; mpz_init_set_ui(s,1); mpz_init_set_ui(crt1,1); mpz_init_set_ui(crt2,1); mpz_init_set_ui(crt3,1); const long interval=1700; if (argc>1) { maxprime=31; if (argc!=3) { maxprime=atol(argv[1]); } if (maxprime<19) { maxprime=19; } prime=-1; mpz_set_ui(s,1); do { prime++; mpz_nextprime(s,s); prim[prime]=mpz_get_ui(s); } while(prim[prime] buf[prime+1]; long ii[prime]; srand(time(NULL)); for(i=0;i<=prime;i++) { ii[i]=0; if (maxprime>41) { ii[i]=rand()%prim[i]; } } a=sprintf(str,"%i-%i.txt",interval,maxprime); strcpy(str1,"primeinterval"); strcat(str1,str); strcpy(str2,"primeintervalminmax"); strcat(str2,str); strcpy(str3,"primeintervalstatus"); strcat(str3,str); n=0; min=100000; max=0; begin=clock(); begin=clock(); tt=begin; if (argc!=3) { file=fopen(str1,"ab"); printf("interval=%i maxprime=%i\n",interval,prim[prime]); } if (argc==2) { if (maxprime<=41) { fil=fopen(str3,"rb"); if (fil!=NULL) { fscanf(fil,"%i %i %i %i %i %i %i %i",&ii[1],&ii[2],&ii[3],&ii[4],&ii[5],&ii[6],&min,&max); fclose(fil); } } while(ii[1]max) { max=j; fil=fopen(str2,"ab"); printf("\rmax:%i ",j); fprintf(fil,"max:%i ",j); for(a=1;a<=prime;a++) { printf(" %i",ii[a]); fprintf(fil,"%i ",ii[a]); } printf(" \n"); fputc(13,fil); fputc(10,fil); fclose(fil); } if (j41) { if ((clock()-begin)>600000) { begin=clock(); for(a=0;a<=prime;a++) { ii[a]=rand()%prim[a]; } } } n=prime; ii[n]++; a=0; do { if (ii[n]>=prim[n]) { ii[n]=0; n--; ii[n]++; } else { a=1; } } while(a==0 && n>1); if (n<=(prime-5+(maxprime>59))) { if (n<=(prime-6+(maxprime>59))) { fflush(file); } printf("\r"); for(a=1;a<=prime;a++) { printf(" %i",ii[a]); } printf(" min:%i max:%i time(ms):%i ",min,max,clock()-begin); } if (n<=6 && maxprime<=41) { if ((clock()-tt)>60000) { fil=fopen(str3,"wb"); fprintf(fil,"%i %i %i %i %i %i %i %i",ii[1],ii[2],ii[3],ii[4],ii[5],ii[6],min,max); fclose(fil); tt=clock(); } } } } if (argc==3) { fil2=fopen(argv[1],"rb"); minvalue=atol(argv[2]); fseek(fil2,0,SEEK_END); filelen=ftell(fil2); fseek(fil2,0,SEEK_SET); strcpy(str4,argv[1]); a=strlen(str4); str4[a-4]=67; str4[a-3]=82; str4[a-2]=84; str4[a-1]=46; str4[a]=116; str4[a+1]=120; str4[a+2]=116; str4[a+3]=0; fil=fopen(str4,"ab"); q=0; do { b=0; for(i=0;i<=prime;i++) { ii[i]=0; } do { d=0; fscanf(fil2,"%i",&b); if (b==minvalue) { do { do { c=fgetc(fil2); } while((c<48 || c>57) && c!=10 && c!=9); if (c>=48 && c<=57) { d++; while(c>=48 && c<=57) { ii[d]=10*ii[d]+(c-48); c=fgetc(fil2); } } if (c==9) { do { c=fgetc(fil2); } while(c!=10); } } while(c!=10); } else { do { c=fgetc(fil2); } while(c!=10); } } while(b!=minvalue && (filelen-ftell(fil2))>10); if (b==minvalue) { prime=d; q++; printf("Loaded result #%i: %i ",q,b); for(i=1;i<=prime;i++) { printf("%i ",ii[i]); } fprintf(fil,"%i ",b); for(a=1;a<=prime;a++) { fprintf(fil,"%i ",ii[a]); } mpz_set_ui(crt1,1); mpz_set_ui(crt2,2); a=0; do { a++; o=1; while(o!=0) { mpz_add_ui(crt3,crt1,(2*ii[a])); o=mpz_tdiv_r_ui(crt3,crt3,prim[a]); if (o!=0) { mpz_add(crt1,crt1,crt2); } } mpz_mul_ui(crt2,crt2,prim[a]); mpz_mod(crt1,crt1,crt2); } while(a10); fclose(fil); } if (argc==4) { fil2=fopen(argv[2],"rb"); minvalue=atol(argv[3]); minval2=minvalue+2; fseek(fil2,0,SEEK_END); filelen=ftell(fil2); fseek(fil2,0,SEEK_SET); qq=0; do { fscanf(fil2,"%i",&minval); if (minval<=minval2) { qq++; } do { d=fgetc(fil2); } while(d!=10 && !feof(fil2)); } while(filelen-ftell(fil2)>10); q=0; do { fseek(fil2,0,SEEK_SET); do { minval=0; for(i=0;i<=prime;i++) { ii[i]=0; } do { d=0; fscanf(fil2,"%i",&minval); if (minval==minvalue) { do { do { c=fgetc(fil2); } while((c<48 || c>57) && c!=10 && c!=9); if (c>=48 && c<=57) { d++; while(c>=48 && c<=57) { ii[d]=10*ii[d]+(c-48); c=fgetc(fil2); } } if (c==9) { do { c=fgetc(fil2); } while(c!=10); } } while(c!=10); } else { do { c=fgetc(fil2); } while(c!=10); } } while(minval!=minvalue && (filelen-ftell(fil2))>10); if (minval==minvalue) { q++; printf("\rLoaded result #%i of %i: %i ",q,qq,minval); for(i=1;i<=d;i++) { printf("%i ",ii[i]); } printf(" \nmin:%i max:%i ",min,max); } p=ii[d]; n=0; while(ii[d]==p && minval==minvalue) { for(i=n;i<=prime;i++) { if (i==1) { buf[1].set(); } else { buf[i]=buf[i-1]; } j=ii[i]; while(jmax) { max=j; fil=fopen(str2,"ab"); printf("\rmax:%i ",j); fprintf(fil,"max:%i ",j); for(a=1;a<=prime;a++) { printf(" %i",ii[a]); fprintf(fil,"%i ",ii[a]); } printf(" \n"); fputc(13,fil); fputc(10,fil); fclose(fil); } if (j=prim[n]) { ii[n]=0; n--; ii[n]++; } else { a=1; } } while(a==0 && n>1); if (n<=(prime-5+(maxprime>59))) { if (n<=(prime-6+(maxprime>59))) { fflush(file); } printf("\r"); for(a=1;a<=prime;a++) { printf(" %i",ii[a]); } printf(" min:%i max:%i time(ms):%i ",min,max,clock()-begin); } } fflush(file); } while((filelen-ftell(fil2))>10); minvalue++; } while(minvalue<=minval2); printf("\nmin:%i max:%i\n",min,max); } fclose(file); } else { printf("primeinterval.exe maxprime [filename minvalue]\n"); printf("maxprime: 19-101\n"); printf("filename: filename to load previous solution from\n"); printf("minvalue: minimum solution value in [filename]\n\n"); printf("primeinterval.exe filename value\n"); printf("Load previous solution with \"value\" from filename and calculate CRT values to new file\n"); } /**/ return 0; }