欧几里得算法
注:欧几里得算法是用来计算最大公约数的一个算法.主要的代码实现如下:
int gcd(int a,int b){ return !b?a:gcd(b,a%b); }
如果这个式子成立的话,不断重复利用这个式子来计算,直到a和b中有一个数变为 0的时候,就可以求出了他们的最大公约数。
举个例子:我们要求gcd(15,30)
运行如下:gcd(15,30)=gcd(30,15)=gcd(15,0)此时的15便是gcd(15,30)
证明过程:
设g = gcd(a,b),
若使gcd(a,b) = gcd(b,a%b)成立的话,
我们要证明g|b,g|a%b
因为g|b
所以我们要证明a%b
∵a%b = a−b * ⌊n/m⌋
∴g|a%b
裴蜀定理:
定义:对于不定方程:a*x + b*y = c,判断此不定方程有整数解的条件是gcd(a,b)|c
如何证明?
证明过程:
对于gcd(a,b)∤c时,
显然gcd(a,b) | (a*x + b*y)如果存在整数解的话,gcd(a,b)|c
gcd(a,b)∤dgcd(a,b)∤d 这个线性方程不存在整数解。
扩展欧几里得算法(简称扩欧):
扩欧就是用来求a*x+b*y=gcd(a,b)的一组整数解的算法
原理:
当b = 0时
x = 1,y = 0是方程a*x+b*y=gcd(a,b)的一组解.
当b ≠ 0时
a*x1+b*y1 = a*y2+b*(x2-a/b*y2)
证明过程:
a*x1 + b*y1 = gcd(a,b)
b*x2+(a%b)*y2 = gcd(b,a%b)
∵gcd(a,b) = gcd(b,a%b)
∴a*x1 + b*y1 = b*x2+(a%b)*y2
=b*x2+(a - [a/b]*b)*y2
=b*x2+a*y2-[a/b]*b*y2
=a*y2 + b(x2 - [a/b]*y2)
∴x1 = y2,y1 = x2 - [a/b]*y2
代码如下:
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; }
最后的x,y就是二元一次不定方程的一组解