与数论的爱恨情仇--01:判断大素数的Miller-Rabin
在我们需要判断一个数是否是素数的时候,最容易想到的就是那个熟悉的O(√n)的算法。那个算法非常的简单易懂,但如果我们仔细想想,当n这个数字很大的时候,这个算法其实是不够用的,时间复杂度会相对比较高。
怎么解决呢?我们先来了解一下“费马小定理”。假设我们有一个素数p,且另一个数a和p互素,就可以得到ap-1≡1(mod p)。这个定理很巧妙啊,有人就想了,能不能通过费马小定理来判断一个数是否是素数呢?也就是说,当我们判断一个数p是否是素数时,只需要判断ap-1≡1(mod p)是否成立即可。这里的a因为是任意数,干脆就让它等于2,那么判断一个数p是否是素数就转化成了判断2p-1≡1(mod p)是否成立。乍一看,这好像没什么问题。当这个式子不成立时,p一定是一个合数,这没毛病;但是当式子成立的时候p就一定是素数吗?我们举个反例。当p = 341时,2340≡1(mod 341)成立,然而很不巧,341 = 11 * 31是一个纯正的合数。这就是数学中所说的,对于所有的a都存在对应的伪素数。(ps:这个问题并不能完全通过改变基数解决)
那我们该怎么办呢?其实很简单,只需要进行“二次探测”把伪素数揪出来就ok了。这可不是乱改,是有依据的:当p为素数时,方程x2≡1(mod p)有两个根 x = 1 和 x = p - 1。这两个根被我们赋予了一个奇怪的名字:平凡平方根。那么,判断一个数p是否是素数这个问题就又被我们转化,变成了判断在模p意义下是否存在1的非平凡平方根,若存在则p为合数,反之则为素数。这一测试被我们“亲切地”称为“Miller - Rabin测试”。
具体操作步骤如下:
①选取多个基数a进行测试;
②寻找模p为1的非平凡平方根;令p - 1 = 2t*u(t >= 1, u为奇数),ap-1 = a2t*u = a2t ,先算出x=au (mod p),再把 x 平方 t 次,每次模上 p,这样我们就得到了一个长度为 t + 1 的序列。我们希望这个序列以 1 结尾。若中间某一项为 1,则这一项的前一项必须为 1 或 n - 1,否则p就是合数。
在Miller - Rabin测试中进行s次测试,这并不代表这项测试是简单地验证费马小定理,它大大降低了出错的概率,研究表明,Miller - Rabin测试的出错概率至多为 2-s 这可以说是非常小了。所以不用担心它的准确度和严谨性。
#include<bits/stdc++.h>
using namespace std; int pow(long long a, long long b, long long n) {
long long ans = ;
while (b) {
if (b & ) {
ans = ans * a % n;
}
a = a * a % n;
b >>= ;
}
return ans;
} bool judge(long long n, long long a) {
long long u = , t = n - ;
while (t % == ) {u++; t /= ;}
long long x = pow(a, t, n); for (int i = ; i <= u; i++) {
long long nx = x * x % n;
if ((nx == ) && (x != ) && (x != n - ))
return true;
x = nx;
}
if (x != ) return true;
return false;
} bool miller(long long n, int s) {
if (n == ) return true;
if (n < || n % == ) return false;
for (int i = ; i <= s; i++) {
long long a = rand() % (n - ) + ;
if (judge(n, a)) return false;
}
return true;
} int main() {
int t;
cin >> t;
long long a;
while (t--) {
cin >> a;
if (miller(a, )) {
cout << "yes" << endl;
}
else cout << "no" << endl;
}
return ;
}
与数论的爱恨情仇--01:判断大素数的Miller-Rabin的更多相关文章
- pytorch和tensorflow的爱恨情仇之定义可训练的参数
pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch版本:1.6.0 tensorflow版本:1.15.0 之前我们就已 ...
- 注解:大话AOP与Android的爱恨情仇
转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...
- pytorch和tensorflow的爱恨情仇之参数初始化
pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch和tensorflow的爱恨情仇之定义可训练的参数 pytorch版本 ...
- Menu与ActionBar的爱恨情仇
最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...
- web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决
[问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...
- 除了love和hate,还能怎么表达那些年的“爱恨情仇”?
实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...
- 对json的爱恨情仇
本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...
- String、StringBuilder、StringBuffer的爱恨情仇
第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...
- [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!
探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...
随机推荐
- Office - Excel 2013
1. 在使用TODAY()时需要注意格式,比如,如果系统区域是中国,那么格式为2015/7/28,如果在单元格中设置了其它格式(比如美国格式 3/24/2015),则可能无法比较: 2. $表示cel ...
- android:项目迁移error:Please change caller according to com.intellij.....
迁移到Android Studio中的项目,在运行时有时会在Event Log中报这种错: Please change caller according to com.intellij.openapi ...
- linux 用户管理 groupadd、groupmod、groupdel、gpasswd
添加用户组groupadd [选项] 组名 /usr/sbin/groupadd执行权限:root一个用户可以属于多个所属组,但有一个缺省组,和用户名同名-g GID:指定组ID 修改用户组 grou ...
- 为什么不要使用 select * from xxx (oracle 亲测)
打开已用时间set timing on;create table users(id number(20), name varchar2(20), password varchar2(20));inse ...
- CSS 内外边距 float positio属性
一.外边距和内边 margin: 用于控制元素与元素之间的距离 外边距:margin的最基本用途就是控制元素周围空间的间隔,从视觉角度上达到相互隔开的目的. padding: ...
- MySQL中如何实现select top n
用惯了access mssql server的朋友,可能在用mysql查询前N条记录时,习惯的使用select top n 形式的语句,在这里说明一下,mysql没有此语法,mysql用limit来实 ...
- SQL Server ->> 使用CROSS APPLY语句是遇到聚合函数中包含外部引用列时报错
本次遇到的问题是CROSS APPLY的内部查询语句中的聚合函数包含CASE WHEN判断,且同时又内部语句的表的列和外部引用的表的列,此时会报下列的错误. 消息 8124,级别 16,状态 1,第 ...
- MVC 在视图中获取当前的Controller、Action的方式
在视图中获取Controller和Action的方式: Controller: @ViewContext.RouteData.Route.GetRouteData(this.Context).Valu ...
- 辉光UIView的category
辉光UIView的category 本人视频教程系类 iOS中CALayer的使用 效果如下: 源码: UIView+GlowView.h 与 UIView+GlowView.m // // UI ...
- Linux less/more命令详解
less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来 ...