最大公约数
更相减损术:(gcd(x,y)=gcd(y-x,x)(xleq y))。
设 (gcd(x,y)=k,x=kp,y=kq,gcd(p,q)=1)。
那么 (gcd(y-x,x)=gcd(kq-kp,kp)=k imesgcd(q-p,p))。
设 (gcd(q-p,p)=r,q-p=rb,p=ra)。
那么 (q=r(a+b))。
因为 (gcd(p,q)=1=gcd(ra,r(a+b)))。
所以 (r=gcd(a,a+b)=1,gcd(y-x,x)=gcd(x,y)=k)。
辗转相除法(欧几里得算法):(gcd(x,y)=gcd(ymod x,x)(xleq y))。
取模相当于做多次减法,其实就是更相减损术的优化。
最小公倍数
容斥,两数之积除以两数的最大公约数。
有一个小技巧,若数以质因数分解的形式给出,算最大公约数系数取 (min),算最小公倍数系数取 (max)。
拓展欧几里得算法
有不定方程 (ax+by=gcd(a,b)),求出任意一个整数解(根据裴蜀定理,这东西一定有整数解)。
假设我们当前已经得出了方程
的一组整数解 (x=p,y=q),根据 gcd 的性质有
将取模拆掉
整理成最初的形式
那么 (x=q-lfloor b/a floor p,y=p) 就是方程 (ax+by=gcd(a,b)) 的一组整数解。
所以在求解 (ax+by=gcd(a,b)) 时我们可以先递归求解 (bmod a imes x+ay=gcd(bmod a,a)) 然后计算当前的解。
这个递归的终止条件是 (a=0),此时 (x=0,y=1) 是一组解,返回即可(虽然 (x) 取什么都没有关系但我们想让解的绝对值尽量小)。
考虑归纳求出解的范围。假设递归得到 (-bmod aleq y'leq bmod a,-aleq x'leq a),现在 (x=y'-lfloor b/a floor x',y=x')。
取 (y'=bmod a,x'=-a) 有 (xleq bmod a+lfloor(b-bmod a)/a floor aleq b,ygeq-a)。
取 (y'=-bmod a,x'=a) 有 (xgeq-bmod a-lfloor(b-bmod a)/a floor ageq-b,yleq a)。
所以拓欧求出的 (ax+by=gcd(a,b)) 的解 (x,y) 满足 (xin[-b,b],yin[-a,a]),显然边界同样满足。