Miller_Rabin整理笔记
问题
一个数到底是不是素数
别的
首先列一下我们可以求素数的东西
根号暴力求
\(O(nloglogn)\)的埃氏筛
\(O(n)\)的欧拉筛
还有我们要学习的Miller_Rabin算法
对了,还有神奇的6倍法(也许叫这个吧)
bool pd(int x) {
if(x==2||x==3) return 1;
if(x==1||x%6!=1&&x%6!=5) return 0;
for(int i=5;i*i<=x;i+=6)
if(x%i==0||x%(i+2)==0) return 0;
return 1;
}
正事
先去掉偶合数和2吧,现在剩下奇数了吧
费马小定理对素数一定成立,但合数是不一定成立的,多试几次成立几率还是挺
大的,没啥说的
\(Carmichael\)数本身是合数,而且\(1\)到\(n-1\)都满足飞马小定理,suah as:561
着重说一下二次探测吧
考虑\(x^{2}≡1(mod n)\)的根,如果n为奇素数,那跟就只有1和-1两个根(移项之后显然)
设\(n-1=2^{r}*d\),d是奇数,如果存在\(0≤k<r,a^{2^{k}*d}≠1,-1(mod n)\)
但是\(a^{2^{k+1}*d}≡1(mod n)\),那就不满足费马小定理,那么n就是合数了
凭借着二次探测和费马小定理,我们出错的几率就大大降低了
但只测一次错误还是不够(应该是一次失败的几率是四分之一)
我们用前10个素数,在OI界就可以无忧了
复杂度\(O(k*logn)\)
不知道百度百科搞得什么鬼,好多log
使用快速傅里叶变换能够将这个时间推进到\(O(klognlog lognlog log logn) ="O"(klogn).\)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL q_pow(LL a, LL k, LL p) {//calc a^k % p
LL res = 1;
for (; k ; k >>= 1, a = a * a % p)
if (k & 1) res = a * res % p;
return res;
}
int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
bool detective(LL a, LL n) {
int r = 0; LL d = n - 1; // n - 1 = 2 ^ r * d
while (d % 2 == 0) d >>= 1, ++r;
for (LL x = q_pow(a, d, n), y; r ; r--) {
y = x * x % n;
if (y == 1) {
if (x == 1) return true;
if (x == n - 1) return true;
return false;
}
x = y;
}
return false;
}
bool miller_rabin(LL n) {
for (int i = 0; i < 10; i++) {
if (n == prime[i]) return true;
if (n % prime[i] == 0) return false;
if (!detective(prime[i], n)) return false;
}
return true;
}
int main() {
LL wo,n,x;
cin>>wo>>n;
while(n--) {
cin>>x;
if (miller_rabin(x)) printf("Yes\n");
else printf("No\n");
}
}
Miller_Rabin整理笔记的更多相关文章
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- xmpp整理笔记:发送图片信息和声音信息
图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值) ...
- xmpp整理笔记:聊天信息的发送与显示
任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包) http://www.cnblogs.com/dsxniubilit ...
- xmpp整理笔记:用户网络连接及好友的管理
xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
- jQuery整理笔记文件夹
jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...
- sk_buff整理笔记(两、操作函数)
承接上一:sk_buff 整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针各自是:head.data.tai ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
随机推荐
- GE与POST方法区别
1.用途. GET方法一般用于查询并获取信息,这意味着它是幂等的(对同一个url的多个请求,返回结果完全一样),因为没有修改资源状态,所以它是安全的.而POST一般用于更新资源信息,既不是幂等,也不是 ...
- 爬虫万金油,一鹅在手,抓遍全球:goose 简介!
GOOSE 现已弃用 经过多年的服务,GOOSE接口和支持它的MySQL数据现已弃用 . 在我们进行替换的同时,我们建议寻找一般查询功能的用户在http://rdf.geneontology.org上 ...
- linux常用命令:pwd 命令
Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...
- Flask内置URL变量转换器
Flask内置URL变量转换器: 转换器通过特定的规则执行,”<转换器: 变量名>”.<int: year>把year的值转换为证书,因此我们可以在视图函数中直接对year变量 ...
- 转:C#清除回收站
SHEmptyRecycleBin是一个内核API方法,该方法能够清空回收站中的文件,该方法在C#中需要手动的引入方法所在的类库.该方法在C#中的声明语法如下: [DllImportAttrbute( ...
- Python这么热,要不要追赶Python学习热潮?
Python这么热,要不要追赶Python学习热潮? Python 可以用来做什么?在我看来,基本上可以不负责任地认为,Python 可以做任何事情.无论是从入门级选手到专业级选手都在做的爬虫,还是W ...
- 两眼论&矩阵变现理论结合打造赚钱大模式
两眼论&矩阵变现理论结合打造赚钱大模式 围棋有一个基本规则,就是一块棋有两只真眼,就是活棋. 围棋没有复杂的规则,它最有趣的地方是没有太多的规则和限制,由此演变出了大千世界,所以古人云“棋如人 ...
- [转载]C# 常用日期时间函数(老用不熟)
原博地址:http://www.jb51.net/article/20181.htm --DateTime 数字型 System.DateTime currentTime=new System.Dat ...
- 使用 ffmpeg 转换视频格式
ffmpeg 是 *nix 系统下最流行的音视频处理库,功能强大,并且提供了丰富的终端命令,实是日常视频处理的一大利器! 实例 flac 格式转 mp3 音频格式转换非常简单: ffmpeg -i i ...
- MySQL 如何创建索引?怎么优化?
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.My ...