整除与同余基础

欧几里得算法

  • 鉴于后面有很多和 \(\gcd\) 相关的东西,拿这个起手,顺便规定 \((a,0)=(0,a)=a\)
    • 在群论意义下,对于 \(\gcd\) 操作,\(1\) 是零元,我们这么规定是让 \(0\) 做单位元。

    • 我是真的没地方放了。总不能把这个放数学杂项吧。

\[(a,b)=(a\bmod b,b)(a\geqslant b) \]

  • 证明:

  • 显然在 \(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)\) 为域。证明如下:

    1. 封闭性:任意运算最后都要 \(\bmod p\to \in [0,p)\)

    2. 结合律:显然,略。

    3. 单位元:分别是 \(0,1\)

    4. 逆元:加法的是 \(-a\),乘法的存在性依赖于裴蜀定理。

    5. 交换律:依赖于整数域下的 \((a+b)\bmod p=(a\bmod p+b\bmod p)\bmod p\),乘法同理,事实上我不知道怎么证。

裴蜀定理

\[a\times x+b\times y=c \Leftrightarrow (a,b)\mid c \]

  • 其中 \(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\),与前设矛盾。

  • 运用数学归纳法,容易推广到多元情况。

  • 该定理给出了同余近似域(这名字肯定不对,但我真的不想学群/环/域论,嫖完群公理就收手吧)中,乘法逆元存在性的判定。

逆元的求解

费马小定理

\[\forall p\in prime,a\in R \And a\neq 0,a^{p-1}\equiv 1\pmod p \]

  • 不证明,因其是欧拉定理的特殊情况。

欧拉定理

\[\forall a\perp p,a^{\varphi(p)}\equiv 1\pmod p \]

  • 群论证明:

    • 若不考虑零元 \(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\times x_0+b\times y_0=(a,b)=(b,a\bmod b)=b\times x_1+(a\bmod b)\times y_1 \]

  • 整理得

\[b\times x_1 +(a-\left\lfloor\dfrac{a}{b}\right\rfloor\times b)\times y_1=a\times y_1+b\times (x_1-\left\lfloor\dfrac{a}{b}\right\rfloor\times 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

  • 题意略。

  • 注意到连乘法并没有用到阶乘的任何性质。用之,过。

posted @ 2023-01-11 10:43  未欣  阅读(54)  评论(0编辑  收藏  举报