首页 > 编程语言 >从龟速乘到 $Miller-Rabin$ 算法(数论算法总结)

从龟速乘到 $Miller-Rabin$ 算法(数论算法总结)

时间:2024-08-23 15:25:51浏览次数:8  
标签:龟速 return int Miller mid long re 算法

发现自己竟然菜到不太会龟速乘,所以把 \(Miller-Rabin\) 算法所需要用到的算法全学了一遍……

龟速乘

龟速乘是一种 \(O(\log n)\) 的乘法计算方法。

考虑有时普通乘法取模会爆 \(long\ long\),因此我们考虑用类似快速幂的方式进行乘法运算。

int mul(int x,int y,int c){
	x%=c,y%=c;
	int re=0;
	while(y){
		if(y&1) re+=x,re-=(re>=c)?c:0;
		x+=x,x-=(x>=c)?c:0,y>>=1;
	}return re;
}

快速乘

快速乘是一种 \(O(1)\) 的乘法计算方法。

发现 \(long\ double\) 可以存储 \(10^{300}\) 的数,所以考虑使用 \(long\ double\) 进行乘法运算。我还没有遇到过出锅的情况。

int mul(int a,int b,int p){
	return (a*b-(int)((long double)a/p*b)*p+p)%p;
}

\(Miller-Rabin\) 算法

哈,这玩意错的跟对的一样。

和快速幂求逆元一样,我们考虑费马小定理。

我们可以得到:

设 \(f(x)=a^{x-1}\bmod x\),则当 \(f(p)\ne 1\) 时,\(p\) 一定是合数;当 \(p\) 是质数时,\(f(p)=1\)。

但是正确率不是人类所能接受的,所以考虑优化。

考虑下面这个性质:

若 \(b^2\bmod p=1\),\(p\) 为质数,则 \(b-1|p\) 或 \(b+1|p\)。

这样我们就可以进行二次探测,正确率大大提高。

我们设用于测试的集合为 \(A\),则 \(A=\{2,3,5,7,11,13,17,19,23\}\) 时,对于 \(x\le 10^{18}\) 的情况,都可以正确判断 \(x\) 的素性。

int mr[9]={2,3,5,7,11,13,17,19,23};
int mul(int a,int b,int p){
	return (a*b-(int)((long double)a/p*b)*p+p)%p;
}int qpow(int x,int y,int c){
	int re=1;
	while(y){
		if(y&1) re=mul(re,x,c);
		x=mul(x,x,c),y>>=1;
	}return re;
}int check(int x,int md){
	int c=md-1,mid=qpow(x,c,md);
	if(mid!=1) return 0;
	while(!(c&1)&&mid==1)
		c>>=1,mid=qpow(x,c,md);
	return (mid==1||mid==md-1);
}int miller_rabin(int x){
	if(x<2) return 0;
	if(x<=23){
		for(int i=0;i<9;i++)
			if(mr[i]==x) return 1;
		return 0;
	}for(int i=0;i<9;i++)
		if(!check(mr[i],x)) return 0;
	return 1;
}

标签:龟速,return,int,Miller,mid,long,re,算法
From: https://www.cnblogs.com/chang-an-22-lyh/p/18375916/shulun1-zj

相关文章

  • 每天学习一个基础算法之选择排序
    目录前言:一、选择排序的基本思路和实现方法1、基本思路2、实现方法二、选择排序的执行过程示意图三、选择排序的实现代码选择排序代码主体(以接口函数的形式)测试部分(主函数调用) 四、对选择排序复杂度的分析背景知识:1、选择排序的时间复杂度 精确计算:*采用大O......
  • 24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,33
    目录198.打家劫舍题目描述题解213.打家劫舍II题目描述题解337.打家劫舍III题目描述题解打家劫舍的一天......
  • 用Python实现9大回归算法详解——09. 决策树回归算法
    1.决策树回归的基本概念决策树回归(DecisionTreeRegression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈值来最大化每次分裂后的目标函数增益,从而找到使误差最小化的模型......
  • 【LLM & RAG & text2sql】大模型在知识图谱问答上的核心算法详细思路及实践
    前言本文介绍了一个融合RAG(Retrieval-AugmentedGeneration)思路的KBQA(Knowledge-BasedQuestionAnswering)系统的核心算法及实现步骤。KBQA系统的目标是通过自然语言处理技术,从知识图谱中提取和生成精确的答案。系统的实现包括多个关键步骤:mention识别、实体链接及排序、属......
  • 字符串搜索算法
    目录二分搜索(适用于有序字符串数组)Trie树(前缀树)后缀树与后缀数组二分搜索(适用于有序字符串数组)基本概念二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中查找特定元素。与线性搜索相比,二分搜索通过逐步减少搜索范围,大幅提高查找效率。算法步骤确定中间元......
  • CNN-BiLSTM-Attention(12种算法优化CNN-BiLSTM-Attention多输入单输出)
     12种算法优化CNN-BiLSTM-Attention模型预测的代码。其中Attention模型可以改为单头或者多头,在代码中就是改个数字而已。代码注释已写好如何更改。12种算法优化CNN-BiLSTM-Attention多特征输入单步预测代码获取戳此处代码获取戳此处代码获取戳此处主要功能为:采用12种......
  • 【408DS算法题】022基础-递增输出单链表中的结点值
    Index题目分析实现总结以上内容稍后补全,以下内容来自https://blog.csdn.net/weixin_60702024/article/details/141336041题目分析实现总结分析题目给定单链表的头结点,按照递增的顺序,输出单链表结点的值。分析实现具体实现如下:总结注意delete执行后,只会将......
  • Scratch编程深度探索:解锁递归与分治算法的奥秘
    标题:Scratch编程深度探索:解锁递归与分治算法的奥秘在编程的世界里,递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch,这款专为儿童和初学者设计的图形化编程工具,是否能够支持实现这样复杂的逻辑呢?本文将深入探讨Scratch在实现递归和分治算法方面的能力,并提......
  • 代码随想录DAY22 - 回溯算法 - 08/21
    目录理论回顾什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯组合题干思路和代码递归法递归优化:剪枝组合总和Ⅲ题干思路和代码递归法递归优化电话号码的字母组合题干思路和代码递归法理论回顾什么是回溯法回溯是一种类似枚举的搜索方法,回溯和......
  • 代码随想录DAY23 - 回溯算法 - 08/22
    组合总和题干题目:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少......