数论学习笔记

费马小定理

对于一个质数 ppgcd(a,p)=1\gcd(a,p)=1,有:

  • ap11(moda^{p-1} \equiv 1(mod p)p)
  • apa(mod a^p \equiv a(mod p)p)

证明:

考虑一个序列 [1,p1][1,p-1],显然,对于其中任意一个数 ii,都有 gcd(i,p)=1\gcd(i,p)=1,故 gcd(i×a,p)=1\gcd(i\times a,p) =1。( aapp 互质)

f=(p1)!f=(p-1)!f1×a×2×a×...×(p1)f \equiv 1 \times a \times 2 \times a \times ...\times (p-1) (mod(mod p)p)

整理一下,就有 ap11(moda^{p-1} \equiv 1(mod p)p)

逆元

对于一个数 aa,他的逆元就是 ax1(moda^{x} \equiv 1(mod p)p)xx 就是 aa 在 模 pp 意义下的逆元。 简称 a1a^{-1}一个数乘以他的逆元等于 11

但是实际上是,在OI中没有除法,所以除以一个数,等于乘上这个数的逆元。当然前提是要有模数。

当然,我们可以使用费马小定理来求解逆元,那就是:

由于 ax1(modax \equiv 1(mod p)p),由费马小定理,我们有 ap11(moda^{p-1} \equiv 1(mod p)p),故 axap1(modax \equiv a^{p-1} (mod p)p)。移项过去就是, xap2(modx \equiv a^{p-2} (mod p)p),默认 x=ap2x=a^{p-2} 即可。

所以随便弄个快速幂就好了,求解是 log\log 的,当然前提是 aapp 要互质。

当然,如果我们要快速处理出一段数的所有数的逆元,有 O(n)O(n) 的做法。

线性求逆元:

  • 预处理出来前 ii 个数的乘积 sis_i ,随后求出 invninv_n,表示前 nn 个数的乘积的逆元。

  • 然后从后往前推回去,乘上对应的 aia_i ,就可以求出来前 i1i-1 个数的逆元 invi1inv_{i-1}

  • 再从前往后一次,sis_i 乘上 invi1inv_{i-1},相当于把前 i1i-1 个数都消掉了,剩下就是 aia_i 的逆元。

扩展欧几里得:

裴蜀定理: 对于 a,ba,b(已知数),必然会有一组 x,yx,y,满足 ax+by=gcd(a,b)ax+by=\gcd(a,b) 的不定方程( x,yx,y 可正可负),只是记为,a,ba,b 均可以变换。

然后,拓展欧几里得算法是为了解决 ax+by=cax+by=c 的解(不定方程)的一类的问题。

根据裴蜀定理,如果这个方程有解的话,必然要满足有一组解,使得 ax+by=gcd(a,b)ax+by=\gcd(a,b),也就是 gcd(a,b)c\gcd(a,b) | c

先考虑 a,ba,b 互质的情况,因为有 ax+by=gcd(a,b)ax+by=\gcd(a,b)

由于 ax+by=gcd(a,b)=gcd(b,a%b)ax+by=\gcd(a,b)=\gcd(b,a\%b),(就看成把系数搬过去了),根据定义,我把定义里面的 a,ba,b 换成 (b,gcd(a,b)(b,\gcd(a,b),那可以方程可以变换成 bx+(a%b)ybx'+(a\%b)y'

a%b=aab×ba\%b =a- \lfloor \dfrac{a}{b}\rfloor \times b。(被除数,商,除数)。

考虑带入,就有y(aab×b)+xb=1y'(a- \lfloor \dfrac{a}{b}\rfloor \times b)+x'b=1

展开并合并同类项,有 ya+b(xy×ab)=1y'a+b( x'-y' \times \lfloor\dfrac{a}{b}\rfloor)=1

再看回 ax+by=1ax+by=1,很好,这时候我们就可以得到:

x=y,y=xy×abx= y',y= x'-y' \times \lfloor\dfrac{a}{b}\rfloor

这时候我们就要求 xx'yy'

如果 ax+by=1ax+by=1 成立,带入 x,yx,yx,yx',y' 表达,原式就可以变成:

bx+(a%b)ybx' +(a\%b) y'

所以只用求这个式子,递归求解。

边界是如果 b=0b=0,那带回原式 ax=gcd(a,0)=aax=\gcd(a,0)=a,故可以得到一组解释 x=1,y=0x=1,y=0。回溯回去求就好了,求出来最后的解就是 ax+by=1ax+by=1 的一组解。

如果要考虑 ax+by=1ax+by=1 多组解的话,是:

经过上面的操作以后,我们得到了 x0x_0y0y_0,那所有的解就是

x=x0+nb,y=y0nax=x_0+nb,y=y_0-na

如果是考虑 ax+by=cax+by=c 的多组解,那应该是:

x=x0×c+nb,y=y0×cnax=x_0 \times c+nb,y=y_0 \times c-na

也就是对于 ax+by=1ax+by=1 同时乘上 cc 而已。

如果不互质,方程两边同时除以 gcd(a,b)\gcd(a,b) 即可。求出 x0,y0x_0,y_0 后即可。

当然扩欧也可以用来求 axb(modax \equiv b(mod n)n) 的一组解。

如果 b<nb<n,故 b%n=bb \% n =b 有:

ax=axn×n+(ax)%nax=\lfloor \dfrac{ax}{n} \rfloor \times n+ (ax) \% n。(商,除数,余数)。

axn\lfloor \dfrac{ax}{n} \rfloor 定义为 yy

原方程就变成了 ax=ny+bax=ny+b,求解方式类似。

同时的,扩欧可以用来求解逆元,因为逆元形如ax1(modax \equiv 1(mod b)b)

转换一下就是 ax+by=1ax+by=1 的方程,求出 xx 即可。

还没写完。

posted @   June_Failure  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示