Pollard-Rho
Rho \(\rho\)
我什么都不知道,乱写的。
这个东西大概是个怎样的流程还是知道了。
假设我们要分解的数是 \(n\),先判断是否是质数,若是则返回,否则进行分解。
怎么分解呢?
考虑一个函数 \(f(x) = x^2+c \,\,\,\, mod \,\,\, n\)。
根据这个神奇函数生成一些数字来进行分解。
然后呢?
我们知道一件事是若存在一个数字 \(x\),满足 \(gcd(x,n) \not = 1\)。
则显然我们可以得到 \(n\) 的一个因子。
然后我就是通过 \(f(x)\) 生成一些数字来得到 \(x\) 了。
令 \(a=f(1),b=a\),然后让 \(a\) 跳,每次记一个 \(|a-b|\) 的积。
这个积就是这个 \(x\)。
接着跳一定长度之后停止,令 \(a=b\),然后接着跳,每次长度翻倍。
点击查看代码
inline int Rho(int x)
{
int s = 0,t = 0,c = rd()%(x-1)+1,val = 1 ;
for(int tot = 1 ; ; tot <<= 1)
{
s = t,val = 1 ;
FOR(stp,1,tot,1)
{
t = f(t,c,x),val = (__int128)val*abs(t-s)%x ;
if(stp%127 == 0)
{
int d = gcd(val,x) ;
if(d > 1) return d ;
}
}
int d = gcd(val,x) ; if(d > 1) return d ;
}
}
然后就结束了。
值得一提的是如何判断素数,这里使用的是 \(Miller-Rabin\) 素数测试。
考虑将费马小定理反过来,即若 \(a^{p-1} = 1\),则 \(p\) 为素数。
但这是错的,有数字不满足这东西。
有个东西叫二次探测,用上就对了。
即若 \(p\) 为奇素数,则 \(x^2 = 1 \,\,\,\, mod \,\,\, p\)。 的解为 \(x=1\) 或 \(x=-1\)。
点击查看代码
int check(int x,int di)
{
int k = x-1 ;
while(k)
{
int now = Pow(di,k,x) ;
if(now != 1 && now != x-1) return 0 ;
if((k&1) || now == x-1) return 1 ; k >>= 1 ;
}
return 1 ;
}
点击查看代码
inline int Check(int x)
{
if(x == 46856248255981ll || x < 2) return 0 ;
if(x == 2 || x == 3 || x == 7 || x == 61 || x == 24251) return 1 ;
return check(x,2) && check(x,61) && check(x,7) && check(x,24251) ;
}
没了,完结撒花。

浙公网安备 33010602011771号