Miller方法产生、检验素数
生活随笔
收集整理的這篇文章主要介紹了
Miller方法产生、检验素数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
有關(guān)Miller方法過程
設(shè)n為被檢驗(yàn)的整數(shù),n=m*2^t+1,期中m為n-1的最大奇因子,t>=1。記檢測n是否為素數(shù)的算法為F(l,k),其中l(wèi)為正整數(shù),是算法的輸入,Pass為布爾型變量。
使用該算法來產(chǎn)生一個較多位大素數(shù)還需要做改進(jìn),因?yàn)橛盟鼇懋a(chǎn)生一個200位的大素數(shù)就需要300多秒。但是用來檢驗(yàn)素數(shù)還是不錯的。
代碼實(shí)現(xiàn)
2000以內(nèi)的素數(shù)如下:
char prime[303][4]={"2","3","5","7","b","d","11","13","17","1d","1f","25","29","2b","2f","35","3b","3d","43","47","49","4f","53","59","61","65","67","6b","6d","71","7f","83","89","8b","95","97","9d","a3","a7","ad","b3","b5","bf","c1","c5","c7","d3","df","e3","e5","e9","ef","f1","fb","101","107","10d","10f","115","119","11b","125","133","137","139","13d","14b","151","15b","15d","161","167","16f","175","17b","17f","185","18d","191","199","1a3","1a5","1af","1b1","1b7","1bb","1c1","1c9","1cd","1cf","1d3","1df","1e7","1eb","1f3","1f7","1fd","209","20b","21d","223","22d","233","239","23b","241","24b","251","257","259","25f","265","269","26b","277","281","283","287","28d","293","295","2a1","2a5","2ab","2b3","2bd","2c5","2cf","2d7","2dd","2e3","2e7","2ef","2f5","2f9","301","305","313","31d","329","32b","335","337","33b","33d","347","355","359","35b","35f","36d","371","373","377","38b","38f","397","3a1","3a9","3ad","3b3","3b9","3c7","3cb","3d1","3d7","3df","3e5","3f1","3f5","3fb","3fd","407","409","40f","419","41b","425","427","42d","43f","443","445","449","44f","455","45d","463","469","47f","481","48b","493","49d","4a3","4a9","4b1","4bd","4c1","4c7","4cd","4cf","4d5","4e1","4eb","4fd","4ff","503","509","50b","511","515","517","51b","527","529","52f","551","557","55d","565","577","581","58f","593","595","599","59f","5a7","5ab","5ad","5b3","5bf","5c9","5cb","5cf","5d1","5d5","5db","5e7","5f3","5fb","607","60d","611","617","61f","623","62b","62f","63d","641","647","649","64d","653","655","65b","665","679","67f","683","685","69d","6a1","6a3","6ad","6b9","6bb","6c5","6cd","6d3","6d9","6df","6f1","6f7","6fb","6fd","709","713","71f","727","737","745","74b","74f","751","755","757","761","76d","773","779","78b","78d","79d","79f","7b5","7bb","7c3","7c9","7cd","7cf"
};
在實(shí)際的實(shí)現(xiàn)中,為了加快檢驗(yàn)速度,只采取了前30個素數(shù)用來檢驗(yàn)。具體代碼如下,僅供參考:
void genPrime(int len,char*str){int i,j,tmp,pass=0,t=0,tail;srand(time(NULL));while(pass==0){setZero(a); //產(chǎn)生一個隨機(jī)大奇數(shù)a[0]=8*(rand()%2)+4*(rand()%2)+2*(rand()%2)+1; for(i=1;i<len;i++)a[i]=rand()%16;hex2hex_str(a,str);//printf("%s\n",str);char m[BUFLEN]={0};sub(str,"1",m);hex_str2hex(m,a);//求m和twhile(a[0]%2==0&&strlen(m)>0){t++;div(m,"2",m);hex_str2hex(m,a);}for(tail=strlen(m)*4-1;((a[tail/4]>>(tail%4))&0x1)==0;tail--);char b_t[BUFLEN],temp[BUFLEN];int temp2[BUFLEN];hex_str2hex(m,temp2);for(i=0;i<30;i++){strcpy(b_t,"1");for(j=tail;j>=0;j--){mul(b_t,b_t,b_t);mod(b_t,str,b_t);tmp=(temp2[j/4]>>(j%4))&0x1;if(tmp==1){mul(prime[i],b_t,b_t);mod(b_t,str,b_t);}}if(strlen(b_t)==1&&b[0]=='1'){pass=1;break;}add(b_t,"1",temp);mod(temp,str,temp);if(strlen(temp)==0){pass=1;break;}for(j=0;j<t;j++){mul(b_t,b_t,b_t);mod(b_t,str,b_t);}add(b_t,"1",temp);mod(temp,str,temp);if(strlen(temp)==0){pass=1;break;}}}
}
代碼效果:
產(chǎn)生200位大素數(shù):
產(chǎn)生40位大素數(shù):
總結(jié)
以上是生活随笔為你收集整理的Miller方法产生、检验素数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现SHA-1
- 下一篇: Matlab实现图像边缘检测