首页 > 编程语言 >扩展欧几里得算法模板

扩展欧几里得算法模板

时间:2023-11-04 16:00:45浏览次数:27  
标签:frac gcd int 欧几里得 算法 逆元 ax aligned 模板

扩展欧几里得算法

问题:给定两个非零整数$a$和$b$,求一组整数解$(x, y)$ ,使得$ax+by=gcd(a,b)$ 成立($gcd(a,b)$ 是a、b的最大公约数)。


$$
\begin{aligned} ax_1+by_1&=gcd(a, b) \ bx_2+(a%b)y_2&=gcd(b, a%b) \end{aligned}
$$

化简,得递推公式:
$$
\begin{aligned} &x_1=y_2 \ &y_1=x_2-(a/b)y_2 \end{aligned}
$$

int exGcd(int a, int b, int &x, int &y){
	if(b == 0){
		x = 1; y = 0;
		return a;
	}
	int g = exGcd(b, a%b, x, y);
	int t = x;
	x = y;
	y = t - (a/b)*y;
	return g;
}

在得到一组解后,就可以通过下面的式子得到全部解
$$
\begin{aligned}
x'&=x+\frac{b}{gcd}K \
y'&=y-\frac{a}{gcd}
K \
gcd &= gcd(a, b), K为任意整数
\end{aligned}
$$

方程ax+by=c的求解

问题:求解$ax+by=c$,其中c为任意整数。

$ax+by=c$ 存在解的充要条件是 $c%gcd(a,b)==0$即c是$(x,y)$的系数的最大公约数的倍数),且一组解$(x, y)$ 等于$(\frac{cx_0}{gcd},\frac{cy_0}{gcd})$

在得到一组解后,就可以通过下面的式子得到全部解
$$
\begin{aligned}
x'&=x+\frac{b}{gcd}K = \frac{cx_0}{gcd}+\frac{b}{gcd}K\
y'&=y-\frac{a}{gcd}K = \frac{cy_0}{gcd}-\frac{a}{gcd}K\
gcd &= gcd(a, b), K为任意整数
\end{aligned}
$$

同余式$ax\equiv c(mod,m)$的求解

同余式:对于整数a、b、m,若$a%m==b%m$ ,即a、b余数相同,则对应的同余式为$a\equiv b(mod,m)$

问题:求解x,$ax\equiv c(mod,m)$ 。

由题可得,
$$
\begin{aligned}
a(x%m)&c%m \
(ax-c)&=my \
ax-my&=c, y=-y \
ax+my&=c \
\end{aligned}
$$
由之前的结论得,当$c%gcd(a,m)
0$ 时,方程$ax+my=c$ 有解,该方程的通解为:
$$
\begin{aligned}
x'&=x+\frac{m}{gcd}K \
y'&=y-\frac{a}{gcd}
K \
gcd &= gcd(a, m), K为任意整数
\end{aligned}
$$
对于同余式,改通解有很多解在模m的意义下是相同的,当K取$[0,gcd(a,m))$ 时,所得到的解在模m的意义下不同。

逆元的求解以及$(b/a)%m$ 的计算

(乘法)逆元:设a, b, m是整数,$m>1$ 且 $ab \equiv 1(mod ,m),或,a \equiv \frac{1}{b}(mod , m)$ ,即两数乘积模m后为1,则a和b互为模m的逆元。

问题:假设a、m是整数,求a模m的逆元。

解法一

设x是a模m的逆元,则
$$
(b/a)%m = (b*x)%m
$$
这样可以将除法取模转化为乘法取模,可以解决被除数b非常大(使得b已经去过模,不是原始值)的问题。

因此,求a模m的逆元,就是求解同余式$ax\equiv 1(mod,m)$ ,即求解$ax+my=1$ 。在实际问题中,一般把x的最小正整数解为a模m的逆元。如果$1%gcd(a,m)0, 即gcd(a,m)1$,那么同余式$ax\equiv 1(mod,m)$ 在$(0, m)$ 上有唯一解。

// 求a模m的逆元,使用条件:gcd(a,m)=1
int reverse(int a, int m){
    int x, y;
    int g = exGcd(a, m, x, y);
    return (x%m+m) % m;
}

解法二

如果m是素数,且a不是m的倍数,则可以直接使用费马小定理来得到逆元。

