关于素数

一、素数筛

(1) 埃拉托斯特尼筛法

for ( int i = 2; i <= n; i++ )   u[i] = true;
for ( int i = 2; i <= n; i++ )
       if( u[i] )
            for( int j = 2; j*i <= n; j++ )
                    u[i*j] = false;
for ( int i = 2 , num = 0; i <= n; i++ )
       if( u[i] )
             su[++num] = i;       
       
       
       
       
(2)  欧拉筛法

int i, j, num = 1;
memset( u, true, sizeof(u) );
for( int i = 2; i <= n; i++ ){
     if(u[i]) su[num++] = i;
     for( int j = 1; j < num; j++ ){
           if(su[j]*i > n)     break;
           u[su[j]*i] = false;
           if(i % su[j] == 0)    break;
     }
}


       
二、测试大素数

(1) 筛选法 + 试除法
   若 x 的上限 n 比较大, 先通过计算 2~√n 的素数筛 u[] 和素数表 su[] ,x 是素数当且仅当 u[x] = true (2 <= x <= √n)  或 x (√n < x <= n)不能被 su[] 表中任何素数整除。


(2) Miller_Rabin方法
     原理: 如果 n 是素数,且与 a 互质,则 a^(n-1) ≡ 1(mod n)   (1 <= a <= n) 。
     由于 a ≡ a( mod n ),因此,根据同余式相乘的性质,a^n ≡ a mod n 。
    
    可利用的重要结论:
     对于32位内的任一整数 n ,如果其通过以2、7、61为底的 Miller_Rabin测试,那么 n 一定是素数。
     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值