Advertisement
Guest User

Untitled

a guest
Oct 7th, 2015
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */
  5. #include "gmp.h"
  6. //#define LIMIT 4000000000U
  7. #define LIMIT 10000000U
  8. #define PRIMEN 40
  9. const int mask[8]={
  10. 0x01,
  11. 0x02,
  12. 0x04,
  13. 0x08,
  14. 0x10,
  15. 0x20,
  16. 0x40,
  17. 0x80
  18. };
  19. //typedef unsigned int uint128_t __attribute__((mode(TI)));
  20. #define GETNOTPOSSIBLE(x)   (notpossible[(x)>>3]& mask[(x)&7])
  21. #define SETNOTPOSSIBLE(x)   (notpossible[(x)>>3]|=mask[(x)&7])
  22. #define SETPOSSIBLE(x)      (notpossible[(x)>>3]&=~(mask[(x)&7]))z
  23. //#define mulmod(a,b,m)  (unsigned long long int)(((uint128_t)(a)*(uint128_t)(b)) % ((uint128_t)(m)))
  24. int main(void)
  25. {
  26.     printf("Calculating\n");
  27.     mpz_t x;
  28.     mpz_t legp;
  29.     mpz_init(x);
  30.     mpz_init(legp);
  31.     mpz_t mpztemp;
  32.     mpz_init(mpztemp);
  33.     int i=0,j=0,k=0;
  34.     long long majorcounter=1,minorcounter=0;
  35.     unsigned long long int temp;
  36.     mpz_set_ui(x, LIMIT);
  37.     unsigned long int testprimes[PRIMEN]={0};
  38.     unsigned long int partialresidue[PRIMEN];
  39.     for(i=0;i<PRIMEN;++i){
  40.         mpz_nextprime(x,x);
  41.         partialresidue[i]=1;
  42.         testprimes[j++]=mpz_get_ui(x);
  43.     }
  44.     const unsigned int STEP=LIMIT/1000;
  45.     char* notpossible=(char*)calloc(STEP/8+1,1);
  46.     clock_t t = clock();
  47.     while(majorcounter<LIMIT){
  48.         printf("Going from %llu ",majorcounter);
  49.         printf("to %llu, ",majorcounter+STEP);
  50.         printf("%d-1000\n",++k);
  51.         for(j=0;j<PRIMEN;++j){
  52.             mpz_set_ui(legp,testprimes[j]);
  53.             for(minorcounter=0,temp=partialresidue[j],mpz_set_ui(mpztemp,partialresidue[j]);minorcounter<STEP;++minorcounter){//calcular el residuo parcial para el numero primo actual
  54.                 i=minorcounter+majorcounter;//actual numero. Nota: Ya que majorcounter empieza en 1, esto nunca sera cero, por lo tanto no cancelara los datos de la variable temp
  55.                 //temp*=i;
  56.                 //temp%=testprimes[j];
  57.                 mpz_mul_ui(mpztemp,mpztemp,i);
  58.                 mpz_mod_ui(mpztemp,mpztemp,testprimes[j]);
  59.                 //mulmod(temp,i,testprimes[j]);
  60.                 if(GETNOTPOSSIBLE(minorcounter)) continue;//Ya ha sido marcado como un candidato imposible, saltarlo
  61.                 mpz_set_ui(x,mpz_get_ui(mpztemp)+1);
  62.                 int legendre=mpz_legendre(x,legp);//verificar si n!+1 (mod m) es un residuo cuadratico modulo m
  63.                 if(legendre==-1) SETNOTPOSSIBLE(minorcounter);//si no lo es, definitivamente no es un cuadrado, eliminarlo como posiblidad
  64.             }
  65.             //partialresidue[j]=temp;
  66.             partialresidue[j]=mpz_get_ui(mpztemp);
  67.         }
  68.         for(i=0;i<STEP;++i){//verificar la verdad de la conjetura
  69.             if(GETNOTPOSSIBLE(i)==0)
  70.                 printf("%d\n",majorcounter+i);
  71.         }
  72.         memset(notpossible,0,STEP/8);//Vaciar el array
  73.         majorcounter+=STEP;
  74.     }  
  75.     /* free used memory */
  76.     printf("Clicks taken: %d\n",clock()-t);
  77.     mpz_clear(x);
  78.     mpz_clear(legp);
  79.     free(notpossible);
  80.     printf("Finishing");
  81.     return EXIT_SUCCESS;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement