素数判定的一些讨论(Miller-Rabin算法)
来源:互联网 发布:北京小学生id软件下载 编辑:程序博客网 时间:2024/05/16 05:35
很久没有写博客了。。。最近军训加开学,感觉刷题速度有降低,要补一补。
回归正题,正式进入数论阶段,讨论一下关于素数判定的那些事。
一类问题: 判定一个整数n(n>1)是否为素数。
算法1:
直接根据素数的定义枚举n%i==0
时间复杂度:
bool is_prime(int n) { int i; for(i = 2; i < n; i++) if(n % i == 0) return false; return true;}
算法2:
发现若存在n%i==0
,则必有n%(n/i)==0
。
所以只需枚举
时间复杂度:
bool is_prime(int n) { int i; for(i = 2; i * i <= n; i++) if(n % i == 0) return false; return true;
Miller-Rabin算法:
这是一种随机性素数判定算法,也就是说,答案可能出错,但是可能性极小。
先是讲两个定理:
费马小定理:
对于一个质数
二次探测定理:
对于
的解为:
因为费马小定理的逆命题不成立,而否逆命题成立,所以我们可以利用一下一点:
对于任意整数
所以我们可以不断在区间
但是这还不够精确,我们可以先把
注意以上操作中所有的形如
这就是Miller-Rabin算法的主要内容。
时间复杂度:考虑常数后为
代码如下:
const int MAXN = 65;long long n, x[MAXN];long long multi(long long a, long long b, long long p) { long long ans = 0; while(b) { if(b&1LL) ans = (ans+a)%p; a = (a+a)%p; b >>= 1; } return ans;}long long qpow(long long a, long long b, long long p) { long long ans = 1; while(b) { if(b&1LL) ans = multi(ans, a, p); a = multi(a, a, p); b >>= 1; } return ans;}bool Miller_Rabin(long long n) { if(n == 2) return true; int s = 20, i, t = 0; long long u = n-1; while(!(u & 1)) { t++; u >>= 1; } while(s--) { long long a = rand()%(n-2)+2; x[0] = qpow(a, u, n); for(i = 1; i <= t; i++) { x[i] = multi(x[i-1], x[i-1], n); if(x[i] == 1 && x[i-1] != 1 && x[i-1] != n-1) return false; } if(x[t] != 1) return false; } return true;}
3 0
- 素数判定的一些讨论(Miller-Rabin算法)
- Rabin -Miller算法判定素数
- 算法基础 - 素数判定(Miller-Rabin算法)
- Miller-rabin判定素数
- 素数判定——Miller Rabin 算法
- Miller-Rabin大素数判定
- 【Miller-Rabin 素数判定】HDU
- 模板:(数论:大素数判定-分解: Miller-Rabin算法)
- 大素数测试的Miller-Rabin算法
- 【素数算法】Rabin-Miller算法
- Miller-Rabin素数判定O((logn)^2)
- miller rabin 随机素数判定法模版
- 判断素数 Miller-Rabin 算法
- Miller-Rabin素数检测算法
- 质数判定(miller-rabin)
- 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!
- Miller Rabin 概率算法测试素数(强伪素数)
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
- 【雅礼联考GDOI2017模拟9.2】Ztxz16学图论
- CSU 1803 2016 (逆向思维)
- zsh shell (oh my zsh)搭建
- html input readonly 和 disable的区别
- Git2.初次运行 Git 前的配置&获取帮助
- 素数判定的一些讨论(Miller-Rabin算法)
- RecyclerView
- vm虚拟机中fedora无法全屏显示解决
- tomcat源码:Context容器和Wrapper容器
- 和柘榎诗一首
- Java - SVN remains in conflict错误的解决办法
- 数组是数组 指针是指针
- 通过斐波那契数列分析实现函数时采用递归和循环的利弊
- 两个链表的第一个公共结点