前言

写完这一章同余,差不多就是省选了,祝大家省选都rp++吧!

定义

若整数\(a,b\)除以正整数\(m\)的余数相同,则称\(a,b\)模\(m\)同余,记为\(a\equiv b \pmod{m}\)

同余系和剩余系

对于\(\forall a \in [0,m-1]\),集合\({a+km}\)的所有数模\(m\)同余且余数都是\(a\),称该集合为一个模\(m\)的同余类,简记为\(\overline{a}\)。

模\(m\)的剩余系一共有\(m\)个,分别为\(\overline{0}\),\(\overline{1}\)...\(\overline{m-1}\),它们构成\(m\)的完全剩余系。

\(1 \sim m\)中与\(m\)互质的数代表的剩余系一共有\(\varphi(m)\)个,它们构成\(m\)的简化剩余系,且简化剩余系关于模\(m\)乘法封闭(即简化剩余系中每个数乘该剩余系中一个相同的值得到的还是这个简化剩余系)。

证明:\(a,b\)与\(m\)互质,则\(a \times b\)也和\(m\)没有相同的质因子,即\(a \times b\)也与\(m\)互质,符合简化剩余系的定义。

费马小定理

若\(p\)是质数,则对于任何整数\(a\),都有\(a^p\equiv a \pmod{p}\)

欧拉定理

若正整数\(a,n\)互质,则\(a^{\varphi(n)} \equiv 1 \pmod{n}\)。

证明:

设\(n\)的简化剩余系为\(\overline{a_1}\),\(\overline{a_2}\)...\(\overline{a_{\varphi(n)}}\),对于\(\forall a_i,a_j\),若$a \times a_i \equiv a \times a_j \pmod{n} \(,则\)a \times (a_i-a_j) \equiv 0 \pmod{n}\(,又因为\)a,n\(互质,所以\)a_i-a_j \equiv 0 \pmod{n}\(,即\)a_i \equiv a_j \pmod{n}\(。所以当\)a_i \ne a_j\(时\)aa_i,aa_j\(代表不同的剩余系,又因为简化剩余系关于模\)n\(乘法封闭,所以\)n\(的简化剩余系也可以为\)\overline{aa_1}\(,\)\overline{aa_2}\(...\)\overline{aa_{\varphi(n)}}$,即

\[a^{\varphi(n)}a_aa_2...a_{\varphi(n)} \equiv (aa_1)(aa_2)...(aa_{\varphi(n)}) \equiv a_1a_2...a_{\varphi(n)} \]

所以\(a^{\varphi(n)} \equiv 1 \pmod {n}\)

欧拉定理的推论

若正整数\(a,n\)互质,则对于任意正整数\(b\),有\(a^b \equiv a^{b \mod{\varphi(n)}} \pmod{n}\)。

证明:

设\(b = q \times \varphi(n) + r\),则\(r = b \mod \varphi(n)\),又由欧拉定理知\(a^{\varphi(n)} \equiv 1 \pmod{n}\),所以$ a^b \equiv (a{\varphi(n)})q \times a^r \equiv 1^q \times a^r \equiv a^{r} \equiv a^{b \mod \varphi(n)} \pmod n $

特别的,当\(a,n\)不一定互质时且\(b \ge \varphi(n)\)时,有\(a^b \equiv a^{b \mod{\varphi(n)} +\varphi(n)} \pmod{n}\)。

 ​

扩展欧几里得算法

裴蜀/贝祖(\(B\acute{e}zout\))定理

对于任意正整数\(a,b\),存在一堆整数\(x,y\)满足\(ax+by=gcd(a,b)\)

证明:

在欧几里得算法的最后一步(\(b=0\))时,显然有\(x=1,y=0\)

当\(b>0\)时,\(gcd(a,b)=gcd(b,a \mod b)\),设存在一对整数\(x,y\),满足\(b\times x + (a \mod b) \times y = gcd(b,a \mod b)\)

因为\(b\times x + (a \mod b) \times y = b\times x +(a- b\times \left\lfloor\dfrac{a}{b}\right\rfloor) \times y =a \times y + b \times (x - \left\lfloor\dfrac{a}{b}\right\rfloor\times y)\)

所以令\(x'=y,y'=x - \left\lfloor\dfrac{a}{b}\right\rfloor\times y\),就可以得到\(ax'+by'=gcd(a,b)\)

代码如下

il int exgcd(int a,int b,&int x,&int y) {
//返回a,b的最大公约数
if(b==0) {x=1,y=0;return a;}
//当b=0时,有一组特解x=1,y=0
int d=exgcd(b,a%b,x,y);
//存储最大公约数
int z=x;x=y;y=z-y*(a/b);
//不断更新得到x',y'
return d;
//返回最大公约数
}

对于更一般的方程\(ax+by=c\),它有解当且仅当\(d|c\),且其通解可以表示为

\[x = \frac{c}{d} \times x_0+k\times \frac{b}{d},y = \frac{c}{d} \times y_0+k\times \frac{a}{d} (k \in  

乘法逆元

若整数\(b,m\)互质,且\(b|a\),则存在一个整数\(x\),使得\(\frac{a}{b} \equiv a \times x \pmod{m}\),则称\(x\)为\(b\)模\(m\)的乘法逆元,记为\(b^{-1} \pmod{m}\)。

当模数\(m\)为质数时(暂时用\(p\)代替\(m\)),根据费马小定理,有\(b^{p-1} \equiv 1 \pmod{p}\),即\(b^{p-2} \times b \equiv 1 \pmod{p}\),因此\(b^{p-2}\)是\(b\)模\(p\)意义下的乘法逆元

若只满足\(b,m\)互质,我们可以求解同余方程\(b \times x \equiv 1 \pmod{m}\) 得到其乘法逆元。

 ​

线性同余方程

给定整数\(a,b,m\),求整数\(x\)满足\(a \times x \equiv b\pmod{m}\)或给出无解。

\(a \times x \equiv b\pmod{m}\)相当于\(a \times x - b\)是\(m\)的倍数,设为\(-y\)倍,则原方程可改写为\(a \times x + m \times y = b\)

依裴蜀定理,得线性同余方程有解当且仅当\(gcd(a,m) | b\)

有解时,先用欧几里得算法求出一组特解\(x_0,y_0\),满足\(a \times x_0 + m \times y_0 = gcd(a,m)\),则\(x=x_0\times b / gcd(a,m)\)就是原方程的一个解,通解为所有模\(m/gcd(a,m)\)与\(x\)同余的整数。

 ​

中国剩余定理

设\(m_1,m_2,...,m_n\)是两两互质的整数,\(m=\prod_{i=1}^nm_i,M_i=m/m_i\),\(t_i\)是线性同余方程\(M_it_i\equiv1\pmod{m_i}\)的一个解,对于任意\(n\)个整数\(a_1,a_2,...,a_n\),方程组

\(\begin{cases}x\equiv a_1 \pmod{m_1}\\x\equiv a_2 \pmod{m_2}\\...\\x\equiv a_n \pmod{m_n}\end{cases}\)

有正整数解\(ans=\sum_{i=1}^na_iM_it_i\)

证明:

因为\(\forall k \ne i,a_iM_it_i\equiv0 \pmod{m_k},a_iM_it_i \equiv a_i \pmod{m_i}\)

所以代入\(ans=\sum_{i=1}^na_iM_it_i\)原方程组成立

 ​

高次同余方程

给定整数\(a,b,p\),求一个非负整数\(x\),使\(a^x \equiv b \pmod{p}\)

Baby Step,Giant Step(BSGS)算法

因为\(a,p\)互质,所以可以在模\(p\)意义下执行关于\(a\)的乘除操作。

设\(x=i \times t - j\),其中\(t=\left\lceil\sqrt{p}\right\rceil,0 \le j \le t-1\),则方程为\(a^{i \times t-j} \equiv b \pmod{p}\),即\(a^{i \times t} \equiv b \times a^j \pmod{p}\)

对于所有\(j \in [0,t-1]\),把\(b \times a^j \pmod{p}\)插入一个\(Hash\)表中

枚举\(i \in [0,t]\),计算出\((a^t)^i \mod p\),在\(Hash\)表中查找是否存在对应的\(j\),更新答案即可。时间复杂度为\(O(\sqrt p)\)。