数论相关 学习笔记

实在不想挂一堆链接了。还是自己写个文章把各种知识点归纳一下吧。

gcd/exgcd

求exgcd的过程就是在求gcd的过程中,同步维护两个变量,以求得不定方程 \[ ax+by=\gcd(a,b) \]

的一组特解。显然我们通过这组特解可以求得对应的最小非负整数解。当然我们也同样能解决 \[ ax+by=c \] 这样的不定方程。

算法最关键的步骤就是 \(x,y\) 在递归过程中的维护。先放代码:

1
2
3
4
5
6
7
8
9
10
11
int gcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int d,tx,ty;
d=gcd(b,a%b,tx,ty);
x=ty;
y=tx-a/b*ty;
return d;
}

怎么理解?首先递归到边界时,问题变成 \(ax=\gcd(a,b)\),所以答案比较显然。

第二个就是递归过程中。其实更新 \(x,y\) 和求gcd的 \(a,b\) 道理是一样的,我们更新 \(a,b\) 的时候是变成了 \(b,a\% b\) 往下递归,其中 \(a\% b\) 可以理解成 \(a-(\left \lfloor \frac{a}{b} \right \rfloor \times b)\) 。所以我们就用 \(ty,tx-(\left \lfloor \frac{a}{b} \right \rfloor \times ty)\) 来更新 \(x,y\)

注意:该算法求得的特解的绝对值不会超过 \(a,b\) 的绝对值,但是过程中仍然需要开long long。

逆元

当模数为质数的时候,可以用费马小定理求,原因不解释。逆元的结果是 \(a^{p-2}\% p\)

一般情况下,可以利用exgcd构造求方程 \[ ax+bp=1 \]

的解,变成最小非负整数解即为 \(a\) 在模 \(p\) 意义下的逆元。

当然,在求组合数等情况下,也可以利用阶乘求得阶乘的逆元。

CRT/exCRT

中国剩余定理

该算法能给出形如 \(x\equiv a_i \pmod{p_i}\) 线性同余方程组的(模数两两互质)的一组解。

求解方法如下:

  • 算得 \(M=\prod_{i=1}^n p_i\)
  • 算得 \(M_i=\frac{M}{p_i}\)
  • 用exgcd求得 \(M_i\) 在模 \(p_i\) 意义下的逆元 \(t_i\)
  • \(ans\equiv \sum_{i=1}^n a_iM_it_i \pmod{M}\)

注意:上面的几个式子模数不太一样!

代码:

1
2
3
4
5
6
7
8
9
10
11
for(int i=1;i<=n;i++){
cin>>m[i]>>a[i];
M*=m[i];
}
for(int i=1;i<=n;i++){
Mi[i]=M/m[i];
int x=0,y=0;
gcd(Mi[i],m[i],x,y);
ans+=x*a[i]*Mi[i];
ans=(ans+M)%M;
}

扩展中国剩余定理

该算法用于解决上述问题中模数不保证两两互质的情形。

先考虑只有两个方程的简单情况。 \[ \begin{cases} x\equiv a_1 \pmod{p_1} \\ x\equiv a_2 \pmod{p_2} \end{cases} \] 我们可以写成不定方程的形式: \[ \begin{cases} x=a_1+p_1m_1\\ x=a_2+p_2m_2 \end{cases} \] 移项得 \[ m_1p_1-m_2p_2=a_2-a_1 \] 用exgcd可以求得一组 \((p_1,p_2)\) 的解,这样我们就将两个不定方程合并成了这个不定方程 \[ x\equiv m_1p_1+a_1 \pmod{\operatorname{lcm}(p_1,p_2)} \] 多组的问题也像这么合并就行了。

放代码:

1
2
3
4
5
6
7
8
9
10
11
12
int excrt(){
int M=m[1],ans=a[1];
for(int i=2;i<=n;i++){
int x,y,c=(a[i]-ans%m[i]+m[i])%m[i];
int gc=gcd(M,m[i],x,y);
x=x*(c/gc)%(m[i]/gc);
ans+=x*M;
M*=(m[i]/gc);
ans=(ans+M)%M;
}
return ans;
}

Lucas 定理

感觉说了跟没说一样。 \[ \begin{pmatrix} n\\ m \end{pmatrix}\bmod p= \begin{pmatrix} \lfloor\frac{n}{p}\rfloor \\ \lfloor\frac{m}{p}\rfloor \end{pmatrix}\times \begin{pmatrix} n\bmod p \\ m\bmod p \end{pmatrix} \]