Re:从零开始的同余问题

posted on 2023-08-09 13:27:47 | under 笔记 | source

同余

在开始前必须要说明,涉及同余的变量和参量一般都为整数或正整数。

  • 同余的定义

    对于 \(a,b\in\mathbb{Z}\),若 \(a\)\(b\) 除以 \(p\) 所得的余数相等,则称 \(a\)\(b\) 对模 \(p\) 同余,也称 \(a\)\(b\) 在模 \(p\) 意义下相等。

    定义 “\(≡\)” 为同余符号,注意同余符号 \(\equiv\) 与相等符号 \(=\) 的区别。

    有了同余符号后,我们将 \(a\)\(b\) 对模 \(p\) 同余记作:\(a \equiv b \pmod{p}\),上式就叫同余式。

  • 同余的基本性质

    为什么要将模运算单独列出,并称其为同余呢?

    原因在于同余满足诸多性质,下面给出同余的基本性质,它们与等式的基本性质有很大相似之处:

    \(a,b,k\in\mathbb{Z}\)\(p,n\in\mathbb{N}\)

    1. 同加性:若 \(a\equiv b\pmod{p}\),则 \(a+k\equiv b+k\pmod{p}\)
    2. 同乘性:若 \(a\equiv b\pmod{p}\),则 \(ak\equiv bk\pmod{p}\)
    3. 同幂性:若 \(a\equiv b\pmod{p}\),则 \(a^n\equiv b^n\pmod{p}\)
    4. 自反性:\(a\equiv a\pmod{p}\)
    5. 对称性:若 \(a\equiv b\pmod{p}\),则 \(b\equiv a\pmod{p}\)
    6. 传递性:若 \(a\equiv b\pmod{p}\),且 \(b\equiv c\pmod{p}\),则 \(a\equiv c\pmod{p}\)

    显然,若 \(a\equiv b\),那么 \(a/n\equiv b/n\) 不一定成立。

    只有当 \(n\mid a,n\mid b\),且 \((n,p)=1\) 时,上式成立。

    证明

    \(a=xn,b=yn\)

    \(xn\equiv yn \pmod {p}\)

    \(xn-yn \equiv 0\pmod {p}\)

    \(n(x-y)\equiv 0\pmod {p}\)

    因为 \((n,p)=1\),所以 \(n \not\equiv 0 \pmod {p}\),所以 \(x-y\equiv0\pmod {p}\)

    那就有:\(x\equiv y \pmod {p}\),证毕。

拓展欧几里得算法

首先我们知道,朴素欧几里得算法的原理是:\(gcd(a,b)=gcd(b,a\bmod b)\)

  • 引理 \(1\)

    \(x,y\in\mathbb{Z}\)\(ax+by=gcd(a,b)\)

  • 证明

    \(b\) 的取值情况进行讨论。

    • \(b=0\) 时:

      这是朴素欧几里得算法的最后一步,即 \(gcd(a,b)=a\)

      那么就有:\(a*1+b*0=a\),此时 \(x=1\)\(y=0\)

    • \(b\ne0\) 时:

      假设已求出 \(gcd(b,a \bmod b)\) 的一组解 \(x_2\)\(y_2\)

      那么就有:\(b*x_2+(a \bmod b)*y_2=gcd(b,a \bmod b)=gcd(a,b)\)

      我们知道:\(a \bmod b=a-\lfloor \frac ab\rfloor*b\),由于在 \(\rm C++\) 中自动向下取整,于是下文默认 \(\frac ab=\lfloor \frac ab \rfloor\)

      所以:\(b*x_2+(a-\frac ab*b)*y_2=gcd(a,b)\)

      拆开括号得:\(b*x_2+a*y_2-\frac ab*b*y_2=gcd(a,b)\)

      整理得:\(a*y_2+b*(x_2-\frac ab*y_2)=gcd(a,b)\)

      那我们便得到方程 \(ax+by=gcd(a,b)\) 的一组解:\(x=y_2\)\(y=x_2-\frac ab*y_2\)

    利用数学归纳法便可知引理成立(\(b=0\) 时成立,那么 \(b=0\) 的上个状态会成立,上上个状态也会成立,以此类推),那么拓展欧几里得算法的递归过程也是成立的。

