数论 Miller_Rabin质数测试

作用

当需要判断一个数字是否是质数时,又发现数字过大,\(0(\sqrt n)\)难以承受的时候,就可以使用Miller_Rabin质数测试

基本定理

定理一,费马小定理:

\[(p是质数)\Rightarrow a^{p-1}\equiv 1
\]

定理二,二次探测:

\[(p是质数)且(x^2\equiv1,当1<x<p) \Rightarrow x=1 或x=p-1
\]

基本定理的证明

直接引用一下别人博客上的证明,感觉证明得清晰明了,个人复述一下反而显得累赘

至此,是Miller_Rabin所需要的所有理论知识

算法流程

设要测试的数字为x

  1. 若x是偶数,0,1,2,可以直接判断
  2. 找出如下形式的s,t,使之满足\(2^s\times t\equiv1 (mod\ x)\),要求t是个奇数
  3. 随机质数a(满足a小于x)
  4. 对于\(a^t\)循环进行:平方、二次探测..(共计循环s次)。倘若任意一次不满足条件,则x为合数
  5. 对于\((2^{t})^{2\times s}\)验证费马小定理,倘若不满足,则x为合数
  6. 循环随机若干个质数a,继续测试
  7. 上述操作之后仍未筛掉x,则x大概率是质数

Tips

[1] Miller_Rabin质数测试可以极大概率地判断出质数,但存在会有合数误判为质数的情况。这类强伪质数,称之为卡米歇尔强伪素数。

[2] 虽然是大概率,但概率之大足以放心使用。据考证:在int范围内,取遍30以内的所有质数后,保证该算法的正确性

[3] Miller_Rabin可以承受高达long long的数据范围,实际上限未知

[4] 记得快速乘优化

code:

bool millar_rabin(ll x){
if(x==2) return true;
if(!(x&1)||x==0||x==1) return false;
ll s=0,t=x-1;
while(!(t&1)) s++,t>>=1; //寻找合适的s和t for(int p=1;p<=30&&prime[p]<x;++p){
ll b=qsm((ll)prime[p],t,x),k;
for(ll i=1;i<=s;++i){
k=qsc(b,b,x); //将b平方
if(k==1&&b!=1&&b!=x-1) return false;
b=k;
}
if(b!=1) return false;
}
return true;
}

参考资料:Miller-Rabin素数测试算法

Miller_Rabin质数测试的更多相关文章

  1. Miller_Rabin素数测试

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

  2. Miller-Rabin质数测试

    Miller-Rabin质数测试 本文主要讨论使用Miller-Rabin算法编写素数的判定算法,题目来源于hihocoder. 题目 题目要求 时间限制:10000ms 单点时限:1000ms 内存 ...

  3. [学习笔记] Miller-Rabin质数测试 & Pollard-Rho质因数分解

    目录 Miller-Rabin质数测试 & Pollard-Rho质因数分解 Miller-Rabin质数测试 一些依赖的定理 实现以及正确率 Pollard-Rho质因数分解 生日悖论与生日 ...

  4. [学习笔记] Miller-Rabin 质数测试

    Miller-Rabin 事先声明,因为菜鸡Hastin知识水平有限就是菜,因此语言可能不是特别规范,仅供理解. step 0 问一个数\(p\)是否为质数,\(p<=10^{18}\). 一个 ...

  5. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  6. 优化后的二次测试Miller_Rabin素性测试算法

    ll random(ll n) { return (ll)((double)rand()/RAND_MAX*n + 0.5); } ll pow_mod(ll a,ll p,ll n) { ) ; l ...

  7. 【HOJ1356】【Miller_rabin素性测试】Prime Judge

    Given a positive integer, your job is writing a program to determine whether it is a prime number or ...

  8. hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥

    Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Pr ...

  9. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

  10. Miller_Rabin素数测试【学习笔记】

    引语:在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法).但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用.所以我们需要 ...

随机推荐

  1. Windows Server 2012部署遇到的问题

    一.安装IIS提示"服务器管理器WinRM插件可能已损坏或丢失" 解决方案: 1.开启WinRM服务,添加ip监听 在服务中查看WinRM服务是否开启,如果没有开启则把该服务开启, ...

  2. HAProxy反向代理实例

    1.环境准备: 设备 IP地址 作用 系统版本 web1 10.0.0.18 Nginx-Web服务器 Rocky8.6 web2 10.0.0.28 Nginx-Web服务器 Rocky8.6 Ha ...

  3. AR空间音频能力,打造沉浸式声音体验

    随着元宇宙的兴起,3D虚拟现实广泛引用,让数字化信息和现实世界融合,目前大家的目光主要聚焦于视觉交互层面,为了在虚拟环境中更好的再现真实世界的三维空间体验,引入听觉层面必不可少,空间音频孕育而生. 空 ...

  4. SpringBoot启动流程源码分析

    前言 SpringBoot项目的启动流程是很多面试官面试中高级Java程序员喜欢问的问题.这个问题的答案涉及到了SpringBoot工程中的源码,也许我们之前看过别的大牛写过的有关SpringBoot ...

  5. 嵌入式-C语言基础:数组作为参数传递需要注意的问题

    #include <stdio.h> void printData(int data) { printf("%d\n",data); } //形参中不存在数组的概念,即 ...

  6. Go语言核心36讲25

    你好,我是郝林,今天我分享的主题是:测试的基本规则和流程(上). 你很棒,已经学完了本专栏最大的一个模块!这涉及了Go语言的所有内建数据类型,以及非常有特色的那些流程和语句. 你已经完全可以去独立编写 ...

  7. React实用插件收集

    1.react-img-editor 图片编辑 demo: npm install react-img-editor -S 引入和使用 import ReactImgEditor from 'reac ...

  8. UBOOT编译--- include/config/auto.conf、 include/config/auto.conf.cmd、 include/generated/autoconf.h (二)

    1. 前言 UBOOT版本:uboot2018.03,开发板myimx8mmek240. 2. 背景 在编译构建目标时(如 make xxx),顶层 Makefile 的 dot-config 变量值 ...

  9. Guess Next Session

    打开又是一个输入框的界面,点一下下面的看源码 很简短的一个源码 大概意思是如果password等于session[password]就输出flag 直接搜了下session函数的漏洞,发现sessio ...

  10. 更换linux的开机启动图片, 启动主题

    简述 之前就想更改开机的启动图片,但是后来简单查了一下,说要重新编译内核,听到编译我就望而却步了,今天发现只是个命令而已,注意这里我用的是 linux mint .这里更改不是 grub 主题, 是 ...