原文傳送門:
http://www.wutianqi.com/?p=1253
偽素數:如果n是一個正整數,如果存在和n互素的正整數a滿足a^n-1≡1(mod n),我們說n是基于a的偽素數。如果一個數是偽素數,它幾乎肯定是素數。(即下面的費馬小定理)
費馬小定理是數論中的一個重要定理,其內容為: 假如p是質數,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是質數,且a,p互質,那么 a的(p-1)次方除以p的余數恒等于1。
更多關于費馬小定理請參閱:
http://baike.baidu.com/view/263807.htm?fr=ala0_1
這是Miller Rabbin測試素數的代碼模版:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define maxTest 100
__int64 Random(__int64 n)
{
return (__int64)((double)rand()/RAND_MAX*n+0.5);
}
__int64 Modular_Exp(__int64 a, __int64 b, __int64 n) // a^b mod n
{
__int64 ans;
if(b == 0)
return 1;
if(b == 1)
return a%n;
ans = Modular_Exp(a, b/2, n);
ans = ans*ans%n;
if(b%2)
ans = ans*a%n;
}
bool Miller_Rabbin(__int64 n)
{
for(int i=1; i<=maxTest; i++)
{
__int64 a = Random(n-2)+1;
if(Modular_Exp(a, n-1, n) != 1)
return false;
}
return true;
}
int main()
{
srand(time(NULL));
__int64 n;
while(scanf("%I64d", &n)==1)
if(Miller_Rabbin(n))
printf("Primer\n\n");
else
printf("Not Prime\n\n");
return 0;
}
注:
1.Modular_Exp函數詳細見:
快速冪取模(點擊查看)
2.這個算法是概率型算法,而不是確定型算法。不過多次運行后出錯概率很小,在實際應用中是可以信賴的。
感謝rakerichard小牛的資料和劉汝佳老師的黑書。
posted on 2010-09-08 14:28
Tanky Woo 閱讀(208)
評論(0) 編輯 收藏 引用