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 }
时间: 2024-10-06 10:50:22

Miller_Rabin算法(随机算法,判断一个数是否是素数)的相关文章

c语言实现判断一个数是否是素数

就是判断一个数是否是素数,网上很多版本,我觉得都有点问题,今天一个朋友问我这个问题,我才知道,现在我就贴出自己的代码,很有用哦!! #include<stdio.h> #include<math.h> int Prime(unsigned int a) { unsigned int i; int k=0; if (a==1) k=1; else for(i=2;i<sqrt(a);i++) if(a%i==0) { k=1; break; } return k; } int

C语言之函数调用09—判断一个数是否为素数

//函数调用 /* ========================================================== 题目:判断一个数是否为素数.如3是素数,4不是素数. ========================================================== */ #include<stdio.h> #include<stdlib.h> int sushu(int n) { int i,k; k=n/2;//控制结束位置! for(

java判断一个数是否为素数[转]

http://blog.csdn.net/lwcumt/article/details/8027586 import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数 public class PrimeNumber { public static void main(String[] args) { Scanner scan = new Scanner(System.in);// 扫描器,接收控制台输入信息 Sy

Java算法题2.判断101-200之间有多少个素数,并输出所有素数。

[原创 转载注明出处] 题目2:判断101-200之间有多少个素数,并输出所有素数. 思路: 素数(质数)就是除了1和它本身以外,没有其他的数可以被它整除 java代码实现: 1 package jichu; 2 3 public class jichu2 4 { 5 public static void main(String[] args) 6 { 7 //for循环遍历101-200 8 for(int i = 101; i < 200; i++) 9 { 10 boolean b = f

判断一个数是否是素数

1)输入一个数,判断该数是否是素数 1 //素数是指只能被1和其自身整除的自然数(1除外)如2 3 5 7 11... 2 //输入一个大于1的自然数,判断该数是否为素数,如果是,输出“yes”,不是,输出“no” 3 4 void main() 5 { 6 int n,i,flag=1; //用flag标记n是否是素数,如果不加flag,将会输出许多个yes或no 7 cout<<"please input n:"; 8 cin>>n; 9 for(i=2;i

【算法与数据结构】判断一个数是否是素数

题目: 判定一个数m是否是素数. 定义: 素数,就是质数,我们简单看一看百度给的定义就行,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数. 思想: 2 ~ m-1 之间有无整数整除m即可. 简化: 2 ~ 根号m 之间有无整数整除m即可. [代码] 1 public class Main { 2 public static boolean isPrime(int n) { 3 if (n < 2) { 4 return false; 5 } 6 for (int

C:冒泡排序&amp;判断一个数是否为素数&amp;求平方根的迭代公式

冒泡排序 #include<stdio.h> int main () { int i,j,n,temp,a[10]; scanf("%d",&n); printf("The original numbers:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n-1;i++) for(j=1;j<n-1;j++) if(a[j-1]>a[j])

模板:判断一个数是否是素数

素数是除了1和它本身这两个数之外再没有可以整除的除数,为减少时间复杂度,可以只对2~√x 之间的数除x就可以判断是否为素数. 代码 1 bool prime(int x) { 2 for (int i = 2; i <= sqrt(x); i++) { 3 if (x % i == 0) 4 return false; 5 } 6 return true; 7 } 原文地址:https://www.cnblogs.com/moujun1001/p/9476392.html

python初学者-判断一个数是否为素数

while True: #判断为真 num = int(input('请输入一个数:')) for i in range(2,num):#判断在num之前的数能不能把num整除 if(num%i == 0): #如果能被整出执行下面语句不能整除执行else print('%d不为素数'%num) break #如果是素数跳出while循环 else: print('%d为素数'%num) break #如果不是素数跳出while循环 break 原文地址:https://www.cnblogs.