63位数的质因子分解随机算法 #include <iostream> #include <algorithm> #include <ctime> #include <cstdlib> using namespace std; __int64 mod_mul(__int64 x, __int64 y, __int64 n)//(x*y) mod n { if (!x) return 0; return (((x & 1) * y) % n + (mod_mul(x >> 1, y, n) << 1) % n) % n; } __int64 powermod(__int64 a, __int64 b, __int64 c)//a^b mod c { __int64 r; for (r = 1; b; b >>= 1) { if (b & 1) r = mod_mul(r, a, c); a = mod_mul(a, a, c); } return r; } __int64 myrand() { __int64 a = rand(); return a * rand(); } bool witness(__int64 a, __int64 n) { __int64 u; int t = 0; for (u = n - 1; !(u & 1); u >>= 1) ++t; __int64 x0 = powermod(a, u, n); __int64 x1; for (int i = 1; i <= t; ++i) { x1 = mod_mul(x0, x0, n); if (x1 == 1 && x0 != 1 && x0 != n - 1) return false; x0 = x1; } if (x1 != 1) return false; return true; } bool rabin_miller(__int64 n, int times) { __int64 a; if (n < 2) return false; if (n == 2) return true; if (!(n & 1)) return false; for(int i = 0; i < times; ++i) { a = myrand() % (n - 1) + 1; if (!witness(a, n)) return false; } return true; } __int64 func(__int64 x, __int64 n) { return (mod_mul(x, x, n) + 1) % n; } __int64 gcd(__int64 a, __int64 b) { while (b) { __int64 temp = a % b; a = b; b = temp; } return a; } __int64 ans[100]; __int64 ansn = 0; void pollard(__int64 n, int times) { int i; __int64 x, y, p; if (rabin_miller(n, times)) { ans[ansn ++] = n; return; } if (!(n & 1)) { pollard(2, times); pollard(n >> 1, times); return; } for (i = 1; i < times; ++i) { x = i; y = func(x, n); p = gcd(y - x, n); while (p == 1) { x = func(x, n); y = func(func(y, n), n); p = gcd((y - x + n) % n, n) % n; } if (p == 0 || p == n) continue; pollard(p, times); pollard(n / p, times); return; } } int main() { srand((unsigned)time(NULL)); __int64 n; int times = 20; cin >> n; pollard(n, times); sort(ans, ans + ansn); if (n < 0) { cout << "-"; } if (ansn > 0) { cout << ans[0]; } else cout << n; for (__int64 i = 1; i < ansn; ++i) { cout << "*" << ans[i]; } cout << "=" << n << endl; return 0; }