Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unsigned long int rho(unsigned long int n)
- {
- if (n == 1) return n;
- if (n % 2 == 0) return 2;
- unsigned long int y = rand() % n;
- unsigned long int x;
- unsigned long long int ys = y;
- unsigned long int c;
- do
- c = rand() % n;
- while (c == 0 || c == n - 2);
- unsigned long int m = 1000;
- unsigned long int d = 1;
- unsigned long int q = 1;
- unsigned long int r = 1;
- while (d == 1)
- {
- x = y;
- for (int i = 0; i < r; i++)
- {
- y = y * y % n;
- y += c;
- if (y < c)
- y += (std::numeric_limits<unsigned long>::max() - n) + 1;
- y %= n;
- }
- int j = 0;
- while (j < r && d == 1)
- {
- ys = y;
- for (int i = 0; i < m && i < (r-j); i++)
- {
- y = y * y % n;
- y += c;
- if (y < c)
- y += (std::numeric_limits<unsigned long>::max() - n) + 1;
- y %= n;
- q *= ((x>y) ? x - y : y - x) % n;
- }
- d = gcd(q, n);
- j += m;
- }
- r *= 2;
- }
- if (d == n)
- {
- do
- {
- ys = x * x % n;
- std::cout << ys << std::endl;
- ys += c;
- if (ys < c)
- ys += (std::numeric_limits<unsigned long>::max() - n) + 1;
- ys %= n;
- d = gcd( ((x>ys) ? x - ys : ys - x) , n);
- } while (d == 1);
- }
- return d;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement