标签:return ll Pollard 因子 rho ans quick now mod
vector<ll> fac;
ll quick_mult(ll a, ll b, ll mod) {
ll ans = 0;
while(b) {
if(b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
ll quick_pow(ll a, ll n, ll mod) {
ll ans = 1;
while(n) {
if(n & 1) ans = quick_mult(ans, a, mod);
a = quick_mult(a, a, mod);
n >>= 1;
}
return ans;
}
bool miller_rabin(ll n) {
if(n == 2) return true;
if(n < 2 || !(n & 1)) return false;
ll s = 0, d = n - 1;
while(!(d & 1)) {
d >>= 1;
s++;
}
for(int i = 1; i <= 11; i++) {
ll a = rand() % (n - 2) + 2;
ll now = quick_pow(a, d, n), pre = now;
for(int j = 1; j <= s; j++) {
now = quick_mult(now, now, n);
if(now == 1 && pre != 1 && pre != n - 1) return false;
pre = now;
}
if(now != 1) return false;
}
return true;
}
ll pollard_rho(ll n, int c) {
ll x, y, i = 1, k = 2;
x = y = rand() % (n - 2) + 2;
for( ; ; ) {
i++;
x = (quick_mult(x, x, n) + c) % n;
ll g = __gcd(y - x, n);
if(g > 1 && g < n) return g;
if(x == y) return n;
if(i == k) y = x, k <<= 1;
}
}
void find_fac(ll n) { //调用此函数,因子保存在fac中
if(n == 1) return ;
if(miller_rabin(n)) {
fac.push_back(n);
return;
}
ll p = n;
int c = 1111;
while(p >= n) p = pollard_rho(p, c--);
find_fac(p);
find_fac(n / p);
}
标签:return,ll,Pollard,因子,rho,ans,quick,now,mod 来源: https://blog.csdn.net/qq_45929432/article/details/121177780
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。