于是便可得到快速求解 \(ax+by=gcd(a,b)\) 的一种有效方法,我们称之为 \(\rm {exgcd}\),时间复杂度是 \(O(\log\limits a)\)

完全看懂上述推导过程就来写模板练手吧 ~

注意函数内引用,代码如下:

#include<bits/stdc++.h>
using namespace std;
int a,b,x,y;
void exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1;
		y=0;
		return ;
	}
	exgcd(b,a%b,y,x); //x1=y2,y1=x2,y1 之后再处理 
	y=y-a/b*x; //y1=x2-a/b*y2 
}
int main()
{
	cin>>a>>b;
	exgcd(a,b,x,y);
	cout<<x<<' '<<y;
	return 0;
}

非常简短,这就是数论的魅力 ~

不定方程

接上文,我们已经知道不定方程: \(ax+by=gcd(a,b)\) 的解法。但这还远远不够,我们想知道 \(c\in\mathbb{Z}\) 时,不定方程:\(ax+by=c\) 的解法。

当然,该不定方程可能无解,下面介绍判断是否有解的裴蜀定理。

  • 裴蜀定理

    定理 \(1\)

    \(ax+by=c\) 有整数解,当且仅当 \(gcd(a,b)\mid c\)

    证明

    \(d=gcd(a,b)\)

    • \(d\mid c\)

      则有 \(\frac adx+\frac bdy=\frac cd\)

      因为 \(gcd(\frac ad,\frac bd)=1\),所以不妨丢掉 \(\frac cd\),先求 \(\frac adx^\prime+\frac bdy^\prime=gcd(\frac ad,\frac bd)\) 的解。由 \(\rm {exgcd}\) 可知,上述方程一定存在整数解。

      等式两边同时乘 \(c\) 可得:\(c*\frac adx^\prime+c*\frac bdy^\prime=c\)

      整理得:\(a*\frac cdx^\prime+b*\frac cdy^\prime=c\)

      \(\frac cdx^\prime,\frac cdy^\prime\) 视作整体,那便得到原方程的一组整数解:\(x=\frac cdx^\prime,y=\frac cdy^\prime\)

    • \(d\nmid c\)

      先列出:\(\frac adx+\frac bdy=\frac cd\)

      \(\rm {gcd}\) 的性质知:\(\frac ad,\frac bd \in \mathbb{Z}\),而 \(\frac cd \notin \mathbb{Z}\)

      因此原方程无整数解。

  • 不定方程通解

    我们已求出原方程的一组整数解 \(x_*,y_*\),先考虑求离 \(x_*,y_*\) 最近的一组解 \(x_1,y_1\)

    首先有:\(ax_*+by_*=c\)

    \(k\in \mathbb{Q}\),在等式左边加上再减去 \(kab\),等式依然成立。

    整理后得:\(a(x_*+kb)+b(y_*-ka)=c\)

    那么就有: \(x_1=x_*+kb,y_1=y_*-ka\)

    现在的问题是求出 \(k\),使得 \(ka,kb\in \mathbb{Z}\) 且最小。

    经过尝试发现,当 \(k=\frac 1{gcd(a,b)}\) 时满足条件,这利用了 \(gcd\) 的性质,即两数同时除以它们的 \(gcd\) 后互质。

    那么将 \(k\) 代入得:\(x_1=x_*+ka=x_*+\frac a{gcd(a,b)},y_1=y_*+kb=y_*-\frac b{gcd(a,b)}\)

    以此类推,\(x_i,x_{i-1}\) 之间也一定相差 \(ka\)\(y_i\) 同理。

    于是通解公式呼吁而出:

    \(\begin{cases}x=x_* \pm s*\frac a{gcd(a,b)}\\y=y_* \mp s*\frac b{gcd(a,b)} \end{cases}\)

    其中 \(s\in\mathbb{Z}\)

  • P5656 二元一次不定方程

    真的是一道毒瘤模板题啊,很容易把自己绕进去,尤其是像我这样不仔细看题的人

    结合上文,已知不定方程的一组特解,难点在于求其正整数解数量正整数解中最小、最大的 \(x,y\)

    注意到通解的特性:两数中一数增大则另一数减小。

    我们不妨求出 \(x\) 的最小正整数解。此时如果 \(y\le0\),那么就不存在正整数解,因为 \(y\) 再大 \(x\) 就不是正整数了。如果 \(y>0\),那么此时的 \(y\) 就是正整数解中最大的。

    同样的道理,我们在求 \(y\) 最小时顺带求出 \(x\) 最大。

    有了正整数解中 \(x\) 的上下界,那么正整数解数目 \(s=\frac {x_{max}-x_{min}}{c^\prime}+1\),其中 \(c^\prime=\frac {c}{gcd(a,b)}\)

    问题解决,代码放这

