素数的相关问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangzhengyi03539/article/details/80303652
1、素数的密度

π ( n ) 表示小于等于n的整数中素数的个数,例如 π ( 10 ) = 4

素数定理

(1) lim n > π ( n ) n / ln n = 1
可知,随机选取一个数为素数的概率为 1 ln n

2、素数的测试

判断一个数是否是素数的充要条件是看这个数是否和所有小于它的数互质,即如下定理所示

Wilson定理

给定的正整数 n ,判定 n 是一个素数的充要条件是
(2) ( n 1 ) ! 1 ( mod n )
这个方案虽然能够准确判断出一个数是否为素数,但是使用起来计算量太大。

费马小定理

如果 p 是一个素数,对任意的 a , 0 < a < p ,有
(3) a p 1 1 ( mod p )
费马小定理虽只是素数的必要条件,但是可以给素数判定提供一个有力工具。

伪素数测试

对于整数 n ,若满足 a n 1 1 ( mod n ) ,则称 n 为基于 a 的伪素数。
伪素数测试就是测试n是否是基于2的伪素数,以此来判断一个数是否为素数。

Miller-Rabin随机性素数测试

随机性素数测试方法对上面的伪素数测试方法进行两点改进。

3、整数的因子分解
pollard的rho启发式算法
function out_put = rho(n)
i=1;
x=randi(n)-1;
y=x;
k=2;
while true
    i=i+1;
    temp=mod((x*x-1), n);
    x=temp;
    d=gcd(y-x,n);
    if (d~=1)||(d~=n)
        d
    end
    if(i==k)
        y=x;
        k=k*2;
    end
end

辗转相除法求最大公因数代码

function out=gcd(a,b)
if(b==0)
    out=a;
    return;
else
    c=mod(a,b);
    out=gcd(b,c);
end
4、总结

使用的时候可以先测试是否为素数,然后在进行因子分解。

猜你喜欢

转载自blog.csdn.net/zhangzhengyi03539/article/details/80303652