[搬运]关于扩展欧几里得与同余方程
来源:互联网 发布:excel办公软件 编辑:程序博客网 时间:2024/06/06 00:41
什么是GCD?
GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可)。在开头,我们先下几个定义:
①a|b表示a能整除b(a是b的约数)
②a mod b表示a-[a/b]b([a/b]在Pascal中相当于a div b)
③gcd(a,b)表示a和b的最大公约数
④a和b的线性组合表示ax+by(x,y为整数)。我们有:若d|a且d|b,则d|ax+by(这很重要!)
线性组合与GCD
现在我们证明一个重要的定理:gcd(a,b)是a和b的最小的正线性组合。
证明:
设gcd(a,b)为d,a和b的最小的正线性组合为s
∵d|a且d|b,
∴d|s。
而a mod s=a-[a/s]s
=a-[a/s](ax+by)
=a(1-[a/s]x)-b[a/s]y
亦为a和b的线性组合
∵a mod s<s,a mod s不能是a和b的最小的正线性组合
∴a mod s=0,即s|a
同理由s|b
∴s为a,b的公约数
∴s<=d
∵d|s
∴d=s。证毕。
由这条定理易推知:若d|a且d|b,则d|gcd(a,b)
扩展欧几里得是对于一对整数a,b总可以找到一组解x,y使ax+by=gcd(a,b)
例如a=6,b=15时,gcd(a,b)=3;一组可行的解是x=3,y=-1,当然还有其他解如x=-2,y=1.
给出实现程序
int exGcd(int a,int b,int &d,int &x,int &y)//d表示gcd(a,b){ if(!b){d=a; x=1; y=0;} else {exGcd(b,a%b,d,y,x); y-=x*(a/b);}}
我们说过,gcd(a,b)可以表示为a和b的最小的正线性组合。现在我们就要求这个最小的正线性组合ax+by中的x和y。
从最简单的情况开始。当b=0时,我们取x=1,y=0。当b≠0时呢?
假设gcd(a,b)=d,则gcd(b,a mod b)=d。若我们已经求出了gcd(b,a mod b)的线性组合表示bx’+(a mod b)y’,则
gcd(a,b)=d
=bx’+(a mod b)y’
=bx’+(a-[a/b]b)y’
=ay’+b(x’-[a/b]y’)=d=ax+by
那么,x=y’,y=x’-[a/b]y’。这样就可以在Euclid的递归过程中求出x和y。
所以在上述代码的第4行中:
x=y’;(即x与y交换)
(交换前)y=x’-(a/b)*y’;
(交换后)y=y’-(a/b)*x’;
所以递归时
exGcd(b,a%b,d,y,x);交换了x,y
y-=x*(a/b);//更新了y
求出了一组解肯定远远不够,如何求出其他解呢?一个公式就可以解决,对于方程的一个解(x0,y0)它的任意整数解可以表示为
x = x0 + k*b/gcd(a, b)
y = y0 – k*a/gcd(a, b)
其中k = 1, 2, … ,gcd(a, b)
同余方程:aΞb(mod n)表示(a mod n)==(b mod n)即a-b可以被n整除(注意是整除);
所以可以设ax-b为n的正整数倍,所以又可以设ax-b为n的y倍;
得到ax-b==ny变形得ax-ny==b;
这下就可以用扩展欧几里得解决了!
- [搬运]关于扩展欧几里得与同余方程
- 1200同余方程{扩展欧几里得}
- exgcd扩展欧几里得--noip同余方程
- noip2012 同余方程 (扩展欧几里得)
- [NOIP 2012]同余方程 扩展欧几里得
- 扩展欧几里得noip2012同余方程
- 同余方程(扩展欧几里得)
- poj 1061 扩展欧几里得求解同余方程
- poj1061_扩展欧几里得_求线性同余方程
- 扩展欧几里得算法解同余方程(NOIP2012)
- nefu84 五指山(扩展欧几里得算法解同余方程)
- [数论][扩展欧几里得算法][NOIP2012] 同余方程
- 【扩展欧几里得】Codevs 1200: [noip2012]同余方程
- 【NOIP2012】洛谷1082 同余方程 扩展欧几里得详解
- 扩展欧几里得详解 NOIP2012同余方程 青蛙的约会
- 同余方程——扩展欧几里得の板子
- 【NOIP 2012 Day2 T1】同余方程(扩展欧几里得)
- 青蛙的约会(扩展欧几里得解同余方程)
- poj 1502 MPI Maelstrom Dijkstra算法的简单运用 ,呵呵,,我估计有很多人都没看懂什么意思,我也看了很久
- [SPOJ]-1481-寻找素数项-miller rabin
- [USACO]-4.2-完美的牛栏-二分图匹配
- iOS XMPP Framework 07 - 收发消息 上
- 关于FMDB 数据库自己看着学的,希望可以互相学习
- [搬运]关于扩展欧几里得与同余方程
- Poj-1330-Nearest Common Ancestors-倍增LCA
- lazarus(ct版)自带的一个超级酷的三维动画例子截图
- vijos 1034 家族
- TENSE(时态)
- NYOJ-214(动态规划)-题目----------------------------- 单调递增子序列(二)
- poj3368
- [Poj]-1679-The Unique MST-N久没写代码的后果╮( ̄▽ ̄)╭
- UIKit基础:10.纯代码的实现Transform和平移VIew的功能