线性同余方程

  • 定义

    形如:\(ax\equiv b\pmod {p}\) 的一次同余方程,我们称之为线性同余方程。

  • 解法

    观察方程,可知:\(p\mid ax-b\)。于是将其化为不定方程:\(ax-py=b\)

    为了方便表示,此处的 \(y\) 取相反数:\(ax+py=b\)

    \(d=gcd(a,p)\),解得:\(x_i=x_0+i*\frac pd\)

    显然 \(x_i\) 的取值需要对 \(p\) 取模,而我们想知道取模后有多少不同取值,此时需借助定理:

    • 定理 \(1\)

      \(a,b,p\in\mathbb{Z}\),且 \(p>0\)\(d=gcd(a,b)\)。若 \(d\mid b\),则该方程恰有 \(d\) 个模 \(p\) 不同余的整数解,否则无解。

    • 证明:

      已知 \(x_i=x_0+i*\frac pd\)

      由于 \(\frac pd≥1\),所以当 \(0≤i<d\) 时,\(0≤x_i<p\),且 \(x_i\) 互不相同。

      因此,原方程恰有 \(d\) 个取 \(p\) 不同余的整数解。至于无解的情况,化为不定方程易知。

乘法逆元

众所周知,除法是乘法运算的逆运算,用于抵消乘法,而除以一个数相当于乘以这个数的倒数。

同余问题中,求倒数是很有价值的。假如要求 \(\frac ba \bmod {p}\),将 \(b,\frac 1a\) 分别对 \(p\) 取余后相乘即可。

但是同余式不满足同除性,因此取倒数就不仅仅是 \(\frac 1a\) 那样简单了。

