【置顶】数论进阶

· · 个人记录

基础篇在我自个儿邮箱里

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。(定理:该式一定是关于 nk+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 称为 ap 的阶。

原根:使得 ap 的阶恰为 \varphi(p) 的整数 a 称为 p 的原根之一。

求法:

  1. 判断原根个数。n 有原根的充要条件是 n2,4,p^k,2p^kp 为大于 2 的质数)之一。如果 n 有原根,个数为 \varphi(\varphi(n))

  2. 找最小原根。从 1n-1 暴力枚举 a,可以估计其级别是 n^{\frac{1}{4}} 的。首先需要满足 a^{\varphi(n)}\equiv1\pmod n,然后有性质 an 的阶一定整除 \varphi(n),若 \varphi(n)=p_1^{k_1}p_2^{k_2}\cdots,需要对于所有 p_i 满足 a^{\frac{\varphi(n)}{p_i}}\neq1\pmod n

  3. 找所有原根。若最小原根 a_0,那么所有原根可表示为 a_0^k\bmod n,其中 \gcd(k,\varphi(n))=1。暴力即可。

Code 求原根

6 二次剩余

求解同余方程 x^2\equiv n\pmod pp 为奇质数,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$。