数论基础
欢迎收看大型连载电视剧——数论基础。
导读:快速幂取模、欧式筛法、裴蜀定理(贝祖定理)、威尔逊定理、费马定理、欧拉函数、欧拉定理、区间逆元(鸽一下)、(扩展)中国剩余定理、约数和定理、Lucas 定理。
快速幂取模
求\(a^b \% p\)我们有时间复杂度\(O(b)\)的办法。但数据规模放大时,我们的显示界面难免会出现一个老熟人 TLE,我们需要更快的方法。
根据初中数学,\(a^b\)可以化为\((a^2)^\frac{b}{2}*a^{b\%2}\),也就是我们把底数\(a\)平方一次,指数\(b\)就缩小了一半(指数\(b\)是奇数时答案要多乘一个这时的\(a\),因为\(b\)除不尽\(2\)),那么我们使\(a=a^2\)后再进行上述操作,便可使\(b\)快速缩小,在\(O(log_2 b)\)的时间求解。
CODE
ll ksm(ll a, ll b, ll p) {
ll ans = 1;
while (b) {
if (b & 1)//相当于b%2==1,即b为奇数的情况
ans *= a;
a *= a;//将a平方
a %= p;
ans %= p;
b /= 2;
}
return ans;
}
欧式筛法
埃式筛法已经可以做到很优秀的时间复杂度\(O(nlogn)\),但当\(n\)上升到\(10^7\)以上(参考惨痛的GDKOI2023普及组Day1的T1),我们就需要更快的做法。
先将\(2\)加入质数集合\(P\),然后从2开始枚举倍数\(a\),将倍数和我们的每一个集合\(P\)中的每一个质数相乘并打上标记。当枚举\(a\)时,\(a\)没有打上标记则\(a\)为质数,将\(a\)加入质数集合\(P\)。
优化。枚举集合\(P\)中的数时,如果\(a\)是\(p_i\)的倍数,则可以退出枚举集合\(P\)的循环。因为后续质数\(p_{i'}*a\)也一定是\(p_i\)的倍数,当\(a\)变大过程中,必有\(p_i*a'=p_{i'}*a\)(\(p_{i'}*a\)是\(p_i\)的一个倍数)。这样做可以保证每一个质数被他最小的质因子打上一次标记。
显而易见时间复杂度为\(O(n)\)
for (int i = 2; i <= n - 1; i++)
{
if (vis[i] == 0)
prim[++cnt] = i;
for (int j = 1; j <= cnt; j++)
{
if (prim[j] * i > n)
break;
vis[i * prim[j]] = 1;
if (i % prim[j] == 0)
break;
}
}
裴蜀定理(贝祖定理)
它不重要,但他的证明过程却被经常使用,简称:反客为主。
如果\(a\)和\(b\)的最大公约数为\(d\)且\(d\)整除\(c\),那么有\(ax+by=c\)
证明:
令\(a'=a/d\),\(b'=b/d\),可以证明\(a'x+b'y=1\)。
则
即
引理一:如果\(a\)和\(b\)为正整数且\(gcd(a,b)=1\),则不存在整数\(k\)(\(0 \lt k \lt b\))使得\(k*a \% b=0\)。
证明:用反证法,因为\(a*k \% b=0\),所以\(a*k\)包含了\(b\)中所有质因子。因为\(gcd(a,b)=1\),所以\(k\)为\(b\)的倍数。但\(k \lt b\),所以\(k\)不为\(b\)的倍数。产生了矛盾,得证。
推论:如果\(a,b\)为正整数,\(gcd(a,b)=1\)。\(0*a,1*a,2*a,...,(b-1)*a\)模\(b\)各不相同。
证明:用反证法,若\(i*a \% b=j*a \% b\)则\((i-j)*a \% b=0\)。因为\(0 \lt i,j \lt b\),设\(j \lt i\),则\(0 \lt i-j \lt b\),与引理一矛盾,得证。
引理二:如果\(gcd(a,b)=1\),则有且仅有一个整数\(k(k < b)\),使得\(k*a \% b=1\)
证明:根据推论\(k*a \% b\)的结果只能是集合\({0,1,...,b-1}\)中的数。又因为集合中的数个不相等且有\(b\)个,其中肯定有\(1\)个为\(1\)。
根据引理二,裴蜀定理得证。
威尔逊定理
这个威尔就是逊了……
\((p-1)! \equiv -1 \mod p\),当且仅当\(p\)为质数。
证明:
先证明充分性:
即\(p\)为质数\(\rightarrow (p - 1)! \equiv -1 \mod p\)
设\(0 \lt i \lt p\),由裴蜀定理引理2可知\(i\)的逆元(\(1 \lt x \lt p\))具有唯一性,现在来讨论\(i^2 \equiv 1 \mod p\)。
由
得
移项得:
根据小学的平方差公式得:
由于\(p\)是质数,那么\(i + 1\)为\(p\)的质数或\(i - 1\)为\(p\)的质数,且有\(0 \lt i \lt p\),得
即
所以说对于\(1 \lt i \lt p - 1\)都有一个不等于自己的数字相乘模\(p\)等于\(1\),那么由模的基本性质可得\(1 * 2 * 3 * … * (p - 1) = 1 * (p - 1) \equiv p - 1 \mod p\)。
即\(p - 1 \equiv -1 \mod p\)。
充分性得证。
再证明必要性:
即\((p - 1)! \equiv -1 \mod p \rightarrow\)\(p\)为质数。
即证\(p\)不为质数\(\rightarrow (p - 1)! \equiv i (i \neq 1) \mod p\)
如果\(p\)不是质数那么\(p\)的每一个因子都小于\(p\),设\(i(1 \lt i \lt p)\)为\(p\)的因数。
若有\(i * i \neq p\),那么\((p - 1)! \equiv 0 \mod p\)。
若有\(i * i = p\),那么\((p - 1)! \mod p\)必为\(i\)的倍数。
必要性得证。
费马定理
你可能会求逆元,但你可能不知道,求逆元的原理是它……
若\(p\)为质数,且\(a \% p \neq 0\),那么\(a^{p-1} \equiv 1 \mod p\)。
证明:
又因为:
\(p\)为质数,根据裴蜀定理推论,得\((a * 1) \% p,(a * 2) \% p,…,(a * (p - 1)) \% p\)结果互不相等,且\(1\lt a*i\%p \lt p\),所以:
由我们上面的结论可知:
由威尔逊定理得
因为\(p - 1\)与\(p\)互质,等式两边同时除以\(p - 1\),得
费马定理得证。
该定理多用于求一个数关于质数的逆元。
欧拉函数
乌拉
前置任务积性函数
定义:
积性函数指对于所有互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数。——百度百科
基本性质:
1.有\(f(n)=\prod\limits_i f(p_i^{a_i})\)
中\(p_i\)为质数,\(a_i\)为自然数。
2.若\(f(n)=\prod\limits_i f^{a_i}(p_i)\)则该函数为完全积性函数。
欧拉函数就是一个kun积性函数,证明什么的就算了。
对于一个正整数\(n\),\(n\)的欧拉函数记为\(\phi(n)\),表示不超过\(n\)且与\(n\)互质的数的个数。
\(\phi(1)=1\)
-
1.若\(n\)为质数,则\(\phi(n)=n-1\)
-
2.若有\(n=a^p\),那么\(\phi(n)=a^p*(1-\frac{1}{a})\)。
其中\(n\)为质数,\(p\)为正整数。
证明:由于\(n\)为一个质数的若干次方,那么与\(n\)不互质的数(小于等于\(n\))肯定是\(a\)的倍数,即\(a,2*a,3*a,\cdots,a*a^p-1\),共\(a^p-1\)个。
那么\(\phi(n)=a^p-a^{p-1}=a^{p-1}*(a-1)=a^p*\frac{a-1}{a}=a^p*(1+\frac{1}{a})\)
- 3.令\(n=a_1^{p_1}a_2^{p_2} \cdots a_k^{p_k}\),根据积性函数的性质
该方法即可快速求出一个数的欧拉函数。
欧拉定理
乌拉,哔~
若\(r\)与\(m\)互质,则\(r^{\phi(m)} \equiv 1 \mod m\)。
证明:
引理1:设\(p\)的简化剩余系为\(p_1,p_2,\cdots,p_k\),则\(r*p_1\%p ,r*p_2\%p,\cdots,r*p_k\%p\)也构成\(p\)的简化剩余系。
首先根据裴蜀定理推论\(r*p_1\%p ,r*p_2\%p,\cdots,r*p_k\%p\)两两不同,再证明他们模\(m\)后与\(m\)互质。
设\(rp_i\)是这\(\phi(m)\)个数中的任意一个。设\(rp_i \equiv x \mod m\)且\(gcd(x,m) \neq 1\)
则\(rp_i=km+x\),令\(d=gcd(x,m)\),则\(d|x\)且\(d|m\),所以\(d|rp_i\),因为\(r\)与\(m\)互质,\(p_i\)与\(m\)互质,所以\(rp_i\)与\(m\)互质,所以\(d\)只能等于\(1\)。
引理1得证。
根据引理1,得:
化简,得
当\(m\)为质数时,该定理上升为费马定理。
区间逆元
更faster的逆元求法。
如果用费马定理,或者乌拉欧拉定理求逆元需要\(\log_n\)的时间复杂度,放到区间里,将会造成\(n\log_n\)的时间复杂度,但总有一些呼吸都是浪费氧气,火葬都污染环境的出题人想要把\(log_n\)卡掉,于是我们的数论里就多了它……
设模数为 \(p\),\(i^{-1}\) 为 \(i\) 关于 \(p\) 的逆元.
由于 \(1^{-1}=1\),所以我们由此向后递推。
设 \(k=\lfloor \frac{p}{i} \rfloor\),\(j=p \mod i\),有 \(p=ki+j\)。
那么 \(ki+j\equiv 0 \mod p\)。
两边同时乘以 \(i^{-1}\times j^{-1}\)。
\(kj^{-1}+i^{-1}\equiv 0 \mod p\)
\(i^{-1}\equiv -kj^{-1} \mod p\)
将 \(k,j\) 代入,得 \(i^{-1}\equiv -\lfloor \frac{p}{i} \rfloor (p \mod i)^{-1}\)。
由于递推求逆(\(p\mod i<i\)),此时 \((p\mod i)^{-1}\) 已经求出,故可以求出 \(i^{-1}\)。
inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
中国剩余定理(CRT)
扩展欧几里得后面再补。
方程思想是数学中很麻烦重要的思想,如果我们有一些同余的等式,那么我们可以列出如下的同余方程。
CRT是解决这种方程组在\(r_1,r_2,\cdots,r_n\)互质的模线性方程组。
因为\(r_1,r_2,\cdots,r_n\)互质,令\(A_i=r_1*r_2*\cdots*r_{i-1}*r{i+1}*r{i+2}*\cdots*r_n\),即\(A_i=\prod\limits_{j \neq i} r_j\),则\(A_i\)与\(r_i\)互质。
根据裴蜀定理引理2,存在 \(c_i\) 使得 \(c_i*A_i \equiv 1 \mod r_i\),则设\(x_i=c_i*A_i*b_i\),易得 \(x_i \equiv b_i \mod r_i\),而 \(A_i\) 可以被其他的 \(r_i\) 整除,所以 \(x_i \equiv 0 \mod r_j \quad(j \neq i)\)。
那么易得 \((x_i+x_j) \equiv b_i \mod r_i\) 且 \((x_i+x_j) \equiv b_j \mod r_j\)。
易证 \(\sum\limits_{i=1}^{n}x_i\) 满足每一个方程,那么 \(x=\sum\limits_{i=1}^{n}x_i=\sum\limits_{i=1}^{n}A_i*c_i*b_i\)。
对于 \(x\),如果加上所有 \(r_i\) 的公倍数,那么 \(x\) 依然满足条件。
即通解为 \(x=\sum\limits_{i=1}^{n}A_i*c_i*b_i+p*\prod\limits_{i=1}^{n}r_i\)。
其中 \(p\) 为任意整数。
扩展中国剩余定理
由于这个世界上总有一些奇思妙想,所以它扩展了……
还是那个熟悉的方程组
但今天\(r_i\)不互质……
先取前2个方程:
移项得:
这个不定方程可以使用扩展欧几里得算法求出,当扩展欧几里得无法求出该方程解时,方程组无解。
若我们求出 \(k\) 的一个特解为\(k_0\),满足 \(k_0 * r_1 - p * r_2 = b_2 - b_1\)。那么 \(k\) 的通解为 \(k = k_0 + b * (r_2 / gcd(r_1,r_2))\)。
其中 \(b\) 为任意整数,gcd 为最大公约数。
将 \(k\) 代入方程组 \(x = k * r + b_1\) 中,得
由于 \(r_1 * r_2 / gcd(r_1,r_2) = lcm(r1,r_2)\),得
其中 lcm 为最小公倍数。
同时模 \(lcm(r_1,r_2)\),得
我们在将这个新方程合并到原方程组,最后求出的\(x\)就是符合条件的答案。
约数和定理
对于一个数 \(n\) 来说,根据整数唯一分解定理,设
对于第 \(i\) 个质因子,我们可以取 \(r_i+1\) 个 \(p_i\)。
又有 \(k\) 个质因子可取,根据乘法原理可得:
\(d[n]\) 为 \(n\) 的质因子个数。
如何线性求一段数的约数给数?
考虑使用线性筛(欧拉筛)。
分类讨论:
1.若 \(i\) 为质数
约数仅为 \(i\) 和 \(1\)。
2.若 \(i\) 为合数
- 2.1若 \(i\) 的最小质因子为 \(p_j\)
由于 \(\frac{i}{p_j}\leq i\) 且为整数。
由于递推求 \(d\),所以 \(d[\frac{i}{p_j}]\) 已求出。
设 \(\frac{i}{p_j}\) 的最小质因子为 \(num[\frac{i}{p_j}]\)。则易得:
上式可以由 \(d[i]\) 和 \(d[\frac{i}{p_j}]\) 化简得来。
同时需要维护\(num[i]=num[\frac{i}{p_j}]+1\)。
ps:特别的:\(i\) 为质数时 \(num[i]=1\)。
- 2.2若 \(i\) 的最小质因子不为 \(p_j\)
那么 \(i*p_j\) 的最小质因子为 \(p_j\),则易得:
使用线性筛即可快速求出。
void Gt()
{
d[1]=1;
for(int i=2;i<=maxn-5;i++)
{
if(!vis[i])
{
cnt++;
p[cnt]=i;
d[i]=2;
num[i]=1;
}
for(int j=1;j<=cnt&&p[j]*i<=maxn-5;j++)
{
vis[p[j]*i]=true;
if(i%p[j]==0)
{
d[i*p[j]]=d[i]/(num[i]+1)*(num[i]+2);
num[i*p[j]]=num[i]+1;
break;
}
else
{
d[i*p[j]]=d[i]*2;
num[i*p[j]]=1;
}
}
}
}
Lucas 定理
先放结论:
先证明 \(C_p^i \equiv \frac{p}{i}C_{p-1}^{i-1} \equiv 0 \mod p\)。
得证。
考虑二项式定理,易得:
Ps:除去 \(C_p^p=1\) 以外,其他的项都被模为 \(0\)。
此时,令 \(a=lp+r,b=sp+j\)。
求证 \(C_a^b \equiv C_l^s\cdot C_r^j \mod p\)。
接着剥削二项式
展开 \((1+x)^{lp}\)
通过上式,观察 \(x^b\) 项。
Ps:左边是直接二项式的 \(x^b\) 项,右边是二项式 \((1+x^p)^l\) 的 \(x^{sp}\) 和 \((1+x)^r\) 的 \(x^j\) 项。

浙公网安备 33010602011771号