【置顶】数论进阶
Fan_sheng
·
·
个人记录
基础篇在我自个儿邮箱里
1 拉格朗日插值
求出该多项式在 $k$ 的取值 $f(k)$。
高消可做,\mathbb O(n^3)。
拉格朗日插值法,\mathbb O(n^2):
f(k)=\sum_{i=1}^{n+1}(y_i\prod_{j\neq i}\frac{k-x_j}{x_i-x_j})
显然,当 k=x_i,第 j 项的连乘式分子中一定有 k-x_i 导致该项被消去,第 i 项的连乘式结果一定为 1,所以上式正确。
(据说如果要在 \bmod\ p 意义下进行,要求 p 为质数)
1.1 x 取值连续时
变成如下式子:
f(k)=\sum_{i=1}^{n+1}(y_i\prod_{j\neq i}\frac{k-j}{i-j})
如果 x_i\neq i 的话偏移一下就好了
想要快速计算 \prod_{j\neq i}\frac{k-j}{i-j},分子可以预处理前缀积和后缀积,分母可以化成两个阶乘(但是要注意符号)。复杂度降为 \mathbb O(n)。
1.2 重心拉格朗日插值法
如果需要动态加点,可以在 \mathbb O(n) 时间内完成对答案的修改。
(\LaTeX)
1.3 应用
计算 \sum_{i=1}^ni^k。(定理:该式一定是关于 n 的 k+1 次多项式)
暴力算出前 k+2 项,拉插出式子,代入 n 求解即可。
2 扩展卢卡斯定理/exLucas
求 C_n^m\bmod P,P不一定为质数。
考虑把 P 化成 \prod p_i^{k_i}的形式,求出所有 C_n^m\bmod p_i^{k_i},再用 CRT 合并即可。
即求
\frac{n!}{m!(n-m)!}\bmod p^k
由于两者不互质,逆元不一定有解,所以
\frac{\frac{n!}{p^x}}{\frac{m!}{p^y}\frac{(n-m)!}{p^z}}p^{x-y-z}\bmod p^k
前半部分相当于求解下式
\frac{n!}{p^x}\bmod p^k
我们有
n!=(p\times2p\times\cdots\times mp)\times\prod_{i=1,i\bmod p\neq 0}i
\equiv p^{\lfloor\frac{n}{p}\rfloor}\times(\lfloor\frac{n}{p}\rfloor)!\times(\prod_{i=1,i\bmod p\neq0}^{p^k-1}i)^{\lfloor \frac{n}{p^k}\rfloor}\times\prod_{i=\lfloor \frac{n}{p^k}\rfloor p^k+1,i\bmod p\neq 0}^ni\pmod {p^k}
后面两个看上去很乱的部分表示模 p^k 意义下的循环节和余项。
需要消掉 p^{\lfloor\frac{n}{p}\rfloor} 以及 (\lfloor\frac{n}{p}\rfloor)! 中的 p 因子。
有递推式
f(n)=\frac{n!}{p^x}\pmod{p^k},f(0)=1
f(n)=f(\lfloor\frac{n}{p}\rfloor)\times(\prod_{i=1,i\bmod p\neq0}^{p^k-1}i)^{\lfloor \frac{n}{p^k}\rfloor}\times\prod_{i=\lfloor \frac{n}{p^k}\rfloor p^k+1,i\bmod p\neq 0}^ni\pmod {p^k}
复杂度 \mathbb O(\log_p^n)。
接下来处理 p^{x-y-z}
根据上面推出来的阶乘的式子,设 g(n) 为 \frac{n!}{p^x} 中的 x,有递推式
g(0)=0
g(n)=\lfloor\frac{n}{p}\rfloor+g(\lfloor\frac{n}{p}\rfloor)
那么就可以求出逆元并合并方程了。
模板 Code exLucas
tips:对于 square-free-number,即质因子指数都为 1 的模数,直接使用普通 Lucas 再 CRT 合并即可,比如古代猪文。
3 exBSGS
求 a^x\equiv b\pmod p 最小非负整数解,a,p 不一定互质。
设 d=\gcd(a,p),根据同余方程的性质我们可以约掉 d。
如果 d\nmid b,只有两种情况:
证明简单,裴蜀定理。
如果整除,我们有
\frac{a^x}{d}\equiv \frac{b}{d}\pmod{\frac{p}{d}}
容易发现上面这个式子可以接着约掉 d,直到下面的形式
\frac{a^k}{d^k}a^{x-k}\equiv\frac{b}{d^k}\pmod{\frac{p}{d^k}}
此时不能再约了,也就是互质。
这里需要注意存在 x\le k 的情况,需要提前判出去。
然后就可以愉快地求得 \frac{a^k}{d^k} 的逆元,用普通 BSGS 求出 x-k。
Code
inline int exBSGS(){
a%=p,b%=p;
if(b==1||p==1)return 0;//特判b=1和p=1的情况,答案一定为0
int k=0,val=1;//val维护的是(a^k)/(d^k)
while(1){
int d=gcd(a,p);
if(d==1)break;//已经互质,不再往下化式子
if(b%d)return -1;//判无解
b/=d,p/=d;k++;
val=1ll*val*a/d%p;
if(b==val)return k;//这里代表a^(x-k)(k是当前的k)已经为1,说明x<=k(最终的k),特判出去
}
int x,y;
exgcd(val,p,x,y);//逆元
x=(x%p+p)%p;b=1ll*b*x%p;return BSGS(k);//记得BSGS的结果是x-k,还要加上k
}
4 Miller Rabin&Pollard Rho
玄学算法不予评价
(\LaTeX)
5 原根
阶:p>1\land\gcd(a,p)=1,使得 a^r\equiv1\pmod p 的最小正整数 r 称为 a 模 p 的阶。
原根:使得 a 模 p 的阶恰为 \varphi(p) 的整数 a 称为 p 的原根之一。
求法:
-
判断原根个数。n 有原根的充要条件是 n 为 2,4,p^k,2p^k(p 为大于 2 的质数)之一。如果 n 有原根,个数为 \varphi(\varphi(n))。
-
找最小原根。从 1 到 n-1 暴力枚举 a,可以估计其级别是 n^{\frac{1}{4}} 的。首先需要满足 a^{\varphi(n)}\equiv1\pmod n,然后有性质 a 模 n 的阶一定整除 \varphi(n),若 \varphi(n)=p_1^{k_1}p_2^{k_2}\cdots,需要对于所有 p_i 满足 a^{\frac{\varphi(n)}{p_i}}\neq1\pmod n。
-
找所有原根。若最小原根 a_0,那么所有原根可表示为 a_0^k\bmod n,其中 \gcd(k,\varphi(n))=1。暴力即可。
Code 求原根
-
常用原根:998244353 的最小正原根为 3。
-
性质:设 n 有原根 g,对任意 x<n\land \gcd(x,n)=1,x 可以表示为 g^k\bmod p。
-
用途:最重要的当然是用于 NTT。一般应用第三条中的性质,用最小原根的幂次表示一些数,从而把乘方化成幂次的加减。
6 二次剩余
求解同余方程 x^2\equiv n\pmod p,p 为奇质数,x 在模 p 意义下。
二次剩余,即模意义下的开根。以下讨论都以 p 为奇质数,x 在模 p 意义下为前提。
由于笔者实在太蒻,目前只摆结论,证明鸽掉。
(\LaTeX)
称使得该方程有解的 n 为模 p 意义下的二次剩余。
勒让德符号
(\frac{n}{p})=\left\{\begin{aligned}
&1,&n\text是\text二\text次\text剩\text余\\
-&1,&n\text不\text是\text二\text次\text剩\text余\\
&0,&n\equiv0\pmod p
\end{aligned}\right.
欧拉判别准则
(\frac{n}{p})\equiv n^{\frac{p-1}{2}}\pmod p
解的数量
二次剩余和非二次剩余各有 $\frac{p-1}{2}$ 个。
**Cipolla 算法**
若某一整数 $a$ 使得 $\omega=a^2-n$ 为模 $p$ 意义的**非二次剩余**,则 $x=(a+\sqrt\omega)^{\frac{p+1}{2}}$ 是原方程的一个解,另一个解为 $p-x$。
对于 $a$,我们可以随机取值,期望 $2$ 次,因为非二次剩余占一半。
但是存在 $\sqrt\omega$,如何解决?
把 $a+\sqrt\omega$ 看成虚数的形式,幂次之后会变成 $t\omega+r\sqrt\omega$ 的形式。**可以证明,最终得到的 $x$ 虚部为 $0$**。
Code [二次剩余](https://www.luogu.com.cn/record/77127924)
## 6.1 N 次剩余
($\LaTeX$)
# 7 数论函数
## 7.1 常见数论函数
单位函数 $\epsilon(n)=[n=1]
欧拉函数 \varphi(n)
幂函数(一般指数为1) id_k(n)=n^k
莫比乌斯函数 \mu(n)=\left\{\begin{aligned}&1,&n=1\\&0,&n\text有\text指\text数>1\text的\text质\text因\text子\\&(-1)^k,&n\text有k\text个\text质\text因\text子\end{aligned}\right.
约数和函数 \sigma(n)=\sum_{d|n}d
约数个数函数 d(n)=\sum_{d|n}1
以上函数皆为积性函数。
7.1.1 积性函数
积性函数:\forall a,b\in N^+\land\gcd(a,b)=1,f(ab)=f(a)f(b)。
完全积性函数:\forall a,b\in N^+,f(ab)=f(a)f(b)。
利用线性筛几乎可以求解所有积性函数。
7.1.1.1 线性筛 \varphi
phi[1]=1;//注意,因为phi是积性函数
for(int i=2;i<=n;i++){
if(!check[i]){
prime.push_back(i);
phi[i]=i-1;
}
for(int j=0;j<prime.size()&&i*prime[j]<=n;j++){
check[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
7.1.1.2 线性筛 \mu
mu[1]=1;
for(int i=2;i<=n;i++){
if(!check[i]){
prime.push_back(i);
mu[i]=-1;
}
for(int j=0;j<prime.size()&&i*prime[j]<=n;j++){
check[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
7.1.1.3 线性筛 d
(\LaTeX)
7.1.1.4 线性筛 \sigma
(\LaTeX)
7.2 狄利克雷卷积
定义数论函数 f,g 的狄利克雷卷积第 n 项为
(f*{g})(n)=\sum_{d|n}f(d)g(\frac{n}{d})
性质
结论
7.2.1 莫比乌斯反演
实际上在上面都说到了,这里只是再专门整理一下与 \mu 相关的。
$$
\mu*{1}=\epsilon
$$
反演结论(由上方性质可知):
$$
\sum_{d|\gcd(i,j)}\mu(d)=[\gcd(i,j)=1]
$$
下式中,$f$ 称为 $g$ 的 **莫比乌斯变换**,$g$ 称为 $f$ 的**莫比乌斯反演**。
$$
f*{1}=g\Leftrightarrow f=g*{\mu}
$$
要证明也很简单,由 $\mu$ 的性质可知,$\mu$ 是 $1$ 的逆元。
推荐在这个博客练练手 $\rightarrow$ [莫比乌斯反演](https://www.luogu.com.cn/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi)
### 7.2.2 杜教筛
在非线性时间内求积性函数前缀和。
要求积性函数 $f$ 的前缀和 $S$,我们先找到另一个函数 $g$。
他们的狄利克雷卷积前缀和为
$$
\sum_{i=1}^nf*{g}
$$
$$
=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})
$$
$$
=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)
$$
$$
=\sum_{d=1}^ng(d)S(\lfloor\frac{n}{d}\rfloor)
$$
那么
$$
g(1)S(n)=\sum_{i=1}^nf*{g}-\sum_{d=2}^ng(d)S(\lfloor\frac{n}{d}\rfloor)
$$
**如果能够极快地计算到 $g$ 的前缀和以及 $f*{g}$ 的前缀和,就能通过数论分块递归地解决问题**。重点也就在于此。
可以使用哈希表(unordered_map)记忆化,复杂度 $\mathbb O(n^{\frac{3}{4}})$。
优化:先线性筛出前 $n^{\frac{2}{3}}$ 个前缀和,之后的再递归,这样平衡一下后复杂度优化到 $\mathbb O(n^{\frac{2}{3}})$。
Code
```cpp
inline ll work(int n){
if(n<=1665000)return presum[n];//预先线性筛过了
auto pos=mp.find(n);
if(pos!=mp.end())return (*pos).second;//记忆化过了
ll ans=sumh;//狄利克雷卷积的前缀和
int l=2,r;
while(l<=n){//数论分块
r=n/(n/l);
ans-=1ll*(sumg[r]-sumg[l-1])*work(n/r);//g的前缀和乘上递归结果
l=r+1;
}return mp[n]=ans;//记忆化
}
```
### 7.2.3 洲阁筛
($\LaTeX$)
### 7.2.4 Min_25 筛
($\LaTeX$)
### 7.2.5 Powerful Number 筛
($\LaTeX$)
# Tips
- 扩展欧拉定理,如果底数与模数互质,就无需判特殊情况。
- exCRT 完全可以代替 CRT,但是 exLucas 的耗时就明显比 Lucas 高。在 exLucas 的章节最后也有一个 tips,那个情况下记得用普通 Lucas。
- 同余方程可以对 $a,b,p$ 同除一个数而无需逆元。如果 $\gcd(a,p)$ 不能整除 $b$,一定无解(裴蜀定理)。
- exCRT 如果带有系数($bx\equiv a\pmod p$)的话,合并后模数不是 $lcm(p_1,p_2)$,而是 $\frac{p_1p_2}{\gcd(b_1p_2,b_2p_1)}$,可以从 不定方程的角度推出。当然也可以根据上条性质把系数除掉。
- 数论分块:使得 $\lfloor\frac{n}{i}\rfloor=\lfloor\frac{n}{j}\rfloor$ 成立的最大 $j$ 为 $\lfloor\frac{n}{\lfloor\frac{n}{i}\rfloor}\rfloor$。