于是便诞生了 乘法逆元 这一分块。

  • 定义

    对于 \(a\in\mathbb{Z}\),若有 \(x\in\mathbb{Z}\) 使得: \(ax\equiv 1 \pmod p\),则称 \(x\)\(a\) 在模 \(p\) 意义下的逆元。

  • 线性同余方程

    回顾线性同余方程 \(ax\equiv b \pmod p\)

    实际上,逆元的定义式就是线性同余方程 \(b=1\) 的情况。

    然后根据线性同余方程的定理,逆元有解,当且仅当 \(gcd(a,p) \mid 1\),也就相当于 \(a,p\) 互质,同时逆元对 \(p\) 取余的值恰好为 \(1\),也就是说求出方程任意一组解并取模即可。

    那用 \(\rm {exgcd}\) 求解便可得到特解,问题解决(求通解套公式即可)。

  • 欧拉定理

    定理 \(1\)

    \(a,p\) 互质,则有 \(a^{\phi(p)}\equiv1\pmod p\)

    证明

    定义 \(t_1,t_2...t_{\phi(p)}\) 是模 \(p\) 的一个简化剩余系,则 \(at_1,at_2...at_{\phi(p)}\) 也是模 \(p\) 的一个简化剩余系。

    为啥呢,不妨分为两部分分析:

    1. 互质:

      因为 \(t_i\)\(p\) 互质,\(a\)\(p\) 互质,所以 \(at_i\) 也与 \(p\) 互质。

    2. 不重复:

      考虑反证法。

      假设有 \(at_i\equiv at_j\pmod p\),则变式后得 \(a(t_i-t_j)\equiv 0\pmod p\)

      这代表 \(p\mid a(t_i-t_j)\)

      又因为 \(p\nmid a\),所以 \(p\mid (t_i-t_j)\)

      可是 \(t_i,t_j<p\),所以 \(t_i-t_j<p\)\(p\nmid (t_i-t_j)\),矛盾,假设不成立。

    因此,\(t_1,t_2...t_{\phi (p)}\)\(at_1,at_2...at_{\phi(p)}\) 都是模 \(p\) 的一个简化剩余系。

    所以 \(\forall i,t_i\equiv at_i\)

    所以 \(\prod\limits_{i=1}^{\phi(p)}t_i\equiv \prod\limits_{i=1}^{\phi(p)}at_i \pmod p\)

    所以 \(\prod\limits_{i=1}^{\phi(p)}t_i\equiv a^{\phi (p)}\prod\limits_{i=1}^{\phi(p)}t_i \pmod p\)

    化简后可得 \(a^{\phi(p)}\equiv 1\pmod p\),证毕。

  • 费马小定理

    定理 \(2\)

    \(p\) 为质数,则对 \(\forall a\in \mathbb{Z}\),都有 \(a^{p-1}\equiv 1 \pmod p\)

    证明 \(1\)

    由欧拉定理可知:\(a^{\phi(p)}\equiv 1\pmod p\),又因为 \(p\) 为质数,所以 \(\phi(p)=p-1\),那便有 \(a^{p-1}\equiv 1\pmod p\)

    证明 \(2\)

    好多啊,其实是早就写了不想删。

    我们定义两个集合:

    \(T_1=\{a,2a,3a...(p-1)a\}\),每个元素可表示为 \(k_ia\),其中 \(1≤i≤p-1\)

    \(T_2\) 的所有元素为 \(T_1\) 所有元素模 \(p\) 后的值。

    • 引理 \(1\)

      已知 \(a,p\in\mathbb{Z}\)\(gcd(a,p)=1\)。那么对于任意整数 \(k_i,k_j\),如果 \(k_ia\equiv k_ja\pmod {p}\),那么就有 \(k_i\equiv k_j \pmod {p}\)

    • 证明

      由于 \(p\) 为质数,显然 \(gcd(a,p)=1\)

      回顾同余的基本性质,易知:\(\frac {k_ia}a\equiv\frac {k_ja}a\pmod {p}\),那么便有 \(k_i\equiv k_j \pmod {p}\)

    假设 \(T_2\) 中存在两个相同元素,也就是 \(k_ia\equiv k_ja \pmod {p}\),由引理 \(1\) 可知 \(T_1\) 中一定存在 \(k_1= k_2 \pmod {p}\),这与定义矛盾,假设不成立。

    因此 \(T_2\) 所有元素互不相同。又因为 \(T_2\) 恰有
    \(p-1\) 个元素。所以 \(T_2=\{1,2,3...p-1 \}\),每个元素可表示为 \(k_i\)

    \(T_1,T_2\) 的定义知,对于任意 \(k_i\) 都有 \(k_i\equiv k_ia\pmod {p}\)

    也就是: \(\prod\limits_{i=1}^{p-1}k_i\equiv \prod\limits_{i=1}^{p-1}k_ia \pmod{p}\)

    即:\((p-1)!\equiv a^{p-1}*(p-1)! \pmod {p}\)

    化简后便是 \(a^{p-1}\equiv 1 \pmod {p}\),证毕。

    利用费马小定理,可知 \(a^{-1}\equiv a^{p-2} \pmod {p}\)

    那么直接用快速幂求逆元即可。

  • 递推式求逆元

    可在 \(O(n)\) 的时间复杂度内,求出 \(1\) ~ \(n\) 在模 \(p\) 意义下的逆元。

    问题

    已知 \(1\) ~ \(i-1\) 的逆元,求 \(i\) 的逆元。

    递推式推导

    \(a=\lfloor \frac pi \rfloor,k=p \bmod i\)

    那就有:\(a*i+k\equiv 0 \pmod p\)

    两边同时乘 \(k^{-1}*i^{-1}\) 可得:\(a*k^{-1}+i^{-1}\equiv 0\pmod p\)

    移项后便得到递推式:\(i^{-1}\equiv -a*k^{-1} \pmod p\)

