LOJ #143. 质数判定
题目描述
判定输入的数是不是质数。
输入格式
若干行,一行一个数 x。
行数不超过 1.5×104。
输出格式
对于输入的每一行,如果 x 是质数输出一行 Y,否则输出一行 N。
样例
样例输入
1
2
6
9
666623333
样例输出
N
Y
N
N
Y
数据范围与提示
1≤x≤1018。
欢迎hack(如果你不是管理员,可以在题目讨论区发帖)。
Solution:
本题Miller-rabin模板题。
Miller-rabin其实是个很简单的算法,用来快速判断一个数是否为素数。
前置技能:二次探测定理。
若$a^2\equiv 1\mod p$且$p$为素数,则$a\equiv \pm 1\mod p$。
证明:$\because a^2\equiv 1\mod p$
$\therefore (a+1)(a-1)\equiv 0 \mod p$
又$p$为素数
$\therefore a=1$或$a=p-1$
我们由费马小定理,若$p$为素数,则$a^{p-1}\equiv 1 \mod p$,那么对于一个需要判断是否为素数的数$x$:
1、$x$必须是个非$1$的奇数。
2、令$x=2^k*c+1$($c$为奇数),选择随机数$a$,使其满足所有$i<r$,都有$a^{2^i*c}\;mod\;p=p-1\;or\;1$。
然后就是模拟上述过程,多选几个随机数,若都能通过测试就是素数啦。
一般的话,随机选取4个数$2,3,5,7$,则在$2.5*10^{13}$以内唯一一个判断失误的数为$3215031751$。
然后细节就是当前数不能是所选取的随机数的倍数,否则会误判。
代码:
/*Code by 520 -- 9.10*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int cnt=,tab[]={,,,};
ll n,m; ll Mul(ll x,ll y,ll mod){
ll ans=(x*y-(ll)((long double)x/mod*y+0.5)*mod);
return ans<?ans+mod:ans;
} ll Exp(ll x,ll y,ll mod){
ll ans=;
while(y){
if(y&) ans=Mul(ans,x,mod);
y>>=;
x=Mul(x,x,mod);
}
return ans;
} bool Miller_Rabin(ll &n){
if(n==||n==||n==||n==||n==||n==) return ;
if(n==||n%==||n%==||n%==||n%==||n%==||n%==) return ;
For(i,,cnt) {
RE ll d=n-;
while(!(d&)) d>>=;
RE ll s=Exp(tab[i],d,n);
while(s!=&&s!=n-&&d!=n-) d<<=,s=Mul(s,s,n);
if(s!=n-&&!(d&)) return ;
}
return ;
} int main(){
while(scanf("%lld",&n)!=EOF) putchar(Miller_Rabin(n)?'Y':'N'),putchar('\n');
return ;
}
LOJ #143. 质数判定的更多相关文章
- Loj#143-[模板]质数判定【Miller-Rabin】
正题 题目链接:https://loj.ac/p/143 题目大意 给出一个数\(p\),让你判定是否为质数. 解题思路 \(Miller-Rabin\)是一种基于费马小定理和二次探测定理的具有较高正 ...
- LibreOJ#143 质数判定 [Miller_Rabin]
题目传送门 质数判定 题目描述 判定输入的数是不是质数. 输入格式 若干行,一行一个数 x. 行数不超过 $1.5\times 10^4$ 输出格式 对于输入的每一行,如果 x是质数输出一行 Y,否则 ...
- [学习笔记] Miller-Rabin质数测试 & Pollard-Rho质因数分解
目录 Miller-Rabin质数测试 & Pollard-Rho质因数分解 Miller-Rabin质数测试 一些依赖的定理 实现以及正确率 Pollard-Rho质因数分解 生日悖论与生日 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- RSA简介(三)——寻找质数
要生成RSA的密钥,第一步就是要寻找质数,本节专讲如何寻找质数. 我们的质数(又称素数).合数一般是对正整数来讲,质数就是只有1和本身两个的正整数,合数至少有3个约数,而1既不是合数也不是质数. 质数 ...
- 博客索引and题目列表
目录 笔记整理 计划 要学的东西 缺省源 要做的题 搜索 高斯消元 矩阵 排列组合 2019.7.9 2019.7.10 kmp ac自动机 2019.7.11 2019.7.15 笔记整理 1.同余 ...
- Java基础常见英语词汇
Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ...
- 跨越千年的RSA算法
转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
- computer English
算法常用术语中英对照Data Structures 基本数据结构Dictionaries 字典PriorityQueues 堆Graph Data Structures 图Set Data Struc ...
随机推荐
- Kali Linux菜单中各工具功能大全
各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 名称 类型 使用模式 功能 功能评价 dmitry 信息收集 whois查询/子域名收集/ ...
- Mkdir方法
新建目录或文件夹. 语法 MkDir 路径 所需的_路径_参数是一个字符串表达式,标识的目录或文件夹创建. _路径_可以包含驱动器. 如果未指定驱动器, MkDir当前的驱动器上创建新目录或文件夹. ...
- 我的第一个bootstrap实例
先上代码: <!doctype html><html lang="en"><head> <meta charset="UTF-8 ...
- [C++]模板类和模板函数
参考: C++ 中模板使用详解 C++模板详解 概念 为了避免因重载函数定义不全面而带来的调用错误,引入了模板机制 定义 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模 ...
- linux一切皆文件之Unix domain socket描述符(二)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...
- ResNet——Deep Residual Learning for Image Recognition
1. 摘要 更深的神经网络通常更难训练,作者提出了一个残差学习的框架,使得比过去深许多的的网络训连起来也很容易. 在 ImageNet 数据集上,作者设计的网络达到了 152 层,是 VGG-19 的 ...
- Python中collections模块的使用
本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...
- JVM调优(2)
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...
- 基于spec评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 杨金铭 张宇 卢帝同 一.测试目标:拉格朗日2018——飞词 下面是他们的小游戏在运行时的一些截图画面: 1.开始: ...
- cnblogs用户体验及建议
一.是否提供了良好的体验给用户(同时提供价值)? 我觉得博客园还是给用户提供了良好的用户体验的,它可以从用户的角度考虑,用户在注册的时候,用户自己在设置用户名和密码的时候,如果与他人重复会有提示,而且 ...