简单数论学习笔记
简单数论学习笔记
整除
当\(a=bk\),且\(a,b,k\)均为整数时,称为b整除a,记为\(b|a\)
b为除数,a为被除数。
质数与合数
质数与合数的定义不再赘述。
不大于\(n\)的质数约有\(\frac{n}{\ln n}\)个
带余除法、同余
\(a\equiv b\pmod c\),表示\(a\%c=b\%c\)
性质:\(a\equiv b\pmod c\)与\(c|(a-b)\)等价
推论:若\(a\equiv b \pmod c,d|c\),则\(a\equiv b \pmod d\)
GCD
一些性质:\((0,a)=a,(a,b)=(a,a+b)=(a,ka+b)\)
第一条性质:由于任何数都整除\(0\),所以任何数都是\(0\)的约数,由此易得。
第二条性质:由\(c|a,c|b \Leftrightarrow c|(a+b)\) ,易得。
由此可以证明欧几里得算法的正确性,即\((a,b)=(a,b\%a)\)
EXGCD
用于求解形如\(ax+by=k\)的不定方程。
方程有解当且仅当\((a,b)|k\)。
示例:EXGCD证明裴蜀定理
求解:\(ax+by=d\quad\)
可以得到\(a=kb+r(r\le b)\),根据欧几里得算法\((a,b)=(b,a\%b)=(b,r)\),且在算法的最后一定会得到\((d,0)=d\)
\(dx+0y=d\)显然有解\(x=1,y=0\)
因此必然存在一组解,使\(ax+by=(a,b)\)成立。
当然,这个过程也得出了EXGCD的递归模式。
对于求不定方程多组解的问题,我们通常使用这样的方法:
首先用EXGCD求出一个特殊解\(x_0,y_0\),然后构造出\(ax+by=0\)的通解,也就是\(x=\frac{b}{(a,b)},y=\frac{-a}{(a,b)}\)
然后令\(x=x_0+\frac{b}{(a,b)},y=y_0-\frac{a}{(a,b)}\)
由于一个数(模数小于该数)取模之后至多为原来的一半,所以时间复杂度为\(O(\log_2n)\)
例题
题意大致为\((a,b)=1\quad\forall x,y\in N,ax+by\)不能表示的最大数值。
假设这个数为\(k-1\),那么显然我们可以构造出\(①:ax+by=k\)。
根据题意可以得到\(②:ax_0+by_0=1\),显然此时\(x_0,y_0\)不可能同号。假设\(x_{min},y_{min}\)为\(ax+by=1\)中\(x,y\)分别最小的非负整数解。
\(①-②\)得\(a(x-x_0)+b(y-y_0)=k-1\),根据裴蜀定理,此方程必定有解。又从题目条件推导,可以得到\(x-x_0<0或y-y_0<0\)
若\(x_0=x_{min}\),此时对应的\(y_0\)为负数,所以\(y-y_0>0\),由此可以得到\(x-x_{min}<0\)
同理可以得到\(y-y_{min}<0\)。
同时符合两个约束的时候的时候,此时的\(k-1\)是不合法的。
在仅符合一个约束时,若仅符合第一个约束,则有\(y-y_{min}\geq0\)那么当\(y=y_{min}\)时,\(x-x_0>0\),不合题意。
由于我们要寻求最大值的\(k\),所以\(x,y\)尽可能大,所以\(x=x_{min}-1,y=y_{min}-1\)。
逆元
若\(ax\equiv 1 \pmod b\),则称\(x\)是\(a\)关于模\(b\)的逆元,记作\(a^{-1}\)
在高中与初中的数学中,我们把这样具有类似这种性质的数称之为倒数。
事实上,它们的意义是相似的,可以将除法运算转化为乘法运算,便于求余。
在上述式子中,\(\frac{c}{a}=c*x\)。
可以发现上述式子等价于\(ax+by=1\Leftrightarrow(a,b)=1\quad\),直接利用EXGCD求解即可。
通常模数\(p\)为质数。
当我们要求\([1,n]\)的逆元时,当\(n\)足够大时,EXGCD就显得不太够用了。
对于这样的问题我们有如下公式推导:
假定我们要求\(i\)的逆元,模数为\(p\)(\(p\)为质数)。
显然可以得到\(p=ki+r\),因为\(p\)为质数,所以\(r!=0\),即存在\(r\)的逆元。
线性同余方程
形如\(ax\equiv c \pmod b\),称为线性同余方程。
等价于\(ax+by=c\),有解条件为\((a,b)|c\)
对于线性同余方程组,有一种可行的解法:
设\(x=3a+2\),代入第二条得到\(3a+2\equiv 3 \pmod 5\),解得\(a\equiv 2 \pmod 5\)。设\(a=5b+2\),代入第三条得到\(3(5b+2)+2\equiv 5 \pmod 7\),显然有\(b\equiv 4\pmod 7\)
最后代回\(x=3a+2\)即可得到\(x\)在模\(105\)意义下的唯一解。
中国剩余定理
对于模数两两互质的线性同余方程组,如
其中\(m_1,m_2,...,m_n\)两两互质,定理给出了构造解的方法。
设\(M=\prod_{i=1}^{n}m_i,M_i=\frac{M}{m_i}\)。
显然\(M_i\)与\(m_i\)互质,存在\(M_i\)在模\(m_i\)意义下的逆元\(t_i\)且\(\forall j!=i,M_i\equiv0 \pmod {m_j}\)
此时有解\(x\equiv \sum_{i=1}^n a_iM_it_i \pmod M\)
可以自行验证。
卢卡斯定理
对于组合数取模问题,有卢卡斯定理:
证明:不会
预处理出阶乘和逆元,直接利用上述式子递归求解即可。
注意边界条件:
1.当\(m<n\),有\(C(m,n)=0\)。
2.当\(n=0\),有\(C(m,n)=1\)。
欧拉函数
欧拉函数\(\varphi(n)\)表示区间\([1,n]\)与\(n\)互质的数的个数。
推论:
- 若\(n\)为质数,则\(\varphi(n)=n-1\)。
- 当\(n\geq3\),则\(\varphi(n)\)为偶数。
- 欧拉函数是积性函数,当\(gcd(a,b)=1\),有\(\varphi(a*b)=\varphi(a)*\varphi(b)\)
- 若\(n=p^k\),\(p\)为质数,则有\(\varphi(n)=n(1-1 / p)\)
- 基于性质4,可以推导出:若\(n\)有\(k\)个不同的质因子,分别为:\(p_1,p_2,p_3...p_k\),那么\(\varphi(n)=n(1-1/p_1)(1-1/p_2)(1-1/p_3)...(1-1/p_k)\)
性质1不证自明。
性质2只需要证明若\((a,n)=1\),则\((n-a,a)=1\)。反证法易得。
性质3证明如下:
定义集合\(A(n)=\{x|x\in [1,n],(x,n)=1\}\)。
在\(A(a)\)和\(A(b)\)中任取两个元素\(a_0\),\(b_0\),构造线性同余方程组\(\{x\equiv a_0 \pmod a,x\equiv b_0 \pmod b\}\),利用中国剩余定理构造出一个唯一对应的元素\(x\equiv c \pmod {ab}\)。
显然有\((c,a)=(a,c\%a)=(a,a_0)=1\),同理有\((c,b)=1\),则说明\((a_0,b_0)\)对应唯一的元素\(c \in A(ab)\)。
反之任取\(A(ab)\)的一个元素\(c\),可以构造出\(a_0=c\%a,b_0=c\%b\)。
显然有\((c,a)=(c,b)=1\),所以有\((a,a_0)=(b,b_0)=1\)。也就是说\(A(ab)\)中的任意一个元素对应一组有序实数对\((a_0,b_0)\),其中\(a_0\in A(a),b_0\in A(b)\)。
综上所述,\(A(a),A(b)\)的笛卡尔积(直积)与\(A(ab)\)构成双射。
于是命题得证。
性质4证明如下:\(\forall x \in[1,n]\),如果有\((n,x)>1\),则显然有\(p|x\),可以得到这样的\(x\)有\(n/p\)个,那么剩下的数就有\(n-n/p\),所以\(\varphi(n)=n(1-1/p)\)
性质5证明如下:将\(n\)分解质因数,套用性质4和性质3,即可证明。
笛卡尔积
又称直积,集合\(A,B\)的笛卡尔积为集合\(\{(a,b)|a\in A,b\in B\}\)
欧拉定理
若\((a,n)=1\),则\(a^{\varphi(n)}\equiv 1 \pmod n\)。
若\(n\)为质数,则有\(a^{n-1}\equiv 1 \pmod n\),即费马小定理。
证明:待填坑
欧拉定理求逆元
\(a*a^{\varphi(n)-1}\equiv1\pmod n\)
利用快速幂求解即可。
欧拉定理缩小指数
求\(a^b\mod p\)时,如果\((a,p)=1\),则可以得到\(a^{\varphi(p)}\equiv1\pmod p\),所以\(a^b\equiv a^{b\mod\varphi(p)}\mod p\)
拓展欧拉定理
\(a^{2\varphi(n)}\equiv a^{\varphi(n)} \pmod n\)
求\(a^b\mod p\)时,若\(b\geq\varphi(p)\),则\(a^b\equiv a^{b\mod \varphi(p)+\varphi(p)}\pmod p\)
欧拉函数的求法1(质因数分解,只求单个)
int phi(int n)
{
int ret=n;
for (int i=2;i*i<=n;i++)
{
if (n%i==0)
{
while(n%i==0) n/=i;
ret=ret/i*(i-1);//相当于*(1-1/p)
}
}
if (n>1) ret=ret/n*(n-1);
return ret;
}
时间复杂度:\(O(\sqrt n)\)
欧拉函数的求法2(线性筛法,求出1~n)
int phi(int n)
{
for (int i=2;i<=n;i++)
{
if (v[i]==0)
{
v[i]=i;
rec[++cnt]=i;
phi[i]=i-1;//p为质数时,phi(p)=p-1
}
for (int j=1;j<=cnt;j++)
{
if (rec[j]>v[i]||rec[j]>n/i) break;
v[i*rec[j]]=rec[j];
if (i%rec[j]!=0) phi[i*rec[j]]=phi[i]*phi[rec[j]];//符合积性函数的条件
else phi[i*rec[j]]=phi[i]*rec[j];//详细见下面的分析
}
}
}
众所周知:当\(p\)为质数时\(\varphi(p^k)=p^k(1-1/p)\)。(证明上面有)
那么\(\varphi(p^{k-1})=p^{k-1}(1-1/p)\),两边同时乘\(p\),得到:\(p*\varphi(p^{k-1})=p^k(1-1/p)\)。
由上可得,\(\varphi(p^k)=p*\varphi(p^{k-1})\)。
如果\(i \mod p=0\)且\(p\)为质数,意味着\(i=p^k\)或者\(i=p^k*q\)。
若\(i=p^k\),则\(\varphi(i)=p*\varphi(p^{k-1})\),此时\(p^{k-1}\)就是我们当前的合数,即程序中的第一重循环。
若\(i=p^k*q\),则\(\varphi(i)=p*\varphi(p^{k-1})*\varphi(q)=p*\varphi(p^{k-1}*q)\),可以发现此时\(p^{k-1}*q\),也是我们当前的合数。
那么程序中的语句就分析完毕了。
时间复杂度:\(O(n)\)。