欧几里得算法是一种求解两非负数最大公约数的过程,它本质上就是执行辗转相除法。
int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }
可证明最终得到的结果(设为(r_n))就是所求最大公约数:第一步证明(r_n)是两数约束,第二步证明(r_n)可被两数任意约数整除。
贝祖定理:对于不全为 0 的自然数(a,b),必然存在整数(x,y)(不唯一)满足等式(ax+by=gcd(a, b))。使用扩展欧几里得算法能够证明。进而可知,若(a,b)互素,那么存在整数(x,y)满足等式(ax+by=1)。更进一步,若(a,b)互素,总可以找到一个比(b)小的非负数(x),使得(ax=1(mod b))成立。
中国剩余定理是从一个方程求解过程总结出的定理。
有同余方程组:(left{egin{array}{l}{x equiv a_{1}left(mod m_{1} ight)} \ {x equiv a_{2}left(mod m_{2} ight)} \ {cdots} \ {x equiv a_{k}left(mod m_{k} ight)}end{array} ight.),其中(m_1, m_2, cdots, m_k)为两两互素整数,求(x)的最小非负整数解。
求解:
- 令(M=prod_{i=1}^{k} m_{i}),即(M)是所有(m_i)的最小公倍数;
- 由于(m_i)两两互素,所以(frac{M}{m_{i}})与(m_i)亦互素,根据上述贝祖定理推论,可有(frac{M}{m_{i}} t_{i} equiv 1left(mod m_{i} ight));
- 则有一个解为(x=sum_{i=1}^{k} a_{i} frac{M}{m_{i}} t_{i}),通解为(x+i * M(i in Z)),特别的,最小非负整数解为((x \% M+M) \% M)。
证明:
- 由(frac{M}{m_{i}} t_{i} equiv 1left(mod m_{i} ight))两边同乘(a_i)得:(a_ifrac{M}{m_{i}} t_{i} equiv a_ileft(mod m_{i} ight));
- 又(forall k downarrow=i, a_{i} frac{M}{m_{i}} t_{i} equiv 0left(mod m_{k} ight));
- 将两式代入原方程,易得[其中一解](x=sum_{i=1}^{k} a_{i} frac{M}{m_{i}} t_{i})。
推论:基于上述同余方程组,对于不同的(left(a_{1}, a_{2} dots, a_{k} ight))集合,(0 leqslant x_{最小非负值} leqslant M)取值亦各不相同,此一一对应关系可用于推导欧拉函数。
参考资料: