费马小定理
对于一个质数 p,gcd(a,p)=1,有:
- ap−1≡1(mod p)
- ap≡a(mod p)
证明:
考虑一个序列 [1,p−1],显然,对于其中任意一个数 i,都有 gcd(i,p)=1,故 gcd(i×a,p)=1。( a 和 p 互质)
设 f=(p−1)!,f≡1×a×2×a×...×(p−1) (mod p)
整理一下,就有 ap−1≡1(mod p)。
逆元
对于一个数 a,他的逆元就是 ax≡1(mod p),x 就是 a 在 模 p 意义下的逆元。 简称 a−1。一个数乘以他的逆元等于 1。
但是实际上是,在OI中没有除法,所以除以一个数,等于乘上这个数的逆元。当然前提是要有模数。
当然,我们可以使用费马小定理来求解逆元,那就是:
由于 ax≡1(mod p),由费马小定理,我们有 ap−1≡1(mod p),故 ax≡ap−1(mod p)。移项过去就是, x≡ap−2(mod p),默认 x=ap−2 即可。
所以随便弄个快速幂就好了,求解是 log 的,当然前提是 a 和 p 要互质。
当然,如果我们要快速处理出一段数的所有数的逆元,有 O(n) 的做法。
线性求逆元:
-
预处理出来前 i 个数的乘积 si ,随后求出 invn,表示前 n 个数的乘积的逆元。
-
然后从后往前推回去,乘上对应的 ai ,就可以求出来前 i−1 个数的逆元 invi−1
-
再从前往后一次,si 乘上 invi−1,相当于把前 i−1 个数都消掉了,剩下就是 ai 的逆元。
扩展欧几里得:
裴蜀定理: 对于 a,b(已知数),必然会有一组 x,y,满足 ax+by=gcd(a,b) 的不定方程( x,y 可正可负),只是记为,a,b 均可以变换。
然后,拓展欧几里得算法是为了解决 ax+by=c 的解(不定方程)的一类的问题。
根据裴蜀定理,如果这个方程有解的话,必然要满足有一组解,使得 ax+by=gcd(a,b),也就是 gcd(a,b)∣c。
先考虑 a,b 互质的情况,因为有 ax+by=gcd(a,b)。
由于 ax+by=gcd(a,b)=gcd(b,a%b),(就看成把系数搬过去了),根据定义,我把定义里面的 a,b 换成 (b,gcd(a,b),那可以方程可以变换成 bx′+(a%b)y′。
a%b=a−⌊ba⌋×b。(被除数,商,除数)。
考虑带入,就有y′(a−⌊ba⌋×b)+x′b=1。
展开并合并同类项,有 y′a+b(x′−y′×⌊ba⌋)=1
。
再看回 ax+by=1,很好,这时候我们就可以得到:
x=y′,y=x′−y′×⌊ba⌋
这时候我们就要求 x′ 和 y′。
如果 ax+by=1 成立,带入 x,y 用 x′,y′ 表达,原式就可以变成:
bx′+(a%b)y′
所以只用求这个式子,递归求解。
边界是如果 b=0,那带回原式 ax=gcd(a,0)=a,故可以得到一组解释 x=1,y=0。回溯回去求就好了,求出来最后的解就是 ax+by=1 的一组解。
如果要考虑 ax+by=1 多组解的话,是:
经过上面的操作以后,我们得到了 x0 和 y0,那所有的解就是
x=x0+nb,y=y0−na
如果是考虑 ax+by=c 的多组解,那应该是:
x=x0×c+nb,y=y0×c−na
也就是对于 ax+by=1 同时乘上 c 而已。
如果不互质,方程两边同时除以 gcd(a,b) 即可。求出 x0,y0 后即可。
当然扩欧也可以用来求 ax≡b(mod n) 的一组解。
如果 b<n,故 b%n=b 有:
ax=⌊nax⌋×n+(ax)%n。(商,除数,余数)。
把 ⌊nax⌋ 定义为 y。
原方程就变成了 ax=ny+b,求解方式类似。
同时的,扩欧可以用来求解逆元,因为逆元形如ax≡1(mod b)。
转换一下就是 ax+by=1 的方程,求出 x 即可。
还没写完。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现