整除与同余基础
欧几里得算法
- 鉴于后面有很多和 \(\gcd\) 相关的东西,拿这个起手,顺便规定 \((a,0)=(0,a)=a\)。
-
在群论意义下,对于 \(\gcd\) 操作,\(1\) 是零元,我们这么规定是让 \(0\) 做单位元。
-
我是真的没地方放了。总不能把这个放数学杂项吧。
-
-
证明:
-
显然在 \(b\mid a\) 时,该式成立。
-
否则,设 \(a=kb+r\to r=a-kb=a\bmod b\),则 \(\forall d\mid a \And d\mid b\),有 \(\frac{r}{d}=\frac{a}{d}-k\frac{b}{d}\)。显然式右为整数,故式左为整数,即 \(d\mid r\)。
-
同理 \(\forall d\mid r\And d\mid b\),有 \(\frac{r}{d}=\frac{a}{d}-k\frac{b}{d}\to \frac{a}{d}=\frac{r}{d}+k\frac{b}{d}\),于是 \(d\mid a\)。
-
故变换前后的公因数都不变,于是最大公因数也不变。
-
给出示范代码,递归的和非递归的:
il int gcd(int a,int b){return b?gcd(b,a%b):a;}
il int gcd(int a,int b){
while(b){
if(a<b) swap(a,b);
else a%=b;
}
return a;
}
-
复杂度分析:显然每两次操作中至少有一次是取模,于是
-
\(b\geqslant \frac{a}{2}\):\(a\) 变为 \(a-b<\frac{a}{2}\)。
-
\(b<\frac{a}{2}\):取模后 \(a\in [0,b)<\frac{a}{2}\)。
-
-
故只会有 \(O(\log a+\log b)\) 次操作,该算法的复杂度为 \(O(\log v)\)。
同余
定义
-
关于 \(p\)(\(p\in \mathbb{N_+}\))的代数结构 \((R,+,\times)\),其三部分分别定义如下:
-
\(R\):关于 \(p\) 的同余数集,具体来说,是 \([0,p)\cap \mathbb{Z}\)。考虑到同余加法的逆元的话,可以扩充到 \((-p,p)\cap \mathbb{Z}\)。后面不再强调 \(\cap \mathbb{Z}\)。
-
\(+\):关于 \(p\) 的同余加法,运算法则为 \(a+b=(a+b)\bmod p\),式右符号为整数域的。
-
\(\times\):关于 \(p\) 的同余乘法,运算法则为 \(a\times b=a\times b\bmod p\),同上。
-
-
\((R,+)\) 为交换群;\((R,\times)\) 为交换半群,当 \(p>1\) 时为交换幺半群;当 \(p \in prime\) 时 \((R,+,\times)\) 为域。证明如下:
-
封闭性:任意运算最后都要 \(\bmod p\to \in [0,p)\)。
-
结合律:显然,略。
-
单位元:分别是 \(0,1\)。
-
逆元:加法的是 \(-a\),乘法的存在性依赖于裴蜀定理。
-
交换律:依赖于整数域下的 \((a+b)\bmod p=(a\bmod p+b\bmod p)\bmod p\),乘法同理,事实上我不知道怎么证。
-
裴蜀定理
-
其中 \(a,b\) 已知,\(a,b\in \mathbb{Z}\) 且不全为 \(0\)。
-
证明:
-
充分性:
-
显而易见, \((a,b)\mid a,(a,b)\mid b\) 。
-
从而有 \((a,b)\mid a\times x,(a,b)\mid b\times y\) 。
-
所以 \((a,b)\mid c\) 。
-
-
必要性:
-
显然只要证明 \(\exists\ (x_0,y_0),a\times x_0+b\times y_0=(a,b)\)。
-
从而只要证明 \(\exists\ (u,v),u\times x_0+v\times y_0=1(u=\frac{a}{(a,b)},v=\frac{b}{(a,b)})\)。
-
上式等价于 \(\exists\ x_0,u\times x_0\equiv 1\pmod v\)。
-
构造 \(v\) 的完全剩余系,分别与 \(u\) 相乘,不会有两个新剩余系相同。
-
为什么不会相同:
-
不妨设 \(r_{k1}\times u\equiv r_{k2}\times u\pmod v(r_{k1}\neq r_{k2})\),我们将这个同余式展开成不定方程:
-
\((r_{k1}-r_{k2})\times u=k\times v\)。其中 \(r_{k1},r_{k2}\in[0,v)\)。
-
因为 \(u\perp v\),故由唯一分解定理可得 \(v\mid (r_{k1}-r_{k2})\)。又 \(r_{k1},r_{k2}\in[0,v)\to r_{k1}-r_{k2}\in (-v,v)\),故 \(r_{k1}-r_{k2}=0\to r_{k1}=r_{k2}\),两者是同一个原剩余系。
-
-
因为变换前后剩余系数量不变且仍然不重,故所得的仍然为 \(v\) 的完全剩余系。由 \(\bmod v\) 意义下一定有 \(1\) 的剩余系,可知乘完之后得到的完全剩余系中一定有 \(\bmod v=1\) 的。
-
故原完全剩余系中一定 \(\exists r_0\times u\equiv 1\pmod v\),换言之,一定存在 \(u^{-1}\pmod v\)。
-
可见 \(x_0\) 一定存在。
-
-
-
在同余中,我们主要在意的是裴蜀定理 \(\forall a\perp b \leftrightarrow \exists a^{-1}\pmod b\) 的推论。
-
证一下上面没有证的必要性:
-
考虑反证法,设 \((a,b)>1\) 且 \(\exists a^{-1}\pmod b\),于是 \(aa^{-1}\equiv 1\pmod b\to aa^{-1}+kb=1\),由裴蜀定理,其等价于 \((a,b)=1\),与前设矛盾。
-
-
运用数学归纳法,容易推广到多元情况。
-
该定理给出了同余近似域(这名字肯定不对,但我真的不想学群/环/域论,嫖完群公理就收手吧)中,乘法逆元存在性的判定。
逆元的求解
费马小定理
- 不证明,因其是欧拉定理的特殊情况。
欧拉定理
-
群论证明:
-
若不考虑零元 \(0\),则 \((G,\times)\) 是有限交换群,这里 \(G=\{a\in (0,p)|a\perp p\}\)。
-
注意我们是把 \(a\) 置于 \(\pmod p\) 意义下,这与原命题等价,因为 \(a\perp p\to G\) 在 \(\pmod p\) 意义下是满射。
-
此时 \(|G|=\varphi(p)\),由群论-阶的结论 1,有 \(\forall a\in G,\operatorname{ord(a)}\mid \varphi(p)\),于是 \(\forall a\in G,a^{\varphi(p)}=(a^{\operatorname{ord(a)}})^k=\epsilon^k=1\)。
-
-
数论证明:
-
考虑 \(\bmod\ p=k(k\perp p)\) 的 \(\varphi(p)\) 个相异剩余系,即 \(p\) 的缩系(简化剩余系)。
-
因为 \(a\perp p\),所以 \(a\times r_1,a\times r_2,\dots,a\times r_{\varphi(p)}\) 仍然与 \(p\) 互质,并且任意两个新剩余系不会相同(否则在式左右同乘 \(i\) 的逆元,来源剩余系就相同了),故这些剩余系仍然可以组成一个 \(p\) 的缩系。
-
所以我们有
\[\prod\limits_{i=1}^{\varphi(p)} r_i \equiv \prod\limits_{i=1}^{\varphi(p)} a\times r_i \]-
两边同时消去 \(\prod\limits_{i=1}^{\varphi(p)} r_i\),得到 \(a^{\varphi(p)} \equiv 1 \pmod{p}\),证毕。
-
p.s.这里可以不要 \(k=1\),只要后 \(\varphi(p)-1\) 个。
-
-
费马小定理其实就是 \(p\in prime\) 的特殊情况。基于费马小定理和欧拉定理,我们可以使用快速幂求逆元(有时还要用到扩展欧拉定理,参看同余进阶),\(O(\log p)\)。
扩展欧几里得算法
-
给出不定方程 \(a\times x+b\times y=c\),其中 \(a,b,c\) 已知,求可行解系 \((x,y)\)。
-
由裴蜀定理,当 \((a,b)\nmid c\) ,无解。
-
考虑有解情况。设法求 \((x_0,y_0)\) 使 \(a\times x_0+b\times y_0=g\),那么显然可以由此推出整个解系。
-
由欧几里得算法,显然存在 \(x_1,y_1\),使得
- 整理得
-
仔细观察形式。可以发现,必然对位相等(毕竟 \(a,b\) 没变),即 \(x_0=y_1,y_0=x_1-\left\lfloor\dfrac{a}{b}\right\rfloor\times y_1\)。
-
从而可以递归求解,只需要知道最后一层的 \(x,y\) 就可以倒推出前面的。
-
谈谈具体实现:传四个参 \(a,b,\And x,\And y\),\(a,b\) 按照欧几里得算法来互相取模,递归下去,然后回来的时候我们有 \(x_{now}=y,y_{now}=x-\left\lfloor\dfrac{a}{b}\right\rfloor\times y\)。
-
因为上式始终表示的是 \(g\),所以在 \(b=0\) 时就可以强行赋值 \(x=1,y=0\) 然后 return。
-
虽然逻辑上这时候 \(y\) 的取值是任意的,但不建议取大(指 \(2\) 以上),递归的时候会算得非常大。
-
这也代表着,exgcd 和 gcd 的复杂度相同,都为 \(O(\log v)\),因为只有 \(O(\log v)\) 次递归就到底了。
-
-
整数解集为 \(x=x_0+k\dfrac{b}{(a,b)},y=y_0-k\dfrac{a}{(a,b)},k\in \mathbb{Z}\),简单证明如下:
-
假设 \(a\times (x_0+m)+b\times (y_0-n)=(a,b)\)。
-
则
\[a\times m=b\times n,n=\dfrac{a\times m}{b}=\dfrac{\dfrac{a}{(a,b)}\times m}{\dfrac{b}{(a,b)}} \]-
所以 \(\dfrac{b}{(a,b)}\mid m\),否则不是整数了。
-
故 \(m_{min}=\dfrac{b}{(a,b)}\),同理 \(n_{min}=\dfrac{a}{(a,b)}\) 。
-
注意这里的形式其实象征着 \(x,y\) 的解系分别是新同余方程\(x_0 \bmod\ {m_{min}}\) 和 \(y_0 \bmod\ {n_{min}}\)。
-
总解数显然是无穷多对。
-
如果想调整成最小正整数(以 \(x\) 为例),只要 \(x+k\times p\geqslant 1\), 即 \(k\geqslant \left\lceil\dfrac{1-x}{p}\right\rceil\)。
-
-
最后记得乘上 \(\dfrac{c}{(a,b)}\)。这一步应该在调成最小正整数之前,且不影响解集。
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){x=1,y=0; return a;}
ll ret=exgcd(b,a%b,x,y);
ll tx=x,ty=y;
x=ty,y=tx-a/b*ty;
return ret;
}
-
非递归版本细节更多,这里略去。
-
若在 \(\pmod p\) 意义下 \(a^{-1}\) 存在,则有 \(aa^{-1}+kp=1\),exgcd 求解之,然后调整成最小正整数解即可,\(O(\log p)\)。
线性求逆元
-
主要有两种方法:递推法和阶乘法。
-
本质上都依赖 \(1^{-1}\sim n^{-1}\) 的全体存在性,换言之,必须有 \(n<p\And p\in prime\)。
-
递推法:基于 \(1^{-1}\sim (n-1)^{-1}\) 推出 \(n^{-1}\)。
-
不妨设 \(p=kn+r\),于是 \(kn+r\equiv 0\pmod p\)。
-
移项,左右同乘 \(n^{-1}\),得到 \(k\equiv -rn^{-1}\)。
-
所以 \(n^{-1}\equiv -kr^{-1}\pmod p\)。显然 \(r<n\),故该式可以直接算出 \(n^{-1}\),代码表现如下:
-
inv[1]=1;
For(i,2,n) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
-
连乘法:利用逆元的性质和费马小定理。
-
首先算出 \(1!\sim n!\),用费马小定理算出 \((n!)^{-1}\)。
-
从而可以倒推,得到 \((a!)^{-1}\equiv (a+1)((a+1)!)^{-1}\)。
-
于是 \(a^{-1}=(a-1)!(a!)^{-1}\)。
-
-
两者的复杂度都是 \(O(n)-O(1)\)。
例题
P5431 【模板】乘法逆元 2
-
题意略。
-
注意到连乘法并没有用到阶乘的任何性质。用之,过。