Advertisement
Guest User

Untitled

a guest
Jan 27th, 2013
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <mpir.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6.  
  7. struct KeyValue{
  8.     uint64_t value;
  9.     unsigned int key;
  10. };
  11.  
  12. int compare(const void* a, const void* b){
  13.     return ( ((KeyValue*)a)->value - ((KeyValue*)b)->value );
  14. }
  15.  
  16. bool find_in_array(KeyValue* arr, size_t len, uint64_t x, unsigned int &key){
  17.     size_t first = 0;
  18.     size_t last = len;
  19.  
  20.     size_t mid;
  21.     if(last == 0)
  22.         return false;
  23.     if(arr[0].value > x)
  24.         return false;
  25.     if (arr[len - 1].value < x)
  26.         return false;
  27.     while (first < last){
  28.         mid = first + (last - first) / 2;
  29.         if (x <= arr[mid].value){
  30.             last = mid;
  31.         }else{
  32.             first = mid + 1;
  33.         }
  34.     }
  35.     if(arr[last].value == x){
  36.         key = arr[last].key;
  37.         return true;
  38.     }
  39.     return false;
  40. }
  41.  
  42.  
  43. int main(){
  44.         mpz_t a, b, m;
  45.         mpz_init_set_str(a,"2",10);
  46.         mpz_init_set_str(b,"2",10);
  47.         mpz_init_set_str(m,"7",10);
  48.         const unsigned long long  n = 4;
  49.  
  50.         KeyValue* mem = (KeyValue*)calloc(n+1, sizeof(KeyValue));
  51.        
  52.  
  53.         KeyValue* memp = mem;
  54.         mpz_t tmp; mpz_init_set(tmp,b);
  55.         mpz_t tmp2; mpz_init(tmp2);
  56.        
  57.        
  58.         for(unsigned int x1=0;x1<=n;++x1){
  59.             mpz_export(&(memp->value),NULL,0,sizeof(uint64_t),0,0,tmp);
  60.             memp->key = x1;
  61.             mpz_mul(tmp, tmp, a);
  62.             mpz_mod(tmp,tmp,m);
  63.             memp++;
  64.         }
  65.         printf("Table is build!\n");
  66.         qsort(mem,n+1,sizeof(KeyValue),compare);
  67.         printf("Table is sorted!\n");
  68.         mpz_set_ui(tmp, 1);
  69.         mpz_powm_ui(tmp2,a,n,m);
  70.         uint64_t export_value;
  71.         unsigned int x1;
  72.         mpz_t tmp3; mpz_init(tmp3);
  73.         for(unsigned int x0=0;x0<=n;++x0){
  74.             mpz_export(&export_value,NULL,0,sizeof(uint64_t),0,0,tmp);
  75.             if(find_in_array(mem, n+1, export_value, x1)){
  76.                 //printf("Founded: %u    ", export_value);
  77.                 mpz_set_ui(tmp3, x0*n - x1);
  78.                 if(mpz_cmp(tmp3, m) == -1){
  79.                     printf("Answer: %u\n", x0*n - x1);
  80.                     break;
  81.                 }
  82.             }
  83.             mpz_mul(tmp, tmp, tmp2);
  84.             mpz_mod(tmp,tmp,m);
  85.         }
  86.         free(mem);
  87.         return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement