首页 > 其他 > 详细

ACM模板之数论(不断更新ing)

时间:2015-03-24 13:03:07      阅读:172      评论:0      收藏:0      [点我收藏+]

首先是最经典的素数判定问题,先贴上基本的素数判定算法和米勒拉宾测试算法。

技术分享
 1 //1:基本素数判定算法
 2 //判断n是否为素数,只需要将i从2枚举到sqrt(n)。
 3 //理论支持: 若n是合数,则必然可以分解成两数之积,而
 4 //             这两个数不可能同时大于sqrt(n),则n必有
 5 //           一个小于等于sqrt(n)的约数。
 6 bool isPrime_fundamental( int n )
 7 {
 8     int r = sqrt(n) + 1e-6;                            
 9     for ( int i = 2; i <= r; i++ )                    /*这样最快,1e-6避免误差
10     //for ( int i = 2; i <= sqrt(n) + 1e-6; i++ )    /*由于每次sqrt(n)都会计算,所以比较慢*/
11     //for ( int i = 2; i * i <= n; i++ )            /*由于每次都会计算i*i,所以最慢*/
12     {
13         if ( n % i == 0 ) return false;
14     }
15     return true;
16 }
17 
18 //2:米勒拉宾测试算法
19 //快速幂求a^b%mod
20 int pow_mod( int a, int b, int mod )
21 {
22     int ans = 1, w = a % mod;
23     while ( b )
24     {
25         if ( b & 1 )
26         {
27             ans = ( long long ) ans * w % mod;
28         }
29         b = b >> 1;
30         w = ( long long ) w * w % mod;
31     }
32     return ans;
33 }
34 
35 //米勒拉宾大法
36 bool mr( int n, int a )
37 {
38     if ( n % a == 0 ) return false;
39     int r = 0, s = n - 1;
40     while ( ( s & 1 ) == 0 )
41     {
42         s = s >> 1;
43         r++;
44     }
45     int k = pow_mod( a, s, n );
46     if ( k == 1 ) return true;
47     for ( int j = 0; j < r; j++, k = ( long long ) k * k % n )
48     {
49         if ( k == n - 1 ) return true;    //I don‘t understand!
50     }
51     return false;
52 }
53 
54 //判断素数
55 bool isPrime( int n )
56 {
57     if ( n == 2 || n == 3 || n == 5 || n == 7 ) return true;
58     if ( n & 1 == 0 ) return false;
59     int tab[] = { 2, 3, 5, 7 };
60     for ( int i = 0; i < 4; i++ )
61     {
62         if ( !mr( n, tab[i] ) ) return false;
63     }
64     return true;
65 }
View Code

 

ACM模板之数论(不断更新ing)

原文:http://www.cnblogs.com/huoxiayu/p/4362366.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!