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 ...
随机推荐
- javaweb + tomcat + 部署 + 域名绑定 + 默认首页
①:把javaweb项目打包成war(不会的自行百度) ②:把war拷贝到服务器的tomcat里面的webapps下 ③:到bin文件夹下.bat文件启动tomcat,启动后会解压war包 ⑤:解压后 ...
- mysql 5.6 分区与不分区的区别
mysql> CREATE TABLE t1 ( id INT, date DATETIME DEFAULT CURRENT_TIMESTAMP) ENGINE=Innodb; Query OK ...
- caffe-ssd运行create_data.sh的时候报错:SSD from caffe.proto import caffe_pb2 ImportError: No module named caffe.proto
在用voc2007和voc2012的数据训练基于caffe的SSD模型的时候,我们需要将图片数据转换成lmdb格式,运行脚本文件是SSD源码里面提供的create_data.sh(具体位置在$CAFF ...
- gispro试用版账户注册
1.注册账户 http://www.esri.com/zh-cn/arcgis/products/arcgis-pro/trial 2.分配账户权限 3.gispro可以登录了
- [ Learning ] Design Pattens
1. 单例2. 模板3. 代理,装饰 (代理和装饰的区别)4. 状态
- WEBGL threejs 1
首先感谢国内的这些研究者,先驱们~~~~~ 文章内容来自于webgl中文网,感谢~~~ -------------------------------------------------------- ...
- 一 django框架?
Django-1 一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞 ...
- 【Linux学习一】命令查看与帮助
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.Linux执行命令流程:shell->bash(解释器 执行 ...
- hive中的with用法
hive 可以通过with查询来提高查询性能,因为先通过with语法将数据查询到内存,然后后面其它查询可以直接使用,这种方法与创建临时表类似但是不需要创建临时表实体表,内存中的子查询结果在会话结束后会 ...
- super和this关键字
super关键字: this关键字: 栈内存和堆内存和方法区内存分析: 其中,new出来的即对象都在堆内存区: main方法先进栈: 方法区中 [[ super_class ]]是编译器生成,代码表现 ...