首页 > 代码库 > Miller_Rabin算法(随机算法,判断一个数是否是素数)
Miller_Rabin算法(随机算法,判断一个数是否是素数)
1 const int S = 20;//随机算法判定次数,S越大,判错概率越小 2 LL pow_mod(LL a, LL b, LL mod) { // a^b%mod 3 LL ans = 1; 4 a = a % mod; 5 while(b) { 6 if(b & 1) { 7 ans = (ans * a) % mod; 8 } 9 a = ( a * a ) % mod; 10 b >>= 1; 11 } 12 return ans; 13 } 14 bool check(LL a, LL n, LL x, LL t) { 15 LL ret = pow_mod(a, x, n); 16 LL last = ret; 17 for(int i = 1; i <= t; i++) { 18 ret = (ret * ret) % n; 19 if(ret == 1 && last != 1 && last != n - 1) return true; 20 last = ret; 21 } 22 if(ret != 1) return true; 23 else return false; 24 } 25 bool Miller_Rabin(long long n) { 26 if(n < 2)return false; 27 if(n == 2) return true; 28 if( (n & 1) == 0) return false; 29 LL x = n - 1; 30 LL t = 0; 31 while( (x & 1) == 0 ) { 32 x >>= 1; 33 t++; 34 } 35 for(int i = 0; i < S; i++) { 36 LL a = rand() % (n - 1) + 1; 37 if(check(a, n, x, t)) 38 return false; 39 } 40 return true; 41 }
Miller_Rabin算法(随机算法,判断一个数是否是素数)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。