同余问题学习笔记

同余问题学习笔记

——by sunzz3183


扩展欧几里得(exgcd)

命题

对于两个正整数 \(a,b\),存在两个整数 \(x,y\) 使得

\[ax+by=gcd(a,b) \]

证明

在欧几里得算法的最后一步,即 \(b=0\) 时,显然 \(x=1,y=0\),使得 \(a\times 1+0\times 0=gcd(a,0)\)

\(b>0\) ,则,\(gcd(a,b)=gcd(b,a \bmod b)\)。假设存在一对整数 \(x,y\),满足

\[bx+(a \bmod b)y=gcd(b,a \bmod b) \]

因为

\[bx+(a \bmod b)y=bx+(a-b\left \lfloor \frac{a}{b} \right \rfloor )y=ay+b(x-\left \lfloor \frac{a}{b} \right \rfloor y) \]

所以令 \(x^{\prime}=y,y^{\prime}=x-\left \lfloor \frac{a}{b} \right \rfloor y\),就得到了 \(ax^{\prime}+by^{\prime}=gcd(a,b)\)

证毕

代码

inline int exgcd(int a,int b,int &x,int &y){
    if(!b){x=1;y=0;return a;}
    int d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}

通式

则对于任意一个

\[ax_0+by_0=c \]

\(gcd(a,b)|c\) 时,等式成立。

则此时

\[x_0=x\frac{c}{\gcd (a,b)} ,y_0=y\frac{c}{\gcd (a,b)} \]

通解

设二元一次不定方程

\[ax+by=c \]

有一组整数解 \(x=x_0,y=y_0\),则一切整数解可以表示成

\[x=x_0-\frac{bt}{\gcd (a,b)},y=y0+\frac{at}{\gcd (a,b)} \]

其中 $t=0,\pm 1,\pm 2,\pm 3,\cdots $

证明

既然 \(x_0,y_0\) 为整数解,当然满足 \(ax_0+by_0=c\),因此

\[a(x_0-\frac{bt}{\gcd (a,b)})+b(y0+\frac{at}{\gcd (a,b)})= ax_0+by_0=c \]

\(x^{\prime },y^{\prime }\) 为任意一组整数解,则有 \(ax^{\prime }+by^{\prime }=c\),减去 \(ax_0+by_0=c\),即得

\[a(x^{\prime }-x_0)+b(y^{\prime }-y_0)=0 \]

\[a(x^{\prime }-x_0)=-b(y^{\prime }-y_0) \]

所以我们得到

\[a|(y^{\prime }-y_0) \]

\[y^{\prime }=y_0+at \]

\[y^{\prime }=y_0+at \]

代入

\[a(x^{\prime }-x_0)+b(y^{\prime }-y_0)=0 \]

即得

\[x^{\prime }=x_0-bt \]

因此

$ x^{\prime },y^{\prime }$ 可表示成 \(x^{\prime }=x_0-\frac{bt}{\gcd (a,b)},y^{\prime }=y_0+\frac{at}{\gcd (a,b)}\) 的形式

所以

\[x=x_0-\frac{bt}{\gcd (a,b)},y=y_0+\frac{at}{\gcd (a,b)} \]

\(ax+by=c\) 的一切整数解

证毕

中国剩余定理(CRT)

命题

已知同余式组

