米勒-拉宾算法

来源:互联网 发布:大数据最新技术 编辑:程序博客网 时间:2024/04/28 05:35

米勒-拉宾算法:快速判断一个数是不是素数

需要用到的定理:

最小费马定理:如果n是素数,则(a ^ (n - 1)) % n恒等于1。

快速模取幂

米勒-拉宾算法就是结合上面两种,通过不断判断fmod(a, n - 1, n)的值是否为1来判断。这是一个概率算法,如果为1,不一定为素数,不为1,则必定是合数。循环判断多次就会让概率变得极为的小。

算法模板:

#include <iostream>using namespace std;int fmod(int a, int b, int c)//快速模取幂{if(b == 1) return a;int t = fmod(a, b / 2, c);t = (t * t) % c;if(b & 1) t = (t * a) % c;return t;}int check(int n)//米勒-拉宾算法{srand(time(0));for(int i = 0; i < 100; ++ i){if(fmod(rand() % (n - 1) + 1, n - 1, n) != 1)//a的值需要变化,所以用到随机函数;a的取值为[1,n-1],因为这样就会保证如果n为素数,则n与a必互质return 0;}return 1;}int main(){int n;while(scanf("%d", &n) != EOF){if(n < 2){printf("非素数\n");continue;}if(check(n))printf("素数\n");elseprintf("非素数\n");}return 0;}


原创粉丝点击