文章目录
1.最大公约数
最大公约数的英文是Greatest Common Divisor,常缩写为 gcd。
我们首先先了解一下约数的概念:如果存在一个整数 k k k,使得 a = k d a=kd a=kd ,则 d d d称 a a a整除,记做 d ∣ a d|a d∣a,称 a a a是 d d d的倍数,如果 d > 0 d>0 d>0,称 d d d是 a a a的约数。特别地,任何整数都整除 0 0 0。
那什么是公约数?
一组数的公约数,是指同时是这组数中每一个数的约数的数。而最大公约数,则是指所有公约数里面最大的一个。
那又有了一个问题了,我们整么求出一组数的最大公约数呢?
更相减损术
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
(⊙v⊙)嗯,什么意思
其意思为:可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。
操作
1.任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
优化
在每次减好之后都对能除2的除2,若2个都能除2,同除2,gcd*2。
优点
可以用于高精度算法(好东西)。
欧几里得算法(也就是辗转相除法)
我们先考虑两个数的情况。
我们已知两个数 a a a和 b b b,其中 a > b a>b a>b。
如果 b b b是 a a a的约数,那么最大公约数就是 b b b。
如果不能整除,那么 a = b ∗ k + r a=b*k+r a=b∗k+r,其中 r < b r<b r<b。
我们最后其实可以得到 g c d ( a , b ) = g c d ( b , b m o d a ) gcd(a,b)=gcd(b,b\mod\ a) gcd(a,b)=gcd(b,bmod a)。
证明 g c d ( a , b ) = g c d ( b , b m o d a ) gcd(a,b)=gcd(b,b\mod\ a) gcd(a,b)=gcd(b,bmod a)
设 a = b k + c a=bk+c a=bk+c,那么有 c = a m o d b c=a\mod\ b c=amod b。设 d ∣ a d ∣ b d|a\ \ \ d|b d∣a d∣b,则 c − a − b k c d = a d − b d k c-a-bk \frac{c}{d}=\frac{a}{d}-\frac{b}{d}k c−a−bkdc=da−dbk由右边式子可知 c d \frac{c}{d} dc为整数,即 d ∣ c d|c d∣c所以对于 a , b a,b a,b的公约数,它也会是 a m o d b a\mod\ b amo