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) ;
}

没了,完结撒花。

posted @ 2023-12-19 21:14  谭皓猿  阅读(14)  评论(0)    收藏  举报