Advertisement
Guest User

Untitled

a guest
May 6th, 2016
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. unsigned long int rho(unsigned long int n)
  2. {
  3. if (n == 1) return n;
  4. if (n % 2 == 0) return 2;
  5.  
  6. unsigned long int y = rand() % n;
  7. unsigned long int x;
  8. unsigned long long int ys = y;
  9. unsigned long int c;
  10. do
  11. c = rand() % n;
  12. while (c == 0 || c == n - 2);
  13. unsigned long int m = 1000;
  14. unsigned long int d = 1;
  15. unsigned long int q = 1;
  16. unsigned long int r = 1;
  17. while (d == 1)
  18. {
  19. x = y;
  20. for (int i = 0; i < r; i++)
  21. {
  22. y = y * y % n;
  23. y += c;
  24. if (y < c)
  25. y += (std::numeric_limits<unsigned long>::max() - n) + 1;
  26. y %= n;
  27. }
  28. int j = 0;
  29. while (j < r && d == 1)
  30. {
  31. ys = y;
  32. for (int i = 0; i < m && i < (r-j); i++)
  33. {
  34. y = y * y % n;
  35. y += c;
  36. if (y < c)
  37. y += (std::numeric_limits<unsigned long>::max() - n) + 1;
  38. y %= n;
  39. q *= ((x>y) ? x - y : y - x) % n;
  40. }
  41. d = gcd(q, n);
  42. j += m;
  43. }
  44. r *= 2;
  45. }
  46. if (d == n)
  47. {
  48. do
  49. {
  50. ys = x * x % n;
  51. std::cout << ys << std::endl;
  52. ys += c;
  53. if (ys < c)
  54. ys += (std::numeric_limits<unsigned long>::max() - n) + 1;
  55. ys %= n;
  56. d = gcd( ((x>ys) ? x - ys : ys - x) , n);
  57. } while (d == 1);
  58. }
  59. return d;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement