首页 > 编程语言 >Miller-Rabin算法学习笔记

Miller-Rabin算法学习笔记

时间:2023-01-09 17:25:47浏览次数:60  
标签:int Miller 质数 算法 定理 using Rabin ll define

个人不是很理解Miller-Rabin算法的正确性,所以这篇东西可以图一乐(

确定性判素性的方法都很慢,所以要考虑随机但是错误概率低的判素方法。

首先有Fermat素性测试,即费马小定理的逆用。众所周知费马小定理有\(a^{m-1}\bmod m=1\),当\(m\)是质数是对\(a\in[1,m-1]\)成立。于是当要判定一个\(m\)是否是质数时,我们随机取出若干个\(a\),计算这个值是不是\(1\),若不是则可确定\(m\)不是质数,否则在一定的轮数过后可以认为\(m\)是质数。

除了不是质数却满足费马小定理的数以外,每个数都有可能被筛查出来。如果所有数都有概率被筛查出来,那么增加轮数后这个算法就具有实际意义。但是实际上仍然有不是质数却满足费马小定理的数,因此这个方法不能用于实战。

接下来介绍二次探测定理,即对于奇素数\(n\),使得\(x^2\bmod n=1\)的\(x\)有且仅有\(x=1\)与\(x=n-1\),移项后平方差即可证明。

考虑在费马小定理的判断中加入二次探测定理。即先将\(n-1\)分解为\(a\times 2^b\),然后随机\(p\)计算出\(p^a\bmod n\),然后每次平方\(p\),操作\(b-1\)次,如果结束时\(b\)不为\(n-1\)或\(1\),则代表发现新的平方根,\(n\)不为素数。

听说操作\(k\)次的正确率是\(4^{-k}\),不知道对不对。

LOJ模板题代码

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n))
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=4e5+5,M=N*4+5,K=1e5+5,mod=998244353,Mod=mod-1;const ll INF=2e18+7;const db eps=1e-5;mt19937 rnd(time(0));
ll x;
ll mpow(ll x,ll p,ll y){ll Ans=1;while(y) y&1&&(Ans=(__int128)Ans*x%p),y>>=1,x=(__int128)x*x%p;return Ans;}
int CK(ll n){
	if(n<3||n%2==0) return n==2;ll a=n-1,b=0;while(a%2==0) a/=2,b++;
	int t=8,i;while(t--){
		ll x=R(n-2)+2,p=mpow(x,n,a);
		if(p==1) continue;
		for(i=0;i<b;i++){
			if(p==n-1) break;p=(__int128)p*p%n;
		}if(i>=b) return 0;
	}return 1;
}
int main(){
	freopen("1.in","r",stdin);
	int i,j;while(~scanf("%lld",&x)) puts(CK(x)?"Y":"N");
}

标签:int,Miller,质数,算法,定理,using,Rabin,ll,define
From: https://www.cnblogs.com/275307894a/p/17037623.html

相关文章

  • 线性表算法相关练习
    //将两个递增的有序链表合并为一个递增的有序链表。//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。#include<iostream>#......
  • 算法题基础知识汇总
     子串长度字符串python字符串的while()循环遍历​​http://www.cocoachina.com/articles/895083​​c-如何在std::vector中存储固定长度的字符串​​http://www.myexcep......
  • 每日算法之14. 最长公共前缀
    14.最长公共前缀题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。方法暴力算法先判断字符串数组是否有为空,为空直接......
  • Model-Agnostic Meta-Learning (MAML)模型介绍及算法详解
    paper:​​​https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1703.03400.pdf​​ MAML在学术界已经是非常重要的模型了,论文Model-AgnosticMeta-LearningforFa......
  • 算法--2023.1.9
    1.力扣128-最长连续序列classSolution{publicintlongestConsecutive(int[]nums){//通过hashset保存去重复后的所有数据intn=nums.lengt......
  • 贪心算法
    一、贪心算法思想1)贪心算法原理贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局......
  • 详解 Kruskal 最小生成树算法
     求最小生成树算一般有两种算法:Prim和Kruskal。Prim的时间复杂度为\(O(|V|^{2})\),更适合稠密图。而Kruskal的时间复杂度为\(O(logV)\)或\(O(logE)\)。更适......
  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 退火算法学习笔记
    初创建于2022-02-0900:29前段时间学习了一下退火算法。这里简单记一下踩过的坑~退火算法是一种搜索算法,我认为其核心思想便是”以一定的概率接受一个更差的解“,这样可......
  • 【车间调度】基于GA/PSO/SA/ACO/TS优化算法的车间调度比较(Matlab代码实现)
    目录1概述2 FJSP描述3运行结果3.1main1运行结果3.2main2运行结果4Matlab代码 5参考文献6写在最后1概述柔性作业车间调度问题(FlexibleJobshopSched-ulingPro......