Miller方法产生、检验素数

有关Miller方法过程

设n为被检验的整数,n=m*2^t+1,期中m为n-1的最大奇因子,t>=1。记检测n是否为素数的算法为F(l,k),其中l为正整数,是算法的输入,Pass为布尔型变量。

在这里插入图片描述在这里插入图片描述
使用该算法来产生一个较多位大素数还需要做改进,因为用它来产生一个200位的大素数就需要300多秒。但是用来检验素数还是不错的。

代码实现

2000以内的素数如下:

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

在实际的实现中,为了加快检验速度,只采取了前30个素数用来检验。具体代码如下,仅供参考:

void genPrime(int len,char*str){
	int i,j,tmp,pass=0,t=0,tail;
	srand(time(NULL));
	while(pass==0){
		setZero(a); //产生一个随机大奇数
		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和t
		while(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;
			}
		}
	}
}

代码效果:
产生200位大素数:
在这里插入图片描述
产生40位大素数:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值