C++博客 :: 首页 :: 新随笔 ::  ::  :: 管理

Miller Rabin 素性检测 非大数实现

Posted on 2010-08-20 01:14 Kevin_Zhang 阅读(338) 评论(0)  编辑 收藏 引用 所属分类: 数论
#include"iostream"
#include
"stdio.h"
#include
"stdlib.h"
#include
"time.h" //系统时间函数的头文件
using namespace std;
int T;//the number of tests
int j,d,N;

void computejd(int n)//求j和d,这个是正确的,d为odd
{int m=n-1;
 j
=0;
 
while(1)
 {
   
if(m%2==0){j++;m=m/2;}
   
else {d=m;break;}

 } 
return ; 
}
//right




int GetRand()//求随机数,种子为系统时间
{
 srand(time(NULL)) ;
 
int n = rand()%(N-1)+1;
 
 
return n ;
}
//right

int main()
{
 
int k;
 printf(
"输入测试次数T:");
 scanf(
"%d",&T);//right
 for(int x=1;x<=T;x++)
  {scanf(
"%d",&N);
   computejd(N);
   
for(k=1000;k>0;k--)
    {
int b=GetRand();
     
int r0, r,r1,i;
     r0
=N-1;i=0;
     r
=1; r1=b%N;
          
for(int q=0; q<=31;q++)
          { 
if((d&1)==1) r=(r*r1)%N;
             r1
=(r1*r1)%N; d>>=1
          }
          
           
while(r!=1&&i<j)
          {  
              r0
=r;r=(r*r)%N;i++;

          }
         
if(r==1||i>=j)
          {
             
if(r==1&&r0==N-1)continue;
             
else break;
          }
          
            
       }
   
   
if(k==0)printf("prime\n");
   
else printf("not prime\n");


  }
//outside cycle
 return 0;
}       

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理