数论专题
一、欧几里德定理
欧几里德定理:
欧几里德算法又称辗转相除法,用于计算两个整数的最大公约数。
他避免了我们去枚举的因子,让我们可以在几乎是 的时间复杂度里求解出来 和 的最大公约数。
基于以上定理,我们就可以很轻松求出,和的最大公因数,对于一般的欧几里得算法就不再都说什么了,模板:
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
证明:
设
令
可得: (最小是,肯定小于)
如果为的一个约数,即
则也一定的约数,因为
这时,即为和的最大公约数。
如果不为的约数,设
同理,如果是的一个因数,那也一定是的因数
重复上诉操作,直至求出一个满足条件的数,即为所求。
举栗子:
以求 与 的最大公约数为例:
第一次迭代, , 较小数为 , 余数为 。
第二次迭代, , 较小数为 , 余数为 。
第三次迭代, , 较小数为 , 余数为 。
第四次迭代, , 较小数为 , 余数为 。
第五次迭代, , 因为能被任何整数整除,易得和的最大公约数为,算法结束。
观察每次迭代的 和 , 不难发现, , , , 的最大公约数都是。即上述定理所说的,两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
二、裴蜀定理
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数、和它们的最大公约数,关于未知数和的线性不定方程(称为裴蜀等式):若,是整数,且,那么对于任意的整数,,都一定是的倍数,特别地,一定存在整数,,使成立。
推论:,互质的充分必要条件是存在整数,使。
举栗子:
那么,,,,是的倍数,所以这个方程一定有整数解。
比如,就是一个整数解,还可以有,也是一组整数解。
注意:如果一个二元一次方程有正整数解,那么不只是一组解。
再举一个栗子:
有没有整数解呢?没有,因为是除不开的,所以没有整数解!
三、求贝祖数(特解)
什么是贝祖数?
比如:,那么符合这个等式的,就是一组贝祖数。
在计算机算法中,可以使用扩展欧几里得算法求贝祖数。
举个栗子:
求 ,有没有合适的,也就是求贝祖数。
通过贝祖定理看一下,它是不是有解: ,是的倍数,所以此方程一定有解,那么解是什么呢?
扩展欧几里得算法的推导过程:
我们先来求方程 的解
()、当 时
,也就是:,所以。
那么呢?因为 普遍意义上的求贝祖数,一般是指不小于零的一组解 ,那么不小于的第一个可能值就是:,所以,可以将做为一组特解返回,也就是返回了一组不小于零的贝祖数。
()、当 时
并且
变形一下:
对比系数:
因此可以采取递归算法 先求出下一层的和 再利用上述公式回代即可
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
四、通解公式
有了上面求出的特解,我们就可以得到通解公式:
①
②
联立得到:
等式两边同时除以得到:
我们知道,若有两个数和,他们同时除以最大公约数,之后的商是互质的。所以在上面等式中,如果成立,那么说明,一定是 的倍数,而 一定是的倍数。
所以 ,
所以
五、扩展欧几里德算法的应用
https://zhuanlan.zhihu.com/p/42707457
1、求解不定方程
2、求解线性同余方程
给我们,让我们求一个整数,使得。
就等价于 是的整数倍,假设倍数是,则有:
变形:,由于倍数是可正可负,所以可以认为把负号吃到变量中,方程就是:
3、求解模的逆元
练习题
POJ -1061青蛙的约会
https://blog.csdn.net/GD_ONE/article/details/96479556
luogu P5656
同余方程、青蛙的约会、最幸运的数字
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-05-24 Rabbitmq异常排查
2018-05-24 2、Centos6 安装tomcat8.5.31
2018-05-24 1 、在Linux(centos6.8)系统下的JDK安装与配置