同余方程组

  • 定义

    有两个正整数数组 \(a_1,a_2...a_n\)\(m_1,m_2...m_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}\)

    是不是很像小奥的余数问题?没错,但现在它拓展为 \(n\) 个同余方程组,我们用同余方面的知识来分析它。

    • 引理 \(1\)

      同余方程组若有解 \(x\),则通解为 \(x+i*lcm(m_1,m_2...m_n)\),其中 \(i\in\mathbb{Z}\)

    • 简要证明:

      \(M=lcm(m_1,m_2...m_n)\),显然对于 \(\forall m_i,M\equiv 0 \pmod{m_i}\)

      那么对于任意 \(i\),在同余式左边加上 \(M\) 后仍然成立,即:\(x+M\equiv a_i\pmod {m_i}\)

      所以正确性得到了保证。又因为 \(M\)\(m_1,m_2...m_n\) 的所有公倍数中最小的,而 \(x\) 加上一个不是所有 \(m\) 的公倍数的数后就没有上述推导过程,显然会使方程组不成立。因此通解为 \(x+i*M\) 时才不会漏解少解,证毕。

  • 中国剩余定理

    老祖宗的智慧,给出了 \(m_i\) 两两互质的情况下的特殊解。

    • 定理 \(1\)

      \(m_i\) 两两互质,则令 \(M=\prod\limits_{i=1}^{n},M_i=\frac M{m_i}\)\(t_i\)\(M_it_i \equiv 1\pmod {m_i}\) 的一个解(逆元)。

      则上述方程组的解为:\(x=\sum\limits_{i=1}^{n} a_iM_it_i\),且在模 \(M\) 意义下有唯一解。

    • 证明:

       因为 $M_i$ 是除 $m_i$ 外所有 $m$ 的倍数,因此有 $\forall j \neq i,a_iM_it_i\equiv 0 \pmod {m_j}$。
      

      注意到 \(M_it_i \equiv 1\pmod {m_i}\),两边同时乘上 \(a_i\) 得:\(a_iM_it_i \equiv a_i \pmod {m_i}\)

      \(x=\sum\limits_{i=1}^{n}\),那么对于任意 \(i\),都有 \(x \equiv a_i \pmod {m_i}\)

      这可以理解为:对于任意 \(i\)\(x\) 中都存在对应的 \(a_iM_it_i\) 使得方程组成立,同时 \(x\) 中除 \(a_iM_it_i\) 外的其它部分又不影响同余式成立。

      于是我们得到一组特解。注意到 \(M=lcm(m_1,m_2...m_n)\),借助引理 \(1\),就可解释所有 \(x\) 为何在模 \(M\) 意义下值是唯一的。证毕。

      • 另外一种理解方式:

        参考自 yyc 巨佬的证明,更直观地揭示了其底层原理,而且码量极少。

        但是大佬的思路不太好表达啊QwQ

        考虑将方程组两两合并:

        \(\begin{cases} x\equiv a_i \pmod {m_i}\\x\equiv a_{i+1} \pmod {m_{i+1}}\end{cases}\)

        利用构造法,令 \(x=a_im_{i+1}+a_{i+1}m_i\)

        好处在于构造了分别为 \(m_i,m_{i+1}\) 的倍数的两部分,使得 \(x\)\(m_i\)\(a_im_{i+1}\),模 \(m_{i+1}\) 后得 \(a_{i+1}m_i\)

        唯一的问题便是抵消掉 \(m_i,m_{i+1}\)。同样的,分为两部分,对于抵消 \(m_i\) 需要修改 \(a_{i+1}m_i\),利用逆元的知识,使其乘上 \(m_i\) 在模 \(m_{i+1}\) 意义下的逆元即可抵消 \(m_i\)。对于抵消 \(m_{i+1}\) 也是同理,乘上 \(m_{i+1}\) 在模 \(m_i\) 意义下逆元即可。

        于是 \(x=t_ia_im_{i+1}+t_{i+1}a_{i+1}m_i\),其中 \(t\) 表示逆元。

        \(1\) ~ \(i-1\) 部分合并后,方程组 \(1\) ~ \(i-1\) 都可成立,那么模数便是 \(\prod\limits_{i=1}^{n}m_i\),这是给下次合并加上限制。

        所以怎么推递推式呢?根据上面内容推导即可。

        假设已求出 \(1\) ~ \(i-1\) 的解 \(x_1\)\(M=\prod\limits_{j=1}^{i-1}m_j\),现在要加上方程组 \(x\equiv a_i\pmod {m_i}\)

        那么 \(x=x_1m_i+a_iM\),这样分别模 \(M,m_i\) 后可得前半、后半部分。

        之后就是要去掉前半后半部分的 \(m_i,M\),令 \(m_it_1\equiv 1\pmod {M}\)\(Mt_2\equiv 1\pmod {m_i}\)

        分别乘上上 \(t_1,t_2\) 得:\(x=t_1x_1m_i+t_2a_iM\)

        至于初始化,令 \(M=1,x_1=0\),代入上式后发现刚好满足第一个同余式。

        到此结束。

  • 拓展中国剩余定理

    \(m_i\) 不满足两两互质时,朴素中国剩余定理就无法使用了,因为逆元部分需满足两数互质。

    那么考虑两两合并,假设已知前 \(i-1\) 个方程组的特解 \(x^\prime_*\),现在求前 \(i\) 个方程的特解 \(x_*\)

    令:\(M_i=lcm(m_1,m_2...m_i)\)

    由引理 \(1\) 知,前 \(i-1\) 个方程组的通解是\(x^\prime_s=x^\prime_*+s*M_{i-1}\),那么 \(x_*\) 必然是这些解中的一个。

    于是问题转化为求解:\(x^\prime_*+s*M_{i-1}\equiv a_i\pmod {m_i}\)

    这就很眼熟了,再转变一次:\(s*M_{i-1}\equiv a_i-x^\prime_*\pmod {m_i}\)

    其中只有 \(s\) 为未知数,所以直接求解上述线性同余方程即可。

    需要注意的是,该同余方程组不一定有解,每次用 \(\rm{exgcd}\) 判断是否有解即可。

    总的来说,解 \(n\) 次线性同余方程即可得出整个方程组的解。

高次同余方程

  • 定义

    \(a,b,p\in\mathbb{Z}\),且 \(a,p\) 互质,求关于 \(x\) 的同余方程 \(a^{x}\equiv b\pmod p\) 的非负整数解。

  • 解法

    考虑 \(\rm{BSGS}\) 算法求解。

    • 引理 \(1\)

      \(a^{i}\equiv a^{i\bmod\phi(p)} \pmod {p}\)

    • 证明:

      由欧拉定理知:\(a^{\phi(p)}\equiv 1\pmod p\)

      所以 \(a^{k\phi(p)}\equiv 1\pmod p\),其中 \(k\in\mathbb{Z}\)

      所以若有 \(t*a^{k\phi(p)}\equiv 1\pmod p\),则 \(t\equiv 1\pmod p\),其中 \(t\)\(a^{k\phi(p)}\) 在模 \(p\) 意义下的逆元。

      所以 \(a^{i \bmod \phi(p)}\equiv a^{i-k\phi(p)}\equiv \frac {a^i}{a^{k\phi(p)}}\equiv a^it\equiv a^i \pmod p\),证毕。

    由引理 \(1\) 知,\(a^i\equiv a^{i\bmod \phi(p)}\)。因为 \(\phi(p)\le p-1\),所以我们只需考虑 \(1\le x\le p\) 的情况即可。

    那么设 \(m=\sqrt p,i,j\in\mathbb{Z}\),其中 \(0\le i\le m,0\le j \le m-1\),则 \(x=i*m-j\),原方程便可表示为:\(a^{i*m-j}\equiv b\pmod p\)

    整理得:\(\frac {a^{i*m}}{a^j}\equiv b\pmod p \to {a^{m}}^{i}\equiv b*a^{j}\pmod p\)

    那么预处理 \(b*a^j\),将其插入 \(\rm {Hash}\) 表中。然后枚举 \(i\),判断 \(\rm {Hash}\) 表中是否存在任意 \(b*a^{j}\) 使得等式成立即可,其中,若已知 \(i,j\),则求出 \(x\) 并更新结果即可。

  • exBSGS

    放宽限制,若 \(a,b,p\) 为任意整数、不一定有 \(a,p\) 互质时,则需使用拓展 \(\rm{BSGS}\) 解决。

    • 引理 \(1\)

      若有 \(a\equiv b\pmod p\),令 \(d=gcd(a,p)\),且 \(d\mid b\),则有 \(\frac ad\equiv \frac bd\pmod {\frac pd}\)

    • 证明:

      \(a\equiv b\pmod p\to \frac add\equiv \frac bdd\pmod {\frac pdd}\)

      移项得 \(\frac add-\frac bdd\equiv 0\pmod {\frac pdd}\)

      所以有 \(t\in\mathbb{Z},t{\frac pdd}=\frac add-\frac bdd\)

      同时除以 \(d\)\(t\frac pd\equiv \frac ad-\frac bd\)

      所以有 \(\frac ad-\frac bd\equiv 0\pmod {\frac pd}\)

      那么 \(\frac ad\equiv \frac bd\pmod \frac pd\)

      证毕。

    考虑通过一系列除法,使其化为朴素 \(\rm{BSGS}\)

    具体步骤:

    \(d_1=gcd(a,p)\)

    那么原方程可变化为 \(\frac {a^x}{d_1}\equiv \frac b{d_1}\pmod {\frac p{d_1}}\)

    以此类推,\(d_i=gcd(a,\frac p{\prod\limits_{j=1}^{i-1} d_j})\),不断除以 \(d_i\) 直到 \(d_{k+1}=1\)。注意中途若有 \(d_i\nmid b\) 则无解。

    \(D=\prod\limits_{i=1}^{k}d_i\)

    有些抽象,那么经过 \(k\) 次操作后,方程的具体情况便是:

    \(\frac {a^x}{D}\equiv \frac bD\pmod {\frac pD}\to a^{x-k}\frac {a^k}D\equiv \frac bD\pmod \frac{p}{D}\)

    这样一看舒服多了。此时满足 \(a,\frac pD\) 互质,那便有 \(\frac {a^k}D,\frac pD\) 互质。

    于是可使用逆元消掉方程左边的 \(\frac {a^k}D\)。令 \(t\in\mathbb{Z},t\frac {a^k}D\equiv 1\pmod \frac pD\),则方程最终是这个样子:

    \(a^{x-k}\equiv t\frac bD\pmod {\frac pD}\)

    预处理结束,接下来用朴素 \(\rm{BSGS}\) 解上述方程即可。

