【初等数论】裴蜀定理&扩展欧几里得算法
裴蜀定理:
对于\(a,b\in N^*, x, y\in Z\),方程\(ax+by=k\)当且仅当\(gcd(a, b)|k\)时有解。
证明:
必要性显然。
充分性:只需证明当\(k=gcd(a, b)\)有解。
设\(s\)为令方程有解的最小\(k\)值,\(gcd(a, b) = d\),首先有\(d|s\)。
设$t = \lfloor \frac{a}{s} \rfloor,r = a \bmod s $
则\(r = a - t * s = a - (ax + by)*t = (1-tx)*a + byt\)
那么\(r\)也是\(a,b\)的线性组合,即存在\(x, y\)令\(ax + by = r\)有整数解。
又\(r \in [0, s)\)
\(\therefore r = 0\)
即\(s|a\),同理\(s|b\)。
\(\therefore s|d\),即\(s = d\)
证毕。
扩展欧几里得算法
裴蜀定理告诉我们,方程\(ax + by = k\)当且仅当\(gcd(a, b)|k\)时存在无数组整数解。扩展欧几里得算法可以递归求出该方程的一组解,结合各组解之间的关系便有了解该方程的一般方法。
基于欧几里得算法的核心性质:\(gcd(a, b) = gcd(b, a \bmod b) (b \neq 0)\)
如果找到\(bx + (a \bmod b)y = d\)的一组解\(x_1, y_1\),并且通过待定系数法确定\(x,y\)和\(x_1, y_1\)的关系,我们就可以解出\(x, y\)了。
解:
对于方程\(dx + 0*y = d\)(边界),显然有一组解\((1, 0)\)
设\(gcd(a, b) = d\),对于方程\(ax + by = d\),我们递归求解得方程\(bx_1 + (a \bmod b)y_1 = d\)的解。
设\(\lfloor \frac{a}{b} \rfloor = q\),则\(a \bmod b = a - q * b\)
有\(bx_1 + (a - qb)y_1 = d\)
即\(ay_1 + b * (x_1 - qy_1) = d\)
对比系数得\(
x=y_1,y = x_1 - \lfloor \frac{a}{b} \rfloor * y_1\)。
函数的递归结构由此确定,最终返回的为方程\(ax + by = gcd(a, b)\)的一组解\(x_0, y_0\)。
如果\(\frac{k}{d} = s\),那么\(x = sx_0, y = sy_0\)。
现在我们着手来考虑方程\(ax + by = k (gcd(a, b)|k)\)通解的形式。
不妨设通过扩欧得到的一组解为\(x_0, y_0\),任意解\(x = x_0 + \Delta x,y = y_0 + \Delta y\)
消元得\(a(x - x_0) + b(y - y_0) = 0\)
即\(a\Delta x = -b\Delta y\)
设\(a = pd, b = qd\)
则\(\frac{\Delta x}{\Delta y} = -\frac{q}{p}\)
最终得到通解的形式为\(x = x_0 + kq, y = y_0 - kp (k \in Z)\)
解毕。
代码:
int exgcd(int a, int b, int& x, int&y) {
if (!b) {
x = 1, y = 0;
return a;
}
int ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;//return gcd(a, b)
}
【初等数论】裴蜀定理&扩展欧几里得算法的更多相关文章
- 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)
欧几里得算法 又称辗转相除法 迭代求两数 gcd 的做法 由 (a,b) = (a,ka+b) 的性质:gcd(a,b) = gcd(b,a mod b) int gcd(int a,int b){ ...
- 扩展欧几里得算法(EXGCD)学习笔记
0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...
- 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))
我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...
- 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...
- 【bzoj2257】[Jsoi2009]瓶子和燃料 扩展裴蜀定理+STL-map
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.从中选出 $k$ 个瓶子,使得能够通过这 $k$ 个瓶子凑出 ...
- 【bzoj1441】Min 扩展裴蜀定理
题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S ...
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 辗转相除法 & 裴蜀定理
2018-03-11 17:39:22 一.辗转相除法 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法.辗转相除法首次出现于欧几里得的&l ...
随机推荐
- Vue.js 学习笔记之六:构建更复杂的组件
在掌握了如何构建与编译 Vue 组件的基础知识之后,接下来就可以试着来构建一些更具有实际用处的复杂组件了.为了赋予组件更具实用性的后面,首先要做的就是让这些组件具备监听用户自定义事件的能力,并且允许用 ...
- SpringBoot第二集:注解与配置(2020最新最易懂)
2020最新SpringBoot第二集:基础注解/基础配置(2020最新最易懂) 一.Eclipse安装SpringBoot插件 Eclipse实现SpringBoot开发,为便于项目的快速构建,需要 ...
- pandas dataframe 时间字段 diff 函数
pandas pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网. 需求介绍 最近在使用 pandas 的过程中碰到一个问题,需要计 ...
- Java学习的第三十七天
1.例3.1求一元二次方程的根 import java.util.Scanner; public class cjava { public static void main(String[]args) ...
- Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)
1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...
- uniapp微信小程序获取当前用户手机号码(前端)
按钮触发获取用户信息 uniapp中与微信小程序官网所写会不同, <button open-type="getPhoneNumber" @getphonenumber=&qu ...
- swjtuoj2433 Magic Mirror
描述 Magic Mirror is an artificial intelligence system developed by TAL AI LAB,It can determine human ...
- xshell断线解决办法
困扰了好几个月了,网上更改ssh配置文件.固定ip都不好使,终于找到xshell掉线的解决办法了 哈哈!!! 设备管理器-->网络适配器-->对应网络连接虚拟机方式,本机虚拟机桥接如图 右 ...
- c++11-17 模板核心知识(二)—— 类模板
类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...
- 简单了解JSON Web令牌(JWT)
什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它 ...