一、素数筛
(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 一定是素数。
(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 一定是素数。