浅谈扩展欧几里得定理(附裴蜀定理)
关于扩展欧几里得定理
众所周知,扩展欧几里得定理是用来求形如(a,b,c皆为整数)这样的方程的一组解[注,仅是一组解]的定理
它的原理比较复杂,本人学了挺久才懂了一点,这里就不谈了,扩欧的核心是它的思想,它的思想可以用来解决许多题
该方程有解的条件 :
要使(a,b,c皆为整数) 有解,我们设k=gcd(a,b),可以将原方程写成
的形式
即
a,b,c均为整数
一定是整数即
一定是k的倍数
k|c 即 gcd(a,b)|c // k|c数学里为 c%k=0
由此可见,该方程有解的条件为c%gcd(a,b)=0
求解方法 :
由于是求解的一组解,在方程有解的条件下,我们可以考虑先求出
的一组解,
为什么这样考虑呢,这样子变化有什么好处呢?当我们将原方程转变为这样的方程之后,实际上我们求出的x与y并不是
原方程的解,我们可以理解为转变后的方程的解为x'与y',实际上该方程是将原方程除以
c/gcd(a,b)后所得到的,所以原方程的解为那么我们先求出
原方程的解便只需乘以c/gcd(a,b)就能得到了
另外说明,c=gcd(a,b)是原方程有解的最小情况,利用这个性质,裴蜀定理也就不难写出来了
那么该如何求解呢?
众所周知(又是这个词,词穷) gcd的写法return b==0?a:gcd(b,a%b);(为了节约篇幅强行压缩)关键的一步就是
gcd(a,b)==gcd(b,a%b)了,这个的成立性就不证明了,我们求解是需要利用到gcd的这个特性的
我们可以得到这样一个方程(这里的%显示不出来就用mod代替了),然后我们将gcd(b,a%b)中的b和a代入原方程
那么可以得到gcd(b,a%b) = bx+(a%b)y,注意,此时的x与y也不是原方程的解,也可以理解为x',y'这样子我们就可以得到
(这里是将gcd(a,b)的a,b反代入原方程),又因为电脑中的取模运算a%b是等价于a-a/b*b的
所以我们又可以将最后一个方程变成bx'+(a-a/b*b)y',然后与第一个方程放在一起便有
,然后拆项移项,变成
,最后便能得出这样的转移方程
,有了这样的转移方程,那么我们可以递归地写出代码了,递归结束条件就是b==0时,此时的方程
ax+by=gcd(a,b),b==0,所以就是ax=a,那么x=1,y=0
//已知a,b 求解 ax+by=1
void ex_gcd (int a,int b,int &x,int &y) { if (b==0){x=1,y=0;return;} ex_gcd(b,a%b,x,y); int tmp=x; x=y,y=tmp-a/b*y; } /* * 若求解 ax+by=c * △条件(是否有解) : 满足gcd(a,b)|c [c%gcd(a,b)==0] * 可以先求 ax+by=gcd(a,b) * 再将求得的x与y分别乘以c/gcd(a,b) */
那么扩展欧几里得便讲完了,下面说一下上文提到的裴蜀定理
原题链接
裴蜀定理
题目描述
给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1X1+...AnXn>0,且S的值最小
输入输出格式
输入格式:
第一行给出数字N,代表有N个数 下面一行给出N个数
输出格式:
S的最小值
我们可以将A1X1+A2X2+...+AnXn看成许多个ax+by,那么我们要求的便是c的最小值,上文说过,c的最小值就是gcd(a,b),所以我们只需求出所有的gcd便可
附上代码
#include <cstdio>
#include <cmath> using namespace std; int ans,n,t; int gcd (int a,int b) { return !b?a:gcd(b,a%b); } int main () { scanf("%d",&n); scanf("%d",&ans);//ans初始赋值为第一个数 while (--n){ scanf("%d",&t); t=abs(t); ans=abs(gcd(ans,t)); } printf("%d",ans); return 0; }
注,如若有误或者哪里讲得不清楚,请联系本人更改或者在下方留言,谢谢啦~\(≧▽≦)/~
转载于:https://www.cnblogs.com/Morning-Glory/p/9784224.html
浅谈扩展欧几里得定理(附裴蜀定理)相关推荐
- 逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)
乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在 逆元的含义:模n意义下,1个数a如果 ...
- 数论基础(1)扩展欧几里得定理
一.引言 扩欧在朴素欧几里得定理中扩展得到,主要用于解决什么问题? 1.求两个数的最大公约数(朴素欧也可以解决这个问题) 2.ax+by=gcd(a,b),求解这个线性不定方程的一组特解. (补充:贝 ...
- 裴蜀定理、拓展欧几里得及其证明
定理 裴蜀定理(贝祖定理)是一个关于最大公约数的定理. 裴蜀定理说明了对任何整数a,b和它们的最大公约数d,关于未知数x和y的线性不定方程:若a,b是整数,且 g c d ( a , b ) = d ...
- 裴蜀定理详解+例题: BZOJ 1441 MIN
在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理 在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理.裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a.b和它们的最大公约 ...
- 密码学基础——辗转相除法,费马小定理,欧拉定理,裴蜀定理,中国剩余定理
文章主要根据百度百科和维基百科相关相关知识点整理而成! 辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法.它的具体做法是:用较小数除较大数 ...
- bzoj 2257[Jsoi2009]瓶子和燃料 数论/裴蜀定理
题目 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1< ...
- (裴蜀定理)ax + by = m 有解,当且仅当 m 是 gcd(a,b) 的倍数
简介:在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理.裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任 何整数a.b和它们的最大公约数d,关于未知数x和y的线性丢 ...
- 浅谈 裴蜀定理扩展欧几里得
裴蜀定理 a , b a,b a,b 是整数,且 gcd ( a , b ) = d \gcd(a,b)=d gcd(a,b)=d,那么对于任意的整数 x , y x,y x,y, a x + b ...
- 逆元+费马小定理+扩展欧几里得
逆元:(即是逆元素)逆元素是指一个可以取消另一给定元素运算的元素. 在一个代数系统(S,*)中,存在单位元素e,如果对S内的元素a存在a^-1 * a = e,则将 a^-1称为a 的左逆元. 同理若 ...
最新文章
- docker监控系统
- 交换机的VACL测试
- 火狐浏览器打印网页不全_武汉社保网上下载打印流程
- java合并list_怎么把两个list合并
- 微信支付—微信H5支付「PC端扫码支付」
- 20165302 学习基础和C语言基础调查
- Linux下替代grep高效文本搜索工具
- pc模式 华为mate30_很实用!华为Mate 30全系支持PC模式,无线充+投屏更方便!
- php找爸爸,暖哭!萌娃外滩找爸爸:“他两天没回家”
- 不对等的爱情并不长久
- 2020年第三季度的垃圾邮件和网络钓鱼攻击分析
- kafka安装部署和使用
- RK3288 NFS rootfs修改和操作(已验证)
- PHP检测字数,PHP获取word文档字数的问题
- TPS Motion(CVPR2022)视频生成论文解读
- python 利用random生成验证码与MD5码加密过程
- 获取拼音-pinyin.js
- 勇斗勒索软件的英雄疑因旧罪被捕;华为、腾讯为用户数据起冲突
- 霍尔电流传感器在UPS蓄电池浮充电流远程监测方案的应用
- android有用的命令