初等数论
a_blue_cell
·
2022-09-01 20:35:42
·
算法·理论
如有错误或 $\LaTeX$ 不规范的地方,请在评论区指出
# 1. 整除
## 1.1. 定义
设 $a,b\in \mathbb{Z},a\ne0$ ,如果 $\exists\ q$ ,使 $aq=b$ ,则 $b$ 能被 $a$ 整除,记作 $a\mid b$ ,否则, $b$ 不能被 $a$ 整除,记作 $a\nmid b
1.2. 性质
1.2.1. 性质1
若 a\mid b,b\mid c ,则 a\mid c
证明:
\begin{aligned}\because&\ a\mid b,b\mid c\\&\text{令}ax=b,by=c(x,y\in \mathbb{Z},x\ne0,y\ne0)\\\therefore&\ axy=c\\\because&\ x,y\in\mathbb{Z}\\\therefore&\ xy\in\mathbb{Z}\\\therefore&\ a\mid c\end{aligned}
1.2.2. 性质2
若 a\mid b,a\mid c ,则有 \forall\ x,y\in\mathbb{Z} ,满足 a\mid(bx+cy)
证明:
\begin{aligned}\because&\ a\mid b,a\mid c\\&\text{令}ax_1=b,ay_1=c(x_1,y_1\in\mathbb{Z},x_1\ne0,y_1\ne0)\\
&\begin{aligned}bx+cy&=ax_1x+ay_1y\\&=a(x_1x+y_1y)\end{aligned}\\\because&\ a\mid a(x_1x+y_1y)\\\therefore&\ a\mid(bx+cy)\end{aligned}
1.2.3. 性质3
若 a\mid b ,则 am\mid bm(m\ne0)
证明:
\begin{aligned}\because&\ a\mid b\\&\text{令}ax=b(x\in\mathbb{Z},x\ne0)\\\therefore&\ amx=bm\\\therefore&\ am\mid bm\end{aligned}
1.2.4. 性质4
若 \forall\ x,y\in\mathbb{Z} 满足 ax+by=1 ,且 a\mid n,b\mid n ,则 ab\mid n
证明:
\begin{aligned}\because&\ a\mid n,b\mid n\\&\text{令}ax_1=n,by_1=n(x_1,y_1\in\mathbb{Z},x_1,y_1\ne0)\\&\begin{aligned}ax+by&=1\\\dfrac{x}{b}+\dfrac{y}{a}&=\dfrac{1}{ab}\\\dfrac{xn}{b}+\dfrac{yn}{a}&=\dfrac{n}{ab}\\\dfrac{by_1x}{b}+\dfrac{ax_1y}{a}&=\dfrac{n}{ab}\\xy_1+x_1y&=\dfrac{n}{ab}\end{aligned}\\\because&\ x,y,x_1,y_1\in\mathbb{Z}\\\therefore&\ xy_1+x_1y\in\mathbb{Z}\\\therefore&\ \dfrac{n}{ab}\in\mathbb{Z}\\\therefore&\ ab\mid n\end{aligned}
1.2.5. 性质5
若 b=dq+c,q\in\mathbb{Z} ,那么 d\mid b 的充要条件为 d\mid c
证明1(若 d\mid b ,则 d\mid c ):
\begin{aligned}\because&\ d\mid b\\&\text{令}dk=b(k\in\mathbb{Z},k\ne0)\\\therefore&\ b=dq+c\Longleftrightarrow dk=dq+c\\\therefore&\ d\mid c\end{aligned}
证明2(若 d\mid c ,则 d\mid b ):
\begin{aligned}\because&\ d\mid c\\&\text{令}dk=c(k\in\mathbb{Z},k\ne0)\\\therefore&\ b=dq+c\Longleftrightarrow b=d(p+k)\\\therefore&\ d\mid b\end{aligned}
2. 模运算
2.1. 定义
定义:有 \forall\ a,b\in\mathbb{Z},b\ne0 ,求 a\div b 的余数,称 a 模 b ,记作 a\bmod b
2.2. 性质
2.2.1. 性质1
(a+b)\bmod c=(a\bmod c+b\bmod c)\bmod c
2.2.2. 性质2
(a-b)\bmod c=(a\bmod c-b\bmod c)\bmod c
2.2.3. 性质3
(ab)\bmod c=[\ (a\bmod c)\times(b\bmod c)\ ]\bmod c
证明:
\begin{aligned}\text{设}&a\bmod c=m_a,b\bmod c=m_b(m_a,m_b\in\mathbb{Z})\\
\because&\ a\bmod c=m_a,b\bmod c=m_b\\
\text{令}&a=m_a+xs_a,b=m_b+cs_b(s_a,s_b\in\mathbb{Z})\\
&\begin{aligned}(ab)\bmod c&=[\ (m_a+cs_a)(m_b+cs_b)\ ]\bmod c\\&=(m_am_b+cm_as_b+cm_bs_a+c^2s_as_b)\bmod c\\&=(m_am_b)\bmod c\\&=[\ (a\bmod c)\times(b\bmod c)\ ]\bmod c\end{aligned}\end{aligned}
2.2.4. 性质4
属于性质三的一种扩展
(a^b)\bmod c=(a\bmod c)^b\bmod c
2.2.5. 性质5
如果 a\bmod b=c,d\ne0,d\in\mathbb{Z} ,则 (ad)\bmod(bd)=cd
证明:
\begin{aligned}\because&\ a\bmod b=c\\&\text{设}bx+c=a(x\in\mathbb{Z})\\\therefore&\ bx+c=a\Longleftrightarrow bdx+cd=ad\\\therefore&\ (ad)\bmod(bd)=cd\end{aligned}
2.2.6. 性质6
如果 a\bmod b=c,d\mid a,d\mid b ,则 (\dfrac{a}{d})\bmod(\dfrac{b}{d})=\dfrac{c}{d}
证明:
\begin{aligned}\because&\ a\bmod b=c\\&\text{设}bx+c=a(x\in\mathbb{Z})\\\therefore&\ bx+c=a\Longleftrightarrow \dfrac{b}{d}x+\dfrac{c}{d}=\dfrac{a}{d}\\\therefore&\ (\dfrac{a}{d})\bmod(\dfrac{b}{d})=\dfrac{c}{d}\end{aligned}
3. 同余
3.1. 定义
设 m 是给定的 \mathbb{Z}^+ ,若满足 m\mid(a-b) ,则称 a 与 b 对模 m 同余,记作 a\equiv b\pmod{m} ;若满足 m\nmid(a-b) ,则称 a 与 b 对模 m 不同余
如果将定义反过来,如果 a\equiv b\pmod{m} ,则 m\mid(a-b) (即 a\equiv b\pmod{m}\iff m\mid(a-b) )
证明1(已知 m\mid(a-b) ):
\begin{aligned}\because&\ m\mid(a-b)\\&\text{令}mk=a-b(k\in\mathbb{Z},k\ne0)\\\therefore&\ mk=a-b\Longleftrightarrow mk+b=a\Longleftrightarrow b\bmod m=a\bmod m\\\therefore&\ a\equiv b\pmod{m}\end{aligned}
证明2(已知 a\equiv b\pmod{m} ):
\begin{aligned}\because&\ a\equiv b\pmod{m}\\\therefore&\ a\bmod m=b\bmod m\\&\text{令}mx+k=a,my+k=b(x,y,k\in\mathbb{Z})\\&\begin{aligned}a-b&=mx+k-my-k\\&=m(x-y)\\\end{aligned}\\\because&\ m\mid m(x-y)\\\therefore&\ m\mid(a-b)\end{aligned}
3.2. 性质
3.2.1. 性质1
a\equiv a\pmod{m}
3.2.2. 性质2
如果 a\equiv b\pmod{m} ,那么 b\equiv a\pmod{m}
3.2.3. 性质3
如果 a\equiv b\pmod{m} , b\equiv c\pmod{m} ,那么 a\equiv c\pmod{m}
3.2.4. 性质4
如果 a\equiv b\pmod{m} ,那么 (a+c)\equiv(b+c)\pmod{m}
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\&\begin{aligned}mk&=a-b\\&=a+c-b-c\\&=(a+c)-(b+c)\end{aligned}\\\therefore&\ (a+c)\equiv(b+c)\pmod{m}\end{aligned}
3.2.5. 性质5
如果 a\equiv b\pmod{m} ,那么 (a-c)\equiv(b-c)\pmod{m}
证明方法类似于性质3
3.2.6. 性质6
如果 a\equiv b\pmod{m} ,那么 (ac)\equiv(bc)\pmod{m}
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\therefore&\ mk=a-b\Longleftrightarrow mkc=ac-bc\\\therefore&\ (ac)\equiv(bc)\pmod{m}\end{aligned}
3.2.7. 性质7
如果 a\equiv b\pmod{m},c\mid a,c\mid b,(c,m)=1 ,那么 (\dfrac{a}{c})\equiv(\dfrac{b}{c})\pmod{m}
多说一句: (a,b)=\gcd(a,b)
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\therefore&\ mk=a-b\Longleftrightarrow m\dfrac{k}{c}&=\dfrac{a}{c}-\dfrac{b}{c}\\\because&\ c\mid a,c\mid b\\\therefore&\ \dfrac{a}{c},\dfrac{b}{c}\in\mathbb{Z}\\\therefore&\ \dfrac{mk}{c}\in\mathbb{Z}\\\because&\ (c,m)=1\\\therefore&\ \dfrac{m}{c}\not\in\mathbb{Z}\\\therefore&\ \dfrac{k}{c}\in\mathbb{Z}\\\therefore&\ \dfrac{a}{c}\equiv\dfrac{b}{c}\pmod{m}\end{aligned}
3.2.8. 性质8
如果 a\equiv b\pmod{m} ,那么 (a^c)\equiv(b^c)\pmod{m}
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m}\\&\text{令}mk=a-b(k\in\mathtt{Z})\\\\&\begin{aligned}mk&=a-b\\mk\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}&=(a-b)\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}\\mk\times\sum\limits_{i=0}^{c-1}a^ib^{c-i-1}&=a^c-b^c\end{aligned}\\\\\therefore&\ (a^c)\equiv(b^c)\pmod{m}\end{aligned}
另注: a^n-b^n=(a-b)\times\sum\limits_{i=0}^{n-1}a^ib^{n-i-1}
3.2.9. 性质9
如果 a\equiv b\pmod{m},c\equiv d\pmod{m} ,那么 (a+c)\equiv (b+d)\pmod{m}
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m},c\equiv d\pmod{m}\\&\text{令}mx=a-b,my=c-d(x,y\in\mathtt{Z})\\&\begin{aligned}mx+my&=a-b+c-d\\m(x+y)&=a+c-(b+d)\end{aligned}\\\therefore&\ (a+c)\equiv(b+d)\pmod{m}\end{aligned}
3.2.10. 性质10
如果 a\equiv b\pmod{m},c\equiv d\pmod{m} ,那么 (ac)\equiv (bd)\pmod{m}
证明:
\begin{aligned}\because&\ a\equiv b\pmod{m},c\equiv d\pmod{m}\\&\text{令}mx=a-b,my=c-d(x,y\in\mathtt{Z})\\\because&\ mx=a-b,my=c-d\\\therefore&\ mxc=ac-bc,myb=bc-cd\\\therefore&\ mxc+myb=ac-bc+bc-cd\Longleftrightarrow m(xc+yb)=ac-bd
\\\therefore&\ (ac)\equiv(bd)\pmod{m}\end{aligned}
3.2.11. 性质11
如果 a\bmod p=x,a\bmod q=x,(p,q)=1 ,那么 a\bmod (pq)=x
证明:
\begin{aligned}\because&\ a\bmod p=x,a\bmod q=x\\&\text{令}pk_1+x=a,qk_2+x=a(k_1,k_2\in\mathbb{Z})\\\therefore&\ pk_1+x=qk_2+x\\\therefore&\ \dfrac{pk_1}{q}=k_2\\\because&\ k_2\in\mathbb{Z}\\\therefore&\ \dfrac{pk_1}{q}\in\mathbb{Z}\\\because&\ (p,q)=1\\\therefore&\ \dfrac{p}{q}\not\in\mathbb{Z}\\\therefore&\ \dfrac{k_1}{q}\in\mathbb{Z}\\\therefore&\ qk_3=k_1\\\therefore&\ pk_1+x=a\Longleftrightarrow pqk_3+x=a\\\therefore&\ a\bmod(pq)=x\end{aligned}
4. 排列组合
咕咕咕
5. 筛法
5.1. 暴力筛
暴力筛,顾名思义,非常暴力的筛法(?
暴力筛是所有筛法的祖先 ,需要好好掌握
我们知道,一个数的倍数是一个合数 ,那么,我们可以进行一个遍历,将每一个数的倍数全部标记一遍,剩下的未被标记的就是质数了
#include<cmath>
#include<cstdio>
bool flag[200000005];
int n,ans,maxn; //ans 用于统计质数数量, maxn 用于记录最大质数
int main(){
scanf("%d",&n);
for(int i=2;i<=sqrt(n);i++){ //只需枚举到 sqrt(n) 即可
//原理很简单,假设 n=pq(p<q) ,那么,我们一定会在 p 之前的 q 枚举,而 p 的最大值又是 sqrt(n) ,所以枚举到 sqrt(n) 即可
if(!flag[i]){ //未被标记,说明是质数
ans++,maxn=i; //更新数量和最大值
}
for(int j=i+i;j<=n;j+=i){ //将其倍数设为合数
flag[j]=1;
}
}
for(int i=sqrt(n)+1;i<=n;i++){ //因为遍历到 sqrt(n) 就结束了,后面的素数还要再来一个循环统计一次
if(!flag[i]){
ans++;
maxn=i;
}
}
printf("%d %d",ans,maxn);
return 0;
}
然而,这显然不是最优筛法
5.2. 埃式筛
我们发现,假设一个合数 n 的其中一个质因子为 k ,那么 n=kx , n 与其倍数必然已经在遍历到 k 的时候标记了,就不用再筛一遍了
所以,我们可以只用筛素数的倍数即可
#include<cmath>
#include<cstdio>
bool flag[200000005];
int n,ans,maxn;
int main(){
scanf("%d",&n);
for(int i=2;i<=sqrt(n);i++){
if(!flag[i]){
ans++;
maxn=i;
}
if(flag[i]){ //当遍历到素数时,直接跳过,不进行遍历,剩下的和暴力筛一模一样
continue;
}
for(int j=i+i;j<=n;j+=i){
flag[j]=1;
}
}
for(int i=sqrt(n)+1;i<=n;i++){
if(!flag[i]){
ans++;
maxn=i;
}
}
printf("%d %d",ans,maxn);
return 0;
}
埃式筛已经够快了,但是,我们还有一个更快的解决方法
5.3. 欧拉筛
在埃式筛中,某些数依旧会被重复标记两次,比如 12 ,既会被 3 标记,也会被 2 标记
这时,我们尽量让每个数只被标记一次
而欧拉筛的原理是让每一个数被它的最小质因数 标记
这里先上代码
#include<cstdio>
bool flag[200000005];
int n,ans,maxn;
int num[1500005],len; //num 数组用于统计素数数组
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(!flag[i]){ //遍历到素数
num[++len]=i,ans++,maxn=i;
}
for(int j=1;j<=len&&num[j]*i<=n;j++){ //枚举可能的最小质因数
flag[num[j]*i]=1; //标记
if(i%num[j]==0){ //后文会有详细解释
break;
}
}
}
printf("%d %d",ans,maxn);
return 0;
}
这里解释一下这一段代码:
if(i%num[j]==0){
break;
}
\begin{aligned}&\text{假设}\ num[\ j\ ]=k\\\because&\ k\mid i\\\therefore&\ i=kx(x\in\mathbb{Z}^+)\\&\text{当枚举到}\ num[\ j+1\ ]=k_1\ \text{时}\\&ik_1=kxk_1\\\because&\ k<k_1\\\therefore&\ k_1\ \text{不是最小质因数}\end{aligned}
显然,这样已经违背了欧拉筛的原理,所以退出
6. gcd/lcm
6.1. 定义
公约数定义:一般设有 k 个数 a_1,a_2,a_3,\cdots,a_k\in\mathbb{Z}^+ ,如果 \exists d\in\mathbb{Z}^+ ,使 d\mid a_1,d\mid a_2,d\mid a_3,\cdots,d\mid a_k ,那么 d 为 a_1,a_2,a_3,\cdots,a_k 的公约数, d 是不唯一的
最大公约数:在 a_1,a_2,a_3,\cdots,a_k 的公约数集合中,最大的那个公约数称为最大公约数,如果是 a,b 两个元素的最大公约数,记为 \gcd(a,b) ,简写为 (a,b)
公因数与最小公因数的定义与公约数与最大公约数的定义类似,注意一下符号即可:
a,b$ 两个元素的最小公因数记为 $\operatorname{lcm}(a,b)$ ,简写为 $[a,b]
6.2. 一个定理
\gcd(a,b)\times\operatorname{lcm}(a,b)=ab
证明:
\begin{aligned}&\text{将}a,b\text{进行质因子分解,设其质因子集合并集为}\{p_1,p_2,\cdots,p_n\}
\\&\text{设}a=p_1^{k_1}p_1^{k_2}\cdots p_n^{k_n},b=p_1^{j_1}p_1^{j_2}\cdots p_n^{j_n}(j_i,k_i\in\mathbb{Z},j_i\ge0,k_i\ge0)\\&\because\ \gcd(a,b)=p_1^{\min(k_1,j_1)}p_2^{\min(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)}\\&\operatorname{lcm}(a,b)=p_1^{\max(k_1,j_1)}p_2^{\max(k_2,j_2)}\cdots p_n^{\max(k_n,j_n)}\\&\min(a,b)+\operatorname{lcm}(a,b)=a+b\\&\ \begin{aligned}\therefore\gcd(a,b)\times\operatorname{lcm}(a,b)&=p_1^{\min(k_1,j_1)}p_2^{\min(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)}p_1^{\max(k_1,j_1)}p_2^{\max(k_2,j_2)}\cdots p_n^{\max(k_n,j_n)}\\&=p_1^{\min(k_1,j_1)+\max(k_1,j_1)}p_2^{\min(k_2,j_2)+\max(k_2,j_2)}\cdots p_n^{\min(k_n,j_n)+\max(k_n,j_n)}\\&=p_1^{k_1+j_1}p_2^{k_2+j_2}\cdots p_n^{k_n+j_n}\\&=p_1^{k_1}p_1^{k_2}\cdots p_n^{k_n}p_1^{j_1}p_1^{j_2}\cdots p_n^{j_n}\\&=ab\end{aligned}\end{aligned}
6.3. 欧几里得算法
一种非常常见的求最大公约数的算法:
\gcd(a,b)=\gcd(b,a\bmod b)
代码形式:
#include<cstdio>
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
printf("%d",gcd(n,m));
return 0;
}
//非常简单,应该不用注释了吧
证明一下:
\begin{aligned}&\text{设}\gcd(a,b)=p\\\therefore&\ a=kp,b=gp(\gcd(k,g)=1)\\\therefore&\ a\bmod b=(kp)\bmod(gp)=(k\bmod g)p\\&\begin{aligned}\gcd(b,a\bmod b)&=\gcd(gp,(k\bmod g)p)\\&=p\\&=\gcd(a,b)\end{aligned}\end{aligned}
7. 裴蜀定理
这是一个非常常见的定理,相当重要
7.1. 基本定理
对于不定方程 ax+by=m(a,b,x,y,m\in\mathbb{Z}) ,其有解的充分必要条件为 \gcd(a,b)\mid m
证明1(已知 ax+by=m 有解):
\begin{aligned}\because&\ ax+by=m\text{有解}\\\therefore&\ \exists\ x,y\in\mathbb{Z},\text{满足}ax+by=m\\\because&\ \gcd(a,b)\mid a,\gcd(a,b)\mid b\\\therefore&\ \gcd(a,b)\mid (ax+by)(\text{整除性质2})\\\therefore&\ \gcd(a,b)\mid m\end{aligned}
证明2(已知 \gcd(a,b)\mid m ):
咕咕咕
OI 中常见的有关裴蜀定理的出题形式(?
对于 \forall x,y\in\mathbb{Z} ,函数 \operatorname{f}(a,b)=ax+by 的最小 \mathbb{Z}^+ 的取值为 \gcd(a,b)
证明:
\begin{aligned}&\text{设}\ m=ax+by\\&\text{由裴蜀定理得:}\ \gcd(a,b)k=m(k\in\mathbb{Z}^+)\\\because&\ k\ \text{的最小值为}\ 1,\gcd(a,b)\ \text{为定值}\\\therefore&\ m\ \text{的最小值为}\ \gcd(a,b)\end{aligned}
7.2. 引理及推论
7.2.1. 引理1
上台社死后我发现,我换一个表述方式似乎就没什么大问题了QAQ
如果 a,b\in\mathbb{Z}^+,(a,b)=1 ,则 \nexists 小于 b 的 k\in\mathbb{Z}^+ ,满足 b\mid ak
证明:
\begin{aligned}&\text{假设存在小于}\ b\ \text{的}\ k\in\mathbb{Z},\text{满足}b\mid ak\\\therefore&\ ak\ \text{中包含}\ b\ \text{的全部质因子}\\\because&\ (a,b)=1\\\therefore&\ a\ \text{不可能包含}
b\ \text{的任何质因子}\\\therefore&\ k\ \text{中包含}\ b\ \text{的全部质因子}\\\therefore&\ k=bx(x\in\mathbb{Z}^+)\\\because&\ b>k\\\therefore&\ \text{矛盾,假设不成立}\end{aligned}
7.2.2. 推论
如果 a,b\in\mathbb{Z}^+,(a,b)=1 ,则 0,a,2a,\cdots,(b-1)a 这些数模 b 的余数互不相同
证明:
\begin{aligned}&\text{假设}\ ai,aj\ \text{模}\ b\ \text{的余数相同}\ (1<j<i<b)\ \text{,即}\ ai\bmod b=aj\bmod b\\\therefore&\ ai\bmod b-aj\bmod b=0\Longleftrightarrow (ai-aj)\bmod b=0\Longleftrightarrow a(i-j)\bmod b=0\\\therefore&\ b\mid a(i-j)(i-j<b)\\\because&\ a,b\in\mathbb{Z}^+,(a,b)=1\\\therefore&\ \nexists\ \text{小于}\ b\ \text{的}\ k\in\mathbb{Z}^+\ \text{,满足}\ b\mid ak\\\therefore&\ \text{矛盾,假设不成立}\end{aligned}
7.2.3. 引理2
如果 (a,b)=1 ,则 \exists\ k\in\mathbb{Z} ,满足 ak\bmod b=1
由推论可以很容易的得到该结论
8. 扩展欧几里得
扩展欧几里得(简称扩欧),是一种算法,一般封装为函数,其函数名为 exgcd
可以在已知 a,b\in\mathbb{Z} 的情况下,求不定方程 ax+by=\gcd(a,b) 的一组整数解,通常情况下用扩欧求得的解满足 xy<0
证明:
\begin{aligned}&\text{设}\ ax_1+by_1=\gcd(a,b),bx_2+(a\bmod b)y_2=\gcd(b,a\bmod b)\\&\text{由欧几里得算法得}\ \gcd(a,b)=\gcd(b,a\bmod b)\\\therefore&\ ax_1+by_1=bx_2+(a\bmod b)y_2\\\because&\ a\bmod b=a-b\left\lfloor\dfrac{a}{b}\right\rfloor\\&\begin{aligned}ax_1+by_1&=bx_2+(a\bmod b)y_2\\&=bx_2+(a-b\left\lfloor\dfrac{a}{b}\right\rfloor)y_2\\&=bx_2+ay_2-b\left\lfloor\dfrac{a}{b}\right\rfloor y_2\\&=ay_2+b(x_2-b\left\lfloor\dfrac{a}{b}\right\rfloor)\end{aligned}\\\therefore&\ \begin{cases}x_1=y_2\\y_1=x_2-b\left\lfloor\dfrac{a}{b}\right\rfloor\\\end{cases}\ \text{是方程}\ ax_1+by_1=\gcd(a,b)\ \text{的一组解,且该组解由}\ (x_2,y_2)\ \text{得来}\\&\text{当第}\ n\ \text{组方程关于}\ \gcd(a,0)\ \text{时,有}\ ax_n+by_n=a\\\therefore&\ \begin{cases}x_n=1\\y_n=\forall \ k\in\mathbb{Z}\end{cases}\ \text{是方程}\ ax_n+by_n=a\ \text{的一组解}\\\therefore&\ \text{可以由解}\ (x_n,y_n)\ \text{得到解}\ (x_1,y_1)\end{aligned}
我们拿这道题来举个例子
8.1. 小练习
我们来处理一下原方程:
\begin{aligned}ax&\equiv1\pmod{b}\\by+1&=ax(y\in\mathbb{Z})\\ax-by&=1\end{aligned}
这样一来,直接套扩欧,再处理一下取值,基本上就没问题了
不 开 long long 见 祖 宗
#include<cstdio>
long long int a,b,c,x,y;
void exgcd(long long int a,long long int b){ //扩欧模板
if(!b){
x=1,y=0;
return;
}
exgcd(b,a%b);
long long int t=x;
x=y;
y=t-a/b*y;
}
int main(){
scanf("%lld%lld",&a,&b);
exgcd(a,b);
if(x<0){ //处理结果,保证是最小的正整数
x=x+(-x/b+1)*b;
}else{
x=x-x/b*b;
}
printf("%lld",x); //输出
return 0;
}
//水
9. 费马小定理
如果 p 为质数,且 a\bmod p\ne0 ,则 a^{p-1}\bmod p=1
证明:
\begin{aligned}\because&\ a(2a)(3a)\cdots[(p-1)a]\bmod p=a^{p-1}\times(p-1)!\bmod p\\\text{又}\ \because&\ p\ \text{为质数,且}\ a\bmod p\ne0\\\therefore&\ \text{由裴蜀定理推论得:}\ a\bmod p,(2a)\bmod p,(3a)\bmod p,\cdots,[(p-1)a]\bmod p\ \text{互不相等,且在区间}\ (0,p)\ \text{内}\\\therefore&\ a(2a)(3a)\cdots[(p-1)a]\bmod p=(p-1)!\bmod p\\\therefore&\ a^{p-1}(p-1)!\equiv(p-1)!\pmod{p}\\\because&\ p\ \text{为质数}\\\therefore&\ ((p-1)!,p)=1\\\therefore&\ a^{p-1}\equiv1\pmod{p}\end{aligned}