\[\left\{\begin{matrix} x\equiv b_1\pmod{m_1} , \\x\equiv b_2\pmod{m_2}, \\\cdots , \\x\equiv b_n\pmod{m_n} \end{matrix}\right. \]

其中 \(b\in \mathbb{N} ,m\in \mathbb{N^* } ,m_i \perp m_j\)

\(x\)

求法

\[M=\prod_{i=1}^{n}m_i=m_1M_1=m_2M_2=\cdots=m_nM_n \]

则同时满足同余式组

\[\left\{\begin{matrix} x\equiv b_1\pmod{m_1} , \\x\equiv b_2\pmod{m_2}, \\\cdots , \\x\equiv b_n\pmod{m_n} \end{matrix}\right. \]

的正整数解是

\[x\equiv \sum_{i=1}^{n}b_iM_i^{\prime}M_i \pmod{M} \]

这里的 \(M_i^{\prime}\) 是满足同余式

\[M_i^{\prime}M_i\equiv 1\pmod{m} \]

的正整数解

证明

因为 \(m_i \perp m_j,M_i=\frac{M}{m_i}\),所以 \(m_i \perp M_i\),所以

\[gcd(m_i,M_i)=gcd(m_j,M_j)=1 \]

由扩展欧几里得可得,存在两个整数 \(M_i^{\prime},n_i\),使得

\[M_i^{\prime}M_i+m_i+n_i=1 \]

所以存在一个 \(M_i^{\prime}\),使得

\[M_i^{\prime}M_i \equiv 1 \pmod{m_i} \]

又由当 \(i\ne j\)时,则由 \(m_i \perp m_j,M_j=\frac{M}{m_j}\) 得到 \(m_i|M_j\),所以

\[b_jM_j^{\prime}M_j\equiv 0 \pmod{m_i} \]

所以

\[\sum_{i=1}^{n}b_iM_i^{\prime}M_i \equiv b_iM_i^{\prime}M_i\equiv b_i \pmod{m_i} \]

\(y\) 为同余式组的一个整数解,则得

\[\left\{\begin{matrix} x\equiv y\pmod{m_1} , \\x\equiv y\pmod{m_2}, \\\cdots , \\x\equiv y\pmod{m_n} \end{matrix}\right. \]

也就是

\[\begin{matrix} m_1|(x-y), \\m_2|(x-y), \\\cdots , \\m_n|(x-y) \end{matrix} \]

又因为 \(m_i \perp m_j\),所以有 \(M|(x-y)\),也就是

\[x\equiv y \pmod{M} \]

所以

\[x\equiv \sum_{i=1}^{n}b_iM_i^{\prime}M_i \pmod{M} \]

是满足同余式组的唯一正整数解

证毕

代码

inline int exgcd(int a,int b,int &x,int &y){
    if(!b){x=1;y=0;return a;}
    int d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}
int CRT(int A[],int B[],int k){
    int x,y,a=0,m,n=1;
    for(int i=1;i<=k;i++)n*=A[i];
    for(int i=1;i<=k;i++){
        m=n/A[i];
        exgcd(A[i],m,x,y);
        (a+=y*m*B[i])%=n;
    }
    return (a+n)%n;
}

扩展中国剩余定理(exCRT)

命题

已知同余式组

\[\left\{\begin{matrix} X\equiv b_1\pmod{m_1} , \\X\equiv b_2\pmod{m_2}, \\\cdots , \\X\equiv b_n\pmod{m_n} \end{matrix}\right. \]

其中 \(b\in \mathbb{N} ,m\in \mathbb{N^* }\)

\(X\)

\(CRT\) 不同的是,这个 \(m_i,m_j\),不一定两两互质。

求法

(建议配合代码食用)

考虑合并

\[\left\{\begin{matrix} X\equiv b_1\pmod{m_1} , \\X\equiv b_2\pmod{m_2} \end{matrix}\right. \]

可以写成

\[\left\{\begin{matrix} X=b_1+m_1x , \\X=b_2+m_2y \end{matrix}\right. \]

所以

\[b_1+m_1x=b_2+m_2y \]

整理,得

\[m_1x+m_2(-y)=b_2-b_1 \]

通过 \(exgcd\) 可以得到一组解 \(x_0,y_0\)

所以

\[m_1x_0\frac{b_2-b_1}{\gcd(m_1,m_2)}+m_2y_0\frac{b_2-b_1}{\gcd(m_1,m_2)}=\gcd(m_1,m_2)\frac{b_2-b_1}{\gcd(m_1,m_2)}=b_2-b_1 \]

因为 \(X=m_1x+b_1\),现在要最小化 \(X\),也就是最小化 \(x\),即最小化 \(x=x_0\frac{b_2-b_1}{\gcd(m_1,m_2)}\)

我们假设 \(b_2,m_2\),为已经算出的前 \(k\) 对数的答案

于是就可以将这两个同余方程合并为

\[X\equiv m_1x+b_1 \pmod {lcm(m_1,m_2)} \]

代码

inline int exgcd(int a,int b,int &x,int &y){
    if(!b){x=1;y=0;return a;}
    int d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}
int exCRT(int *A,int *B,int k){
    int x,y,a=A[1],ans=B[1];
    for(int i=2;i<=k;i++){
    	int b=A[i],c=((B[i]-ans)%b+b)%b,d=exgcd(a,b,x,y);
    	if(c%d)return -1;
    	x=(__int128)x*(__int128)c/(__int128)d%(b/d);
    	ans+=a*x;
    	a=a/d*b;
    	ans=(ans%a+a)%a;
    }
    return (ans%a+a)%a;
}
posted @ 2023-02-11 10:37  sunzz3183  阅读(41)  评论(0编辑  收藏  举报
Live2D