欧几里得算法证明
欧几里得算法证明:
设 \(S1\) 为 \(a,b\) 的所有公约数的集合,\(S2\) 为 \(b,a \bmod b\)的所有公约数的集合
如果 \(\frac{a}{b}\) 为正数,\(a \bmod b =a-b \lfloor \frac{a}{b} \rfloor\)。
\(t =\lfloor \frac{a}{b} \rfloor\)为一个整数,所以\(x|(a \bmod b)\)。
\(S_1=S_2\),两个集合相等,最大值肯定相等。
如果 \(\frac{a}{b}\) 为负数,C++中 \(a\bmod b=a-b\lceil \frac{a}{b}\rceil\)
同理,\((a,b)=(b,a\bmod b)\)也成立。
易证,如果 \(b|a\) , \(b\) 就是两者的最大公约数(公约数不可能大过 \(b\) )。
下面证明该递归一定会结束。
假设死循环,说明一直有 \(a\bmod b \neq 0\)。
递归gcd(b,a%b)
。
...
当 \(0<a\bmod b\le 1\) 的时候,\(a\bmod b=1\),下一层递归时一定有 \(b | a\)(1能整除任何数)。
这与假设矛盾,所以一定会结束递归。
下面证明时间复杂度。
首先\(a\bmod b<\frac{a}{2}\)
假设上式不成立。
又
但是$$p<t+1\le 2t$$
矛盾。
a/b<0类似。
如果a<b,gcd(b,a%b)=gcd(b,a),就变成了a>b的情况了(多递归一次)。
接下来a%b一定小于b,所以第二个参数一定是最小的。
然后b就是小的那一个,因为每次是a%b<a/2,最后就到了b=1的时候,用不到logn次就行了。
扩展欧几里得算法
exgcd(a,b,x,y)=exgcd(b,a%b,y,x)
by+x(a-kb)=d=by+xa-kxb=xa+b(y-kb)(k是C++里面向零取整的a/b)。
所以x不变,y减掉a/b*b就行了。
假设我们现在已经求出了一组解(x,y),因为ax+by=t,所以y=(t-ax)/b和x一一对应。
要找出所有的解,就要找出距离x最近的另外一个x0。
设d=x0-x,要让|d|最小。
a(x+d)+by0=t,y0=(t-ax-ad)/b=(t-ax)/b-ad/b。
也就是y0=y-ad/b
要让x0,y0都是整数,d就是整数,ad/b也是整数
设t=gcd(a,b)
a/b*d是整数
把a/b约分,a0/b0*d
这样就去除了a、b公因数的影响。
b0一定是d的约数,d一定是b0的倍数
因为要让|d|最小,取d=正负b0即可
也就是b/t,那么y就是相应减去a/t。
这样就能找出所有解了。
关于裴属定理
存在性:用扩展欧几里得算法可以构造出一组解。
设$ S(a,b) = {t|t=ax+by,x,y\in Z}$
\(p:x \in S(a,b)\)
\(q:(a,b) | x\)
\(p \Rightarrow q\)
设 \(d = (a,b)\),\(d | a, d | b, d|(ax+by)=t\)
所以 \(\neg q \Rightarrow \neg p\)
也就是如果x不是d的倍数,它就不是S的元素,也就是说任何一个ax+by都不等于x,也就是说x无解。
line