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 ...
随机推荐
- centos7上的postgresql10安装和配置
安装数据库 安装参考官方文档:https://www.postgresql.org/download/linux/redhat/ 1.Install the repository RPM: yum i ...
- 统计学习方法c++实现之七 提升方法--AdaBoost
提升方法--AdaBoost 前言 AdaBoost是最经典的提升方法,所谓的提升方法就是一系列弱分类器(分类效果只比随机预测好一点)经过组合提升最后的预测效果.而AdaBoost提升方法是在每次训练 ...
- 高可用OpenStack(Queen版)集群-6.Nova控制节点集群
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- Linux-C语言标准输入输出
标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口.这个库现在已经成为 ANSI 标准 C 的一部分.标准 I/O 库提供了许多复杂的函数用于格式化 ...
- Doing Homework again:贪心+结构体sort
Doing Homework again Problem Description Ignatius has just come back school from the 30th ACM/ICPC. ...
- docker pull下来的镜像放哪儿了?
本机docker版本 docker –version Docker version 1.进入docker 目录 root@Rightsec:~# cd /var/lib/docker root@Rig ...
- scrapy有用的(代理,user-agent,随机延迟等)
代理 方法一(待测试) 见scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware import os # 设置相应的代理用户名密码,主机和 ...
- Class-dump 安装和使用记录(导出应用的头文件)
class-dump算是逆向工程中一个入门级的工具,可以很方便的导出程序头文件,可以轻松的了解程序结构方便逆向.安装包下载地址:http://stevenygard.com/projects/clas ...
- sprint2(第六天)
昨天休息一天,今天继续做任务. 燃尽图:
- TeamWork#3,Week5,Scrum Meeting 11.9
由于经验不足和储备知识不够,最近我们的项目遇到了一些技术问题,需要对项目进行重新计划.我们总结了经验教训,找出了问题所在,明确了要补充的知识,加紧学习,将会在一周之内解决相关问题. 成员 已完成 待完 ...