首页 > 其他分享 >Pollard Rho

Pollard Rho

时间:2022-11-14 20:55:10浏览次数:44  
标签:prd ch return Rho Pollard ull ans mul

Pollard Rho

从未如此美妙的开局,请为我欢呼,为我喝彩,ok?

快速乘使用黑科技,取前\(12\)个质数可以保证正确性,注意Pollardt++ % 40不要打错。

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#define vi vector<ull> 
using namespace std;
template <typename T>
inline void read(T &x) {
	x = 0; int f = 0; char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
	for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
	if(f) x = ~x + 1;
}
using LL = long long;
using ull = unsigned long long;
ull mul(ull x, ull y, ull P) {
	LL res = x * y - P * ull(1.L / P * x * y);
	return res + P * (res < 0) - P * (res >= (LL)P);
}
ull fpow(ull x, ull pnt, ull P) {
	if(x >= P) x %= P;
	ull res = 1;
	for(; pnt; pnt >>= 1, x = mul(x, x, P)) 
		if(pnt & 1) res = mul(res, x, P);
	return res;
} 
const ull A[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}; 
bool isPrime(ull n) {
	if(n < 3 || !(n & 1)) return n == 2;
	ull s = __builtin_ctz(n - 1), t = n >> s;
	for(ull a : A) {
		ull p = fpow(a, t, n), i = s;
		while(p != 1 && p != n - 1 && a % n && i--) 
			p = mul(p, p, n);
		if(p != n - 1 && i != s) return false;
	}
	return true;
}
ull pollard(ull n) {
	auto f = [n](ull x) {return mul(x, x, n) + 1;};
	ull x = 0, y = 0, t = 30, prd = 2, i = 1, q;
	while(t++ % 40 || __gcd(prd, n) == 1) {
		if(x == y) x = ++i, y = f(x);
		if((q = mul(prd, max(x, y) - min(x, y), n))) prd = q;
		x = f(x), y = f(f(y));
	}
	return __gcd(prd, n);
}
vi factor(ull n) {
	if(n == 1) return {};
	if(isPrime(n)) return {n};
	ull x = pollard(n);
	auto l = factor(x), r = factor(n / x);
	for(auto x : r) l.emplace_back(x);
	return l;
}
int T;
int main() {
	read(T);
	while(T--) {
		ull n;
		read(n);
		vi fac = factor(n);
		ull ans = 0;
		for(auto i : fac) ans = max(ans, i);
		if(ans == n) puts("Prime");
		else printf("%llu\n",ans);
	}
}

标签:prd,ch,return,Rho,Pollard,ull,ans,mul
From: https://www.cnblogs.com/DCH233/p/16890366.html

相关文章

  • P4718 【模板】Pollard-Rho算法
    题目链接P4718【模板】Pollard-Rho算法题目描述MillerRabin算法是一种高效的质数判断方法。虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接......
  • 欧拉路径与Hierholzer算法
    欧拉路径:如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Eulerpath)。欧拉回路:如果一个回路是欧拉路径,则称为欧拉回路(Eulercircuit)。具有欧拉回路的图......
  • 学习 pyrhon进阶 魔法函数 持续更新
        delstu#手动回收对象stu当右键运行py文件的时候当做脚本文件运行运行结束后会回收变量  结果 ......
  • 问题 N: Number Multiplication --Pollard-Rho算法质因数分解
    问题N:NumberMultiplication题意:给你m个M点,n个N点,M都是质数,N是和它相连的M的乘积,然后告诉你每个N点的值,求M点直接对每个N分解质因数即可,测试欧拉筛筛到4e7再......