惭愧啊,打了半天的Miller_Rabin算法,老了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mul(ll x, ll y, ll P) {
x %= P; y %= P;
return (x * y - (ll)((long double)x * y / P + 0.5) * P + P) % P;
}
ll _pow(ll x, ll n, ll P) {
ll ret = 1;
for ( ; n; n >>= 1, x = mul(x, x, P)) {
if( n & 1) {
ret = mul(ret, x, P);
}
}
return ret;
}
ll _fdp[6] = {2LL, 3LL, 13LL, 17LL, 61LL, 19260817LL};
bool MR(ll n) {
if( n <= 1) {
return false;
}
for ( int i = 0; i <= 5; ++ i) {
if( n == _fdp[i]) {
return true;
}
}
for ( int i = 0; i <= 5; ++ i) {
if( n % _fdp[i] == 0) {
return false;
}
}
for ( int i = 0; i <= 5; ++ i) {
ll tmp = n - 1;
while( !(tmp & 1)) {
tmp >>= 1;
}
ll s = _pow(_fdp[i], tmp, n);
while( s != n-1 && s != 1 && tmp != n-1) {
tmp <<= 1, s = mul(s, s, n);
}
if( s != n-1 && !(tmp&1)) return false;
}
return true;
}
int main() {
}
质因数分解法Pollard Rho
ll PR(ll n, ll c) {
ll i = 0,k = 2LL, x, y;
x = y = 1LL + rand() % (n - 1);
while( 1) {
x = (mul(x, x, n) + c) % n;
ll d = __gcd((y - x + n) % n, n);
if( d != 1 && d != n) {
return d;
}
if( x == y) {
return n;
}
if( ++ i == k) {
y = x, k <<= 1;
}
}
}
vector<int> prim;
inline void fct(ll n) {
if( n == 1) {
return;
}
if( MR(n)){
return (void)(prim.push_back(n));
}
ll p = n;
for(int c = 233; p == n; -- c) {
p = PR(p, c);
}
fct(p); fct(n / p);
}