费马小定理:设m是素数,a是任意整数且不是m的倍数($a\not\equiv 0(mod,m)$),则 $a^{m-1} \equiv1(mod,m)$ 。

由定义可知$a^{m-2}$ 是a模m的逆元,其可由快速幂算法求出。[[../../二分/快速幂|快速幂]]

解法三

如果 $gcd(a,m)\not=1$ ,扩展欧几里得算法和费马小定理均失效,此时a模m的逆元从概念上来讲不存在,但$(b/a)%m$ 仍然是有值的(且为整数),该如何求解?

$$
\begin{aligned}
(b/a)%m&=x \
b/a&=km+x \
b&=kam+ax \
b%(am)&=ax\
b%(am)/a&=x\
(b/a)%m&=b%(am)/a \
\end{aligned}
$$
即$(b/a)%m=b%(am)/a$ ,注意a和m的乘积可能会溢出

标签:frac,gcd,int,欧几里得,算法,逆元,ax,aligned,模板
From: https://www.cnblogs.com/Afinis/p/17809452.html

相关文章

  • 音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
    一、介绍音乐推荐与管理系统。本系统采用Python作为主要开发语言,前端使用HTML、CSS、BootStrap等技术搭建界面平台,后端使用Django框架处理请求,并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协同过滤推荐算法模块,实现对当前登录用户的个性......
  • 快速排序算法原理与python实现
    快速排序是一种不稳定的排序算法,时间复杂度O(nlogn),最差情况下时间复杂度为O(n^2)。原理是:选定待排序数组的任意元素为基准轴:pivot,通常选择数组第一个元素,保存下pivot数值。遍历数组中的其他元素,通过交换元素位置,数组被划分为两个子序列:左子序列元素值全小于等于pivot,右子序列......
  • 音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
    一、介绍音乐推荐与管理系统。本系统采用Python作为主要开发语言,前端使用HTML、CSS、BootStrap等技术搭建界面平台,后端使用Django框架处理请求,并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协同过滤推荐算法模块,实现对当前登录用户的个......
  • 字符串匹配算法:KMP
    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是O(m+n)字符匹配:给你两个字符......
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
    2哥 :3妹,听说你昨天去面试了,怎么样啊?3妹:嗨,别提了,让我回去等通知,估计是没有通知了,还浪费我请了一天假。2哥 :你又请假了啊,你是怎么跟你那个严厉的老板请假的。3妹:我说我2哥生病了,嘿嘿~2哥:一猜就是说我生病了,自从你找工作,我这一年都病了十几回了……3妹:没办法,假不好请嘛,我尽快......
  • 教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数
    3妹:呜呜,烦死了,脸上长了一个痘2哥 :不要在意这些细节嘛,不用管它,过两天自然不就好了。3妹:切,你不懂,影响这两天的心情哇。2哥 :我看你是不急着找工作了啊,工作那么辛苦,哪还有时间想这些啊。3妹:说到找工作,我又要去刷题了。2哥:我给你出一道关于美丽的题吧,让你的心情美丽美丽~ 1题目......
  • 【教3妹学编程-算法题】数组中两个数的最大异或值
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开心呀。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,都快立冬了,天气还是这么热。今年的冬天比以往来的要晚一些。3妹:晚来也是要来的,看天气预报下周要降温,估计没几......
  • 四个代码融合 依次:小青蛙上台阶 ;求阶乘;求最大公因数;地盘划分(均为递归算法)
    小壁灯上楼梯#include<iostream>usingnamespacestd;inta(intc){if(c<=2){returnc;}else{returna(c-1)+(c-2);}}intmain(intargc,char**argv){intc,k;cin>>c;cout<<a(c);return0;}......
  • AI问答:关于字符串匹配算法的区别及应用场景,哈希/kmp/字典树/AC自动机
    1. 哈希(Hashing):哈希是一种将字符串转换为唯一标识符的技术,通常用于字符串的快速查找和比较。实现难度相对较低,但需要处理哈希冲突的问题。哈希在处理大量数据的查找和比较问题时非常实用。2. KMP(Knuth-Morris-Pratt):KMP 是一种用于字符串匹配的算法,特别适用于查找子串在主串中的......
  • HPO-ELM猎食者算法优化极限学习机的数据回归预测 可直接运行 预测效果好 Matlab~
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......