Miller-Rabin素数测试

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%pLL 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;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/9314006.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

throws Exception的意思

在方法声明部分使用&#xff0c;表示该方法可能产生此异常&#xff0c;如果在方法声明处使用了throws声明异常&#xff0c;则该方法产生异常也不必捕获&#xff0c;会直接把异常抛出到调用该方法的地方。

java list按照元素对象的指定多个字段属性进行排序

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 直接提取重点代码&#xff1a; /*** 把结果集合按时间字段排序&#xff0c;内部类重写排序规则&#xff1a;* param list* return*/priv…

网络爬虫--18.python中的GIL(全局解释器锁)、多线程、多进程、并发、并行

参考文献&#xff1a; python的GIL、多线程、多进程 并发和并行的区别&#xff1f; GIL(全局解释器锁)一看就懂的解释&#xff01; 多谢作者分享&#xff01;

Socket和ServerSocket

对于即时类应用或者即时类的游戏&#xff0c;HTTP协议很多时候无法满足于我们的需求。这会&#xff0c;Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socket、ServerSocket、多线程这几个方面阐述。异常类型在了解Socket的内容之前&#…

彻底搞清楚Android中的 Attr

版权声明&#xff1a;本文为sydMobile原创文章&#xff0c;转载请务必注明出处&#xff01; https://blog.csdn.net/sydMobile/article/details/79978187 相信这个词对于Android开发者来说十分熟悉了&#xff0c;那么你对他到底有多了解呢&#xff1f; 回忆起我刚开始接触Andr…

D. Relatively Prime Graph

Lets call an undirected graph G(V,E)G(V,E) relatively prime if and only if for each edge (v,u)∈E(v,u)∈E GCD(v,u)1GCD(v,u)1 (the greatest common divisor of vv and uu is 11). If there is no edge between some pair of vertices vv and uu then the value of GC…

解决 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.tanj.mapper.SendDeta…

网络爬虫--19.【Scrapy-Redis实战】分布式爬虫爬取房天下--环境准备

文章目录0. 思路一. 虚拟机Ubuntu0中安装Redis二. 虚拟机Ubuntu1中安装Redis三. Windows服务器上安装Redis四. 安装cmder五. 安装RedisDesktopManager六. 修改Windows中的配置文件redis.windows.conf七. Ubuntu连接Windows上 的Redis服务器-----------------------------------…

开发人员,请爱护你的身体

最近一周身体极度不适&#xff0c;口腔溃疡、嗓子痛、感冒咳嗽、发烧&#xff0c;统统来了一个遍&#xff0c;非常痛苦。所以最近一直关注有关于软件开发人员的身体健康问题的网站、文章。 看了许多文章&#xff0c;在结合自己在这一周之内痛苦的感受&#xff0c;所以才写这样…

tkinter中scale拖拉改变值控件(十一)

scale拖拉改变值控件 使用户通过拖拽改变值 简单的实现&#xff1a; 1 import tkinter2 3 wuya tkinter.Tk() 4 wuya.title("wuya") 5 wuya.geometry("300x2001020") 6 7 8 # 创建对象 9 scale1 tkinter.Scale(wuya, from_0, to100) 10 scale1.pac…

vue+elementUI开发实践问题总结

最近公司项目采用vue&#xff0c;实行前后端分离开发&#xff0c;采用element-ui框架&#xff0c;对于项目中遇到的问题进行记录&#xff0c;便于日后查询。 vueelementui怎样点击table中的单元格触发事件&#xff1f;官方文档是采用的cell-click方式。实际项目中需要在不同的t…

Socket的getInputStream()方法

Socket的getInputStream()方法可以获得网络连接输入&#xff0c;同时返回一个InputStream实例 。

计算机图形学理论(4):缓冲区

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 什么是缓冲区&#xff1f; 缓冲区是保存某些数据的临时存储空间。 为什么我们需要缓冲区&#xff1f;原因很简单&#xff0c;当数据量很大时&#xff0c;因为计算机无…

解决:Every derived table must have its own alias

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias 解决&…

网络爬虫--20.【Scrapy-Redis实战】分布式爬虫获取房天下--代码实现

文章目录一. 案例介绍二.创建项目三. settings.py配置四. 详细代码五. 部署1. windows环境下生成requirements.txt文件2. xshell连接ubuntu服务器并安装依赖环境3. 修改部分代码4. 上传代码至服务器并运行一. 案例介绍 爬取房天下&#xff08;https://www1.fang.com/&#xff…

同一台电脑安装python2python3

【安装之前&#xff0c;先了解一下概念】 python是什么&#xff1f; Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&#xff0c;第一个公开发行版发行于1991年。 Python是纯粹的自由软件&#xff0c; 源代码和解释器CPytho…

程序员的常见健康问题

其实这些问题不仅见于程序员&#xff0c;其他长期经常坐在电脑前的职场人士&#xff08;比如&#xff1a;网络编辑、站长等&#xff09;&#xff0c;都会有其中的某些健康问题。希望从事这些行业的朋友&#xff0c;对自己的健康问题&#xff0c;予以重视。以下是全文。 我最近…

Java中BufferedReader和InputStreamReader

BufferedReader 类BufferedReader 由Reader类扩展而来&#xff0c;提供通用的缓冲方式文本读取&#xff0c;而且提供了很实用的readLine&#xff0c;读取一个文本行&#xff0c;从字符输入流中读取文本&#xff0c;缓冲各个字符&#xff0c;从而提供字符、数组和行的高效读取。…

网络爬虫--21.Scrapy知识点总结

文章目录一. Scrapy简介二. Scrapy架构图三. Scrapy框架模块功能四. 安装和文档五. 创建项目六. 创建爬虫一. Scrapy简介 二. Scrapy架构图 三. Scrapy框架模块功能 四. 安装和文档 中文文档&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html …

Spring 定时任务的几种实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 近日项目开发中需要执行一些定时任务&#xff0c;比如需要在每天凌晨时候&#xff0c;分析一次前一天的日志信息&#xff0c;借此机会整…