为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

拉宾米勒素数测试

来自NOCOW
跳转到: 导航, 搜索

基础1:费马小定理:当(a,p)=1且P为素数时,有ap − 1modp = 1

基础2:快速幂取模算法(RSA公钥加密算法)

根据费马小定理,有拉宾米勒素数测试法


对于ap − 1modp = 1

取一组固定的底数a,如{2,3,5,7,11,13}

将待测试的素数P,利用快速幂取模算法,分别与底数a进行测试。

在Maxlongint范围,即231 − 1以下,有一些伪素数(即可以通过拉宾米勒素数测试的合数),目前已知

29341=13×37×61

3215031751=151*751*23851

在底数取{2,3,5,7,11}可以通过测试。

所以,拉宾米勒素数测试算法是一个不完全准确的算法。

当然,底数a数组取数越多,测试的准确率越高。

const
 
c:array[1..5]of longint=(2,3,5,7,11);
 
function modular_exp(a,p,k:longint):int64;//快速幂取模算法,核心思想为分治
 
var t,ans:int64;
 
begin
 
t:=a;ans:=1;
 
while p>0 do
 
 begin 
 
 if (p and 1=1) then ans:=((ans mod k)*(t mod k)) mod k;  
 
 t:=((t mod k)*(t mod k)) mod k; 
 
 p:=p shr 1; 
 
 end;  
 
 exit(ans); 
 
end; 
 
function miller_rabbin(n:longint):boolean;//拉宾米勒测试法
 
var
 
i:longint;
 
begin
 
if n=1 then exit(false);
 
if n in [2,3,5,7,11] then exit(true);
 
for i:=1 to 5 do
 
if modular_exp(c[i],n-1,n)<>1 then exit(false);
 
exit(true);
 
end;

以上程序段来自网络,注释来自编辑者。

算法复杂度:当测试的素数为P时,快速幂取模算法复杂度为O(logP),根据底数a的个数s,整个算法时间复杂度为O(s * logP)

--Kirov 20:47 2010年11月10日 (CST)By TeD

个人工具