算法记录——快速判定多个数(1~1e18)是否为质数(Miller_rabin)

2023-11-08

质数判定

题目描述
判定输入的数是不是质数。

输入格式
若干行,一行一个数 。
行数不超过 105
输出格式
对于输入的每一行,如果 是质数输出一行 Y,否则输出一行 N。

样例
样例输入
1
2
6
9
666623333
样例输出
N
Y
N
N
Y

数据范围与提示
1 <= x <= 1 * 1018

欢迎hack(如果你不是管理员,可以在题目讨论区发帖)。


Miller_rabin 详解链接

Miller_rabin算法
优势可以单独判断一个大数是否素数。
缺点他是一个不保证正确的算法,我们只能通过多次执行算法让这个错误的概率很小,不过幸运的是通常来看它的错误概率可以小到忽略不计。

#include <iostream> 
#include <cstdio> 
#include <algorithm>  
#include <cmath>  
#include <cstring>  
#include <map>  
using namespace std;
 
const int times = 13;
int number = 0;
 
map<long long, int>m;
long long Random( long long n )			//生成[ 0 , n ]的随机数
{
	return ((double)rand( ) / RAND_MAX*n + 0.5);
}
 
long long q_mul( long long a, long long b, long long mod ) //快速计算 (a*b) % mod
{
	long long ans = 0;
	while(b)
	{
		if(b & 1)
		{
			b--;
			ans =(ans+ a)%mod;
		}
		b /= 2;
		a = (a + a) % mod;
 
	}
	return ans;
}
 
long long q_pow( long long a, long long b, long long mod ) //快速计算 (a^b) % mod
{
	long long ans = 1;
	while(b)
	{
		if(b & 1)
		{
			ans = q_mul( ans, a, mod );
		}
		b /= 2;
		a = q_mul( a, a, mod );
	}
	return ans;
}
 
bool witness( long long a, long long n )//miller_rabin算法的精华
{//用检验算子a来检验n是不是素数
	long long tem = n - 1;
	int j = 0;
	while(tem % 2 == 0)
	{
		tem /= 2;
		j++;
	}
	//将n-1拆分为a^r * s
 
	long long x = q_pow( a, tem, n ); //得到a^r mod n
	if(x == 1 || x == n - 1) return true;	//余数为1则为素数
	while(j--) //否则试验条件2看是否有满足的 j
	{
		x = q_mul( x, x, n );
		if(x == n - 1) return true;
	}
	return false;
}
 
bool miller_rabin( long long n )  //检验n是否是素数
{
 
	if(n == 2)
		return true;
	if(n < 2 || n % 2 == 0)
		return false;				//如果是2则是素数,如果<2或者是>2的偶数则不是素数
 
	for(int i = 1; i <= times; i++)  //做times次随机检验
	{
		long long a = Random( n - 2 ) + 1; //得到随机检验算子 a
		if(!witness( a, n ))						//用a检验n是否是素数
			return false;
	}
	return true;
}
 
 
int main( )
{
	long long tar;
	while(cin >> tar)
	{
		if(miller_rabin( tar ))	//检验tar是不是素数
			cout << "Y" << endl;
		else
			cout << "N" << endl;
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法记录——快速判定多个数(1~1e18)是否为质数(Miller_rabin) 的相关文章

随机推荐

  • 【blender基础】常用基础功能记录

    blender常用基础功能记录 1 游标与选中项的吸附功能 1 1 选中项 gt 游标 1 2 选中项 gt 游标 保持偏移 1 3 选中项 gt 活动项 1 4 选中项 gt 栅格点 1 5 游标 gt 栅格点 1 6 游标 gt 世界原
  • linux-Team-网卡绑定

    简介 在 linux 中 Rhel7 之前都是使用 bond 机制来实现多网卡绑定同一个 IP地址 来对网络提供访问 并按不同的模式来负载均衡或者轮回接替管理处理数据 而到Rhel7 之后 提供了一种强大的工具 nmcli工具命令 使用此工
  • 如何导出无水印_短视频如何去水印,短视频去水印原理解析

    大家平时在收集视频素材时候 可能会看见某某短视频平台一个非常中意的作品 但是保存到本地之后 切有LOGO水印感觉非常失望 因为有了水印 可能对我们2次编辑和调用会带来比较多的麻烦 如果直接用视频编辑软件进行马赛克模糊处理 又会对视频本身质量
  • JS正则表达式验证是否为11位有效手机号码

    最近在做注册登陆页面 都要涉及到验证11位有效手机号码 这里贴出代码 希望能帮到有这个开发需求的朋友 function isPoneAvailable poneInput var myreg 1 3 4 5 7 8 0 9 9 if myr
  • 一个vue项目同时兼容pc和移动端

    介绍 公司要求vue开发的项目 既有移动端又有pc端 但是移动端和pc端展示的内容不一样 同一个组件样式也不一样 移动端展示内容比pc端少 那这个时候在一个项目种怎么做的 解决方式 路由写两份 一份移动端的 一份pc端的 这两份路由地址相同
  • 使用vscode找不到Python常见包的问题

    首先明白一个概念 Python会在以下路径中搜索它想要寻找的模块 1 程序所在的文件夹 2 标准库的安装路径 3 操作系统环境变量PYTHONPATH所包含的路径 将自定义库的路径添加到Python的库路径中去 有如下两种方法 1 动态的添
  • spring 控制反转和依赖注入的简单理解

    最近在学习springboot的时候发现我对spring不能抽象说出意思 证明当时并没理解spring只是限于使用 对于刚踏入这行的毕业生这是不行的 为了养成良好的习惯 坚持将工作中的问题总结发成博客供自己观看哈哈 现在来看一个例子 创建了
  • 用Electron将web网页程序包装成桌面应用

    用Electron将web网页程序包装成桌面应用 前提 web 端页面 真的太容易一不小心关掉了 或者 标签页比较多的时候不太容易找到 所以决定快速包装一个 认识electron electron快速入门 搭建electron项目 第一步
  • MySQL数据库:SQL语句

    MySql数据库系列阅读 MySQL数据库 MySQL数据库 SQL语句 MySQL数据库 完整性约束 MySQL数据库备份与还原 MySQL数据库 编码 1 SQL概述 1 1 什么是SQL SQL Structured Query La
  • educoder 数据库

    查询CS系学生选择的课程 列出学号 课程号 成绩 select sno cno grade from Sc where Sno in select Sno from Student where Sdept CS 查询没有选C06 课程号 课
  • node连接mysql报错:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested

    NodeJs 代码 const mysql require mysql const db mysql createPool host 127 0 0 1 user root password database dbtest1 db quer
  • uni-app微信分享 自定义分享链接在iOS中不生效的问题处理

    最近使用uni app开发了一个微信小程序使用的功能 需要用到分享给微信好友的功能 如果不做如下设置的话 本身微信默认的分享只是当前页面 分享 initShare let this this var linkUrl this GLOBAL
  • 飞机大战游戏微信小程序源码

    目录 软件介绍 微信飞机大战游戏特色 源码链接 软件介绍 微信飞机大战游戏是一款十分好玩有趣的射击类型手游 游戏的操作简单玩家很容易上手 玩法也十分的有趣 具有一定的挑战性 游戏中还会不时的出现各种让你意想不到的惊喜哦 别再犹豫 一起来感受
  • Java 4-1&2、全局异常处理

    全局异常处理 注 使用Mybatis自带的异常处理 简单异常处理 用到的注解 ControllerAdvice Spring3 2提供的新注解 Controller增强器 可对controller层中被 RequestMapping 注解了
  • 解决openwrt ipk missing dependencies libpthread librt

    新版本的trunk有在ipk打包的过程中的bug 他不能自动识别SDK中已经变异的动态链接库 比如libpthread libboost这些 解决方案是修改与pakage里同级的makefile的内容 可以修改如下 主要是添加DEPENDS
  • 高斯消元法 matlab_高斯消元法解线性方程组

    假设矩阵A是一个n阶非奇异方阵 那么对于任意一个n维向量b 线性方程组Ax b有唯一的解 考虑如下方程组 我们通常为了求解它 我们把 4乘以第一行加到第二行 7乘以第一行加到第三行 然后在进行求解 这个过程就是高斯消元法 下面我们看看通过m
  • ubuntu与centos对比和应用场景(非常透彻的一篇文章)

    观点1 CentOS适用于服务器 Ubuntu则适用于个人桌面 服务器 这一点是CentOS胜 虽然它们同样是开源 免费 CentOS它的源码是来自由商业服务器Red Hat Enterprise Linux 有很多公司都是用CentOS来
  • Typora设置字体颜色的解决方案

    关于Typora设置字体颜色的解决方案 Typora无疑是一款功能强大的编辑器 但是却无法像Word和WPS一样 随意更改设置自己喜欢的颜色 本文给出的方法需要提前安装软件 AutoHotKey 下面给出详细的操作方法 安装AutoHotK
  • 财报解读:首次全口径盈利,快手深耕电商找准了发展门道?

    快手成功闯过了盈利大关 近日快手发布的Q2财报显示 其借助于电商 内循环 取得超预期成效 不仅用户数相比一季度环比净增1900万 再创新高 而且迎来了成立以来首次单季度全口径盈利 对于快手盈利能力的大幅提升 资本市场也做出积极反应 财报发布
  • 算法记录——快速判定多个数(1~1e18)是否为质数(Miller_rabin)

    质数判定 题目描述 判定输入的数是不是质数 输入格式 若干行 一行一个数 行数不超过 105 输出格式 对于输入的每一行 如果 是质数输出一行 Y 否则输出一行 N 样例 样例输入 1 2 6 9 666623333 样例输出 N Y N