BigInt BigInt::PowModN(BigInt a, BigInt k, BigInt n) { BigInt A = a, b = BigInt("1"); if (k == 0) return b; if (k.Number[0] == 1) b = a; for (ll i = 1; i < k.Number.size(); i++) { A = A.KaratsubaMultiply(A) % n; if (k.Number[i]) b = A.KaratsubaMultiply(b) % n; } return b; }
BigInt BigInt::PollardP_get_factor(BigInt N) { srand(time(NULL)); ll x0_tmp = rand(); BigInt x; x = x0_tmp; x = x%N; BigInt y("1"); ll stage = 2; ll i = 0; while (gcd(N, x - y) == BigInt("1")) { if (i == stage) { y = x; stage *= 2; } x = (x.KaratsubaMultiply(x) + BigInt("1")) % N; i++; } return gcd(N, x - y); }