Guest User

Untitled

a guest
May 23rd, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. void shanksTonelliAlg(mpz_t res, mpz_t prime, mpz_t n)
  2. {
  3.  
  4. int s;
  5. mpz_t tmp, Q, W, R, V;
  6. mpz_init(tmp); mpz_sub_ui(tmp, prime, 1);
  7. mpz_init(Q); mpz_init(W); mpz_init(R); mpz_init(V);
  8.  
  9. s = mpz_scan1 (tmp, 0); // p-1 = Q2^s
  10. mpz_div_2exp(Q, tmp, s);
  11.  
  12. while(true)
  13. {
  14. mpz_random(W, 2);
  15. mpz_mod(W, W, prime);
  16. if(mpz_legendre(W, prime) == -1)
  17. break;
  18. }
  19.  
  20.  
  21. mpz_add_ui(tmp, Q, 1);
  22. mpz_div_2exp(tmp, tmp, 1);
  23. mpz_powm(R, n, tmp, prime); // X = n^(Q-1)/2 mod p
  24.  
  25. mpz_powm(V, W, Q, prime); // Y = w^Q mod p
  26.  
  27. mpz_t inv, RR;
  28. mpz_init_set(inv, n); mpz_init(RR);
  29. mpz_invert(inv, inv, prime);
  30.  
  31. while(true)
  32. {
  33. mpz_mul(RR, R, R);
  34. mpz_mul(RR, RR, inv);
  35. int i;
  36. for(i = 0; i < s; i++)
  37. {
  38. mpz_mod(RR, RR, prime);
  39. if(mpz_cmp_ui(RR, 1) == 0)
  40. break;
  41. mpz_mul(RR, RR, RR);
  42. }
  43. if(i == 0)
  44. break;
  45. mpz_set_ui(tmp, 1);
  46. mpz_mul_2exp(tmp, tmp, s-i-1);
  47. mpz_powm(tmp, V, tmp, prime);
  48. mpz_mul(R, R, tmp);
  49. mpz_mod(R, R, prime);
  50. }
  51. mpz_set(res, R);
  52. }
Add Comment
Please, Sign In to add comment