判断大数是否为素数 (费马小定理+Carmichael数判断)
来源:互联网 发布:防身甩棍淘宝网 编辑:程序博客网 时间:2024/05/06 08:05
这个不能用来输出素数(太慢)
但这样判断一个大数是不是素数很方便
#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;long long multi(long long a,long long b,long long mod){long long temp = a,sum = 0;while(b){if(b&1) sum = (sum + temp) % mod;temp = (temp + temp) % mod;b = b>>1;}return sum;}long long Modular_exponent(long long a,long long x,long long mod) // a ^ x mod MOD.{long long t = a % mod,r = 1;while(x){if(x & 1) r = multi(r,t,mod);t = multi(t,t,mod); x = x>>1;}return r;}//Carmicheal number: 561,41041,825265,321197185bool Miller_Rabin(long long n) // 如果是素数,则返回1,否则返回0.{long long time = 20;if(n < 2) return false;if(n == 2) return true;bool flag = false;for(long long k = 0;k <= time;++k){flag = false;long long d = n - 1,r = 0,t,a = rand()%(n-2) + 2;while((d & 1) == 0){d = d>>1;r++;}t = Modular_exponent(a,d,n);if(t == 1 || t == n-1) {flag = true;continue;}for(long long i = 1;i < r;i++){t = multi(t,t,n);if(t == 1) {flag = false;return flag;}if(t == n-1) {flag = true;break;}}if(!flag) break;}return flag;}int main(){long long n;while(~scanf("%lld",&n))puts(Miller_Rabin(n) ? "Yes" : "No");/*long Count = 0; for (int i = 1; i < 1000000; i++) {if (Miller_Rabin(i)) {Count++;} } printf("Count = %d\n", Count);*/return 0;}
0 0
- 大数是否为素数【费马小定理+Carmichael数判断】
- 判断大数是否为素数 (费马小定理+Carmichael数判断)
- 判断一个数是否为素数(函数)
- 如何判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 输入一个数,判断是否为素数
- 判断一个数是否为回文素数
- 如何判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 【数据结构与算法】【排序】直接插入排序的代码实现
- XCode6中添加pch文件
- 机器学习 实用技巧
- 数字金额转换大写
- error: expected specifier-qualifier-list before xxx (a structure )
- 判断大数是否为素数 (费马小定理+Carmichael数判断)
- Java数组操作十大方法
- 系统优化之路——hibernate细节之战
- 4*4键盘程序代码 基于STM32
- Linux(Ubuntu)卸载Python后
- python实现简单爬虫模拟登录淘宝(cookie简介)
- xmltodict:让你像处理JSON一样处理XML的Python模块
- EventBus使用详解(一)——初步使用EventBus
- Ubuntu 12.04 中安装和配置 Java JDK