Miller-Rabin素数测试

给出一个小于1e18的数,问它是否为质数?不超过50组询问。hihocoder

我是真的菜,为了不误导他人,本篇仅供个人使用。

首先,一个1e18的数,朴素\(O(\sqrt{n})\)素数判定肯定爆炸。怎么办呢?

我们知道,对于素数p,只要a不是p的倍数,一定有\(a^{p-1}=1\mod p\)。那么,我们是不是可以选出某些a,对于要判定的数p,看看他是否满足以a为底的费马小定理,以此来判定质数呢?答案是基本可以。

但是很不巧,有一类合数,以任何小于它们的质数为底进行判定,结果都是正确的。它们叫做伪素数。怎么排除伪素数的情况呢?有个叫做二次探测定理的东西:若\(x^2=1\mod p\),那么\(或x=1或-1\mod p\)。

假设\(a^{x-1}=1\mod p\)成立。如果x-1为奇数,就不再判定下去。否则,根据二次探测定理,还可以继续去判定\(或a^{\frac{x-1}{2}}=1或-1\mod p\)是否成立。如果它不等于1或-1,就返回false。如果它等于-1,就返回true。如果它等于1,就继续判定下去。反正,只要x-1为偶数,并且\(a^{x-1}=1\mod p\),就可以一直判定。这样就可以把那些伪素数排除掉了。这就叫做miller-rabin素数测试。据说选前7个质数作为a,在1e18内也只有两三个会被miller-rabin判定成素数的合数。

#include <cstdio>
using namespace std; typedef long long LL;
const LL m=7, a[m]={2, 3, 5, 7, 11, 13, 17};
LL n, p; LL fmul(LL a, LL b, LL p){ //将b分解为二进制,返回a*b%p
LL ans=0;
for (; b; b>>=1, a+=a, a%=p)
if (b&1) ans+=a, ans%=p;
return ans;
} LL fpow(LL a, LL x, LL p){
LL ans=1, base=a;
for (; x; x>>=1, base=fmul(base, base, p))
if (x&1) ans=fmul(ans, base, p);
return ans;
} bool MR(LL a, LL x, LL p){ //判断是否a^x=1或p-1 (mod p),且mr下去也成立
LL t=fpow(a, x, p);
if (t!=1&&t!=p-1) return false;
if (t==1&&x&1||t==p-1) return true;
return MR(a, x>>1, p);
} bool isprime(LL p){
if (p&1==0) return false;
for (LL i=0; i<m; ++i){
if (p==a[i]) return true; //互质时费马小定理才成立
if (fpow(a[i], p-1, p)!=1) return false;
if (!MR(a[i], (p-1)>>1, p)) return false;
}
return true;
} int main(){
scanf("%lld", &n);
while (n--){
scanf("%lld", &p);
puts(isprime(p)?"Yes":"No");
}
return 0;
}

Miller-Rabin素数测试的更多相关文章

  1. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  2. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  4. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  5. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  6. Miller Rabin素数检测

    #include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...

  7. Miller Rabbin素数测试

    步骤 ①先写快速幂取模函数 ②MR算法开始 (1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数 (2)然后开始寻找一个奇数的n去计算,如果最后满足a^d% ...

  8. 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)

    关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...

  9. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

  10. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

随机推荐

  1. 聊聊 SQL Joins

    SQL 中的 Join 有以下几种类型: 1.Cross Join 交叉连接,没有条件筛选,返回笛卡尔积. 如果以 ,(逗号)分隔表名进行查询如 select * from tbl_name1, tb ...

  2. Java-API-Package:javax.http.servlet

    ylbtech-Java-API-Package:javax.http.servlet 1.返回顶部 1. Package javax.servlet.http This chapter descri ...

  3. centos7下搭建ceph luminous(12.2.1)--无网或网络较差

    本博客的主要内容是在centos7下搭建luminous,配置dashboard,搭建客户端使用rbd,源码安装ceph,最后给出一些较为常用的命令.本博客针对初次接触ceph的人群. 搭建环境: 主 ...

  4. 国际化---demo1---bai

    login.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  5. appium_python 怎样实现参数化自动生成用例

    1.对于一种对同一个页面同一点 要用不同数据测试形成多条测试用例,如果复制的话 会让代码很冗长,并且并不好维护,现在用封装的方法把 不变的代码 和 变化的参数 分别封装,形成动态 生成测试用例 ,主要 ...

  6. 如何判断python的数据类型,用type函数

    用 type 函数 In [29]:  type(dataset) Out[29]: list 查询list的行数 In [38]: len(dataset) In [39]: Out[38]: 36 ...

  7. The R Project for Statistical Computing

    [Home] Download CRAN R Project About R Contributors What’s New? Mailing Lists Bug Tracking Conferenc ...

  8. Django 学习之---静态文件处理详解

    前言: 1.静态文件是指 网站中的 js, css, 图片,视频等文件 2.静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中. 当 DEB ...

  9. 登陆Oracle出现错误java.lang.exception

    出现错误时登录企业管理器时出现的界面 出现这种错误一般是因为没有设置时区,一般默认的是agentTZRegion=GMT,也就是GMT.所以大家只要设置了这个东西,然后重新启动dbconsole就可以 ...

  10. eclipse java 注释模板配置详解

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...