拓展欧拉定理

  • 定理 \(1\)

    若有 \(a,b,p\in\mathbb{Z}\),且 \(b\ge \phi (p)\),则有 \(a^b\equiv a^{(b\bmod \phi(p))+\phi(p)}\pmod p\)

  • 证明:

    考虑先证明对于 \(p\) 的一个质因子 \(q\) 满足上式。

    那便有 \(p=sq^r,s\in \mathbb{Z},r\in \mathbb{Z}\),并满足 \(s,q\) 互质,这一点不证。

    由于 \(gcd(s,q)=1\),所以由欧拉定理知 \(q^{\phi(s)}\equiv1\pmod s\)

    由于欧拉函数是积性函数,所以 \(sq^r=p\to \phi(s)\phi(q^r)=\phi(p)\)

    关键一步,因为 \(q^{\phi(s)}\equiv 1\pmod s\),所以有 \({q^{\phi(s)}}^{\phi(q^r)}\equiv 1\to q^{\phi(s)*\phi(p^r)}\equiv 1\to q^{\phi(p)}\equiv 1\pmod p\)

    那么显然也有 \(q^{kr}\equiv 1\pmod p\)

    于是可得出:对于任意非负整数 \(x\),都有 \(q^{x+kr}\equiv q^x\pmod p\)

    而因为 \(b\ge\phi(p)\),所以一定存在 \(b=x+kr,x\in\mathbb{Z}\),并且满足 \(2\phi(p)>x\ge\phi(p)\)

    根据上面的推导,可知 \(q^{b}\equiv q^{x+kr}\equiv q^x\pmod p\)

    又因为当 \(2\phi(p)>x\ge\phi(p)\) 时,有 \(x-\phi(p)=x\bmod \phi(p)\)

    而且由 \(b=x+kr\)\(b\equiv x\pmod p\),所以有 \(b\bmod \phi(p)=x-\phi(p)\)

    所以 \(b\bmod \phi(p)+\phi(p)=x\)

    所以 \(q^x\equiv q^{b\bmod \phi(p)+\phi(p)}\),那就得到 \(q^{b}\equiv q^{b\bmod \phi(p)+\phi(p)}\)

    那么对于 \(q^{w},w\in\mathbb{Z}\)(需满足 \(q^w\mid p\)),也有 \(q^{w}\equiv {q^{w}}^{b\bmod \phi(p)+\phi(p)}\),证法相似故不展示。

    \(a=a_1*a_2\),其中 \(gcd(a_2,p)=1,a_1=\prod {q_i}^{a_i}\),即 \(a_1\) 所有的质因数都是 \(p\) 的质因数。(\(a_i\)\(q_i\) 的次数而不是 \(a^b\) 中的 \(a\)

    对于 \(a_1\),已经证明 \(\forall{{q_i}^{a_i}}^{b}\equiv {{q_i}^{a_i}}^{b\bmod \phi(p)+\phi(p)}\pmod p\),又因为 \({a_1}^{b}\equiv \prod {q_i}^{a_i} \pmod p\),进而有 \({a_1}^b\equiv {a_1}^{b\bmod \phi(p)+\phi(p)}\pmod p\)

    对于 \(a_2\),由欧拉定理推论知 \({a_2}^{b}\equiv {a_2}^{b\bmod \phi(p)}\pmod p\),又因为 \({a_2}^{\phi(p)}\equiv 1\pmod p\),所以也有 \({a_2}^{b}\equiv {a_2}^{b\bmod \phi(p)+\phi(p)}\pmod p\)

    综上,\(a^b\equiv {a_1}^b*{a_2}^b\equiv {a_1}^{b\bmod \phi(p)+\phi(p)}*{a_2}^{b\bmod \phi(p)+\phi(p)}\equiv a^{b\bmod \phi(p)+\phi(p)}\pmod p\),证毕。

不管那么多,拓展欧拉定理给予我们将 \(a^b\pmod p\) 降幂的工具,整理得:

\(a^b\equiv\begin{cases} a^{b\bmod \phi(p)}&gcd(a,p)=1\\a^b& gcd(a,p)\ne1,b\le\phi(p)\\a^{(b\bmod \phi(p))+\phi(p)}& gcd(a,p)\ne1,b>\phi(p)\end{cases}\pmod p\)

第一种情况就是朴素欧拉定理,不再赘述。

而第二种情况则代表 \(b\) 足够小了没必要降幂,用常规方法直接解决即可。

posted @ 2026-01-14 17:56  Zwi  阅读(0)  评论(0)    收藏  举报