数论整理(理论篇)
后续:数论整理(代码篇)
当然有的证明因为水平所限不是那么的严谨…… 要严谨去看数论教科书或者我写的笔记(宣传
编号不一定与代码篇中的一致。
参考资料:可以认为是各道模板的题解
目前这一篇除了n次剩余和积性函数前缀和都已经更完了。
1. 快速幂和光速幂#
这个不应该算数论(
快速幂:
快速求出 abmodp 的值。
递归实现原理:
当 b 为偶数时,ab=(ab/2)2
当 b 为奇数时,ab=(a⌊b/2⌋)2×a
迭代实现快速幂:其实和递归实现的也没什么区别。
时间复杂度O(logb)。
光速幂:
快速求出:xa1modp,xa2modp,⋯,xanmodp 的值。
首先我们任取一个 S。
预处理 x1,x2,⋯,xS 和xS,x2S,⋯,x⌊y/S⌋∗S。
其中 y=max{ai}。
然后 x^k=x^{k\pmod S}\times x^{\lfloor k/S\rfloor*S},于是可以做到 O(1) 查询。
时间复杂度 O(S+\dfrac{y}{S}+n),S 取 \sqrt{y} 时最优为 O(\sqrt{y}+n)。
y 过大时可用扩展欧拉定理降幂。
2. 最大公因数和最小公倍数与质数筛#
关于欧几里得算法:
证明 (a,b)=(b,a\text{ mod }b)\quad(a>b):
只需证明 a,b 的公因数与 b,a\text{ mod }b 的公因数相等即可。
设 a=kb+r(0\leqslant r<|b|),则 r=a\text{ mod }b
设 d 是 a,b 的公因数,则 d\mid a,d\mid b
则 d\mid kb+r,又因为 d\mid b 故 d\mid r
于是 d 是 b,r 的公因数即 b,a\text{ mod }b 的公因数,
即 a,b 的公因数是 b,a\text{ mod }b 的公因数。
若有 d\mid b,d\mid r 同样可得 d\mid kb+r 即 d\mid a
于是 b,a\text{ mod }b 的公因数也是 a,b 的公因数。
于是 a,b 的公因数与 b,a\text{ mod }b 的公因数相等。
于是 (a,b)=(b,a\text{ mod }b)\quad(a>b)。
时间复杂度 O(\log \max\{a,b\})。
最小公倍数的求法:
证明 (a,b)[a,b]=ab:
设有质数 p 满足 p^n||a 且 p^m||b
有 p^{n+m}||ab
又因为 p^\min\{n,m\}||(a,b),p^\max\{n,m\}||[a,b]
故 p^{\min\{n,m\}+\max\{n,m\}}||(a,b)\times [a,b]
即 p^{n+m}||(a,b)\times [a,b]
于是 (a,b)[a,b]=ab
时间复杂度 O(\log\max\{a,b\})。记得先除后乘。
质数筛:
顾名思义,这是用来筛出 n 以内的质数的。
筛法1:埃氏筛
需要一个 vis 数组标记合数。
从 2 开始枚举。
当前的数如果未被标记为合数,那么它就是质数。否则继续枚举下一个质数。
设当前的数为 i(注意这个 i 一定为质数)。显然 i^2 之前的数都已经被判断过。
我们从 i^2 开始枚举 i 的倍数,并将其标记为合数。
最终,未被标记过的数字就是质数。(1除外)
注意到有的数会被重复标记。
可以证明时间复杂度为 O(n\log\log n)。
筛法2:欧拉筛(线性筛)
需要一个 vis 数组来标记合数和一个 primes 数组存储已经筛出的质数。
从 2 开始枚举。
若当前的数未被标记,那么它是质数,并存到质数表里。(注意质数表里的质数由小到大升序排列,遍历时也是由小到大)
记当前的数为 i(注意这个 i 不一定为质数)。
遍历质数表。设当前遍历到的质数为 j。
将 ij 标记为合数。若 i 是 j 的倍数,停止遍历并退出,枚举下一个 i。
这样就不会有重复标记了。每个数只会被自己的最小质因子筛掉。
时间复杂度 O(n)。
有一个问题:为什么遍历质数表时若 i 是 j 的倍数,就要停止遍历并退出呢?
我们知道,只有保证每个数只会被自己的最小质因子筛掉,才不会出现重复标记从而降低复杂度。
假如继续筛,标记了 ij'。因为 i 是 j 的倍数,所以 ij' 也是 j 的倍数。
又因为我们是从小到大遍历质数表,所以 j<j'。
因此这个标记出来的数最小质因子为 j 而非 j',也应该被 j 筛掉而非 j'。
这样就会造成重复标记,让时间复杂度退化。
因此若 i 是 j 的倍数,就要停止遍历并退出,避免不必要的标记,从而保证时间复杂度正确。
3. 扩展欧几里得与解二元一次不定方程#
裴蜀定理:ax+by=c 有整数解当且仅当 gcd(a,b)\mid c
于是我们只需考虑 ax+by=gcd(a,b) 这个式子即可。对于一般的二元一次不定方程求完答案之后扩倍即可。
设 \begin{cases}a'=b\\b'=a\text{ mod }b\end{cases}
我们知道 gcd(a,b)=gcd(b,a\text{ mod }b)=gcd(a',b'),
于是方程a'x'+b'y'=gcd(a,b)一定有整数解。
将a'和b'的定义式代入,有
\begin{aligned}a'x'+b'y'&=gcd(a,b)\\bx'+(a\text{ mod }b)y'&=gcd(a,b)\\bx'+\left(a-\left\lfloor\dfrac{a}{b}\right\rfloor\times b\right)y'&=gcd(a,b)\\bx'+ay'-\left\lfloor\dfrac{a}{b}\right\rfloor\times b \times y'&=gcd(a,b)\\ay'+b\left(x'-\left\lfloor\dfrac{a}{b}\right\rfloor\times y'\right)&=gcd(a,b)\end{aligned}
与原式对比,有
\begin{cases}x=y'\\y=x'-\left\lfloor\dfrac{a}{b}\right\rfloor\times y\end{cases}
也就是说,我们完全可以先解出方程a'x'+b'y'=gcd(a,b),然后再用这个新方程的解来表示原方程的解。
另外,在b=0时原方程有显然解\begin{cases}x=1\\y=0\end{cases}
于是我们就可以运用欧几里得算法的思想来解二元一次不定方程组。
这个操作被称为扩展欧几里得(exgcd)。时间复杂度O(\log\max\{a,b\})。
我们求得了特殊解,接下来讨论通解。
设我们已经获得了一组解\begin{cases}x=x_0\\y=y_0\end{cases}
那么显然\begin{cases}x=x_0\pm b\\y=y_0\mp a\end{cases}也是一组解。
于是我们就能获得原方程的所有整数解了。
4. 逆元#
定义:如果有一个数a满足ma\equiv 1\pmod{p},
那么称a是m在模p意义下的逆元,记作m^{-1}。
注意逆元可能不存在。很明显逆元存在当且仅当 $$
逆元满足完全积性。
证明:显然(a\times a^{-1})(b\times b^{-1})\equiv 1\pmod{p}
乘法结合律得(ab)(a^{-1}b^{-1})\equiv 1\pmod{p}
于是a^{-1}b^{-1}\equiv (ab)^{-1}\pmod{p}
一般来说,求n在模p意义下的逆元需要用exgcd做,是O(\log p)的样子。
这样复杂度会多一个log,于是我们就有了以下求逆元的技巧:
线性求逆元:
显然若p是质数,则1,2,3,\cdots,p-1在模p意义下都存在逆元。
显然1在模p意义下的逆元就是1。
朴素的单个数的逆元求法为扩展欧几里得。
我们要尝试想出一种线性的做法,而不是O(n\log p)的n次exgcd。
考虑一个显然的式子:p\text{ mod }k\times (p\text{ mod }k)^{-1}\equiv -1\pmod{p}
我们将那个p\text{ mod }k拆开。
\begin{aligned}\left(p-\left\lfloor\dfrac{p}{k}\right\rfloor\times k\right)\times(p\text{ mod }k)^{-1}&\equiv1\pmod{p}\\p\times(p\text{ mod }k)^{-1}-\left\lfloor\dfrac{p}{k}\right\rfloor\times k\times(p\text{ mod }k)^{-1}&\equiv1\pmod{p}\end{aligned}
p的倍数模p肯定是0,于是所有p的乘积项都可以任意添加和消去。
\left(p-\left\lfloor\dfrac{p}{k}\right\rfloor\right)\times k\times(p\text{ mod }k)^{-1}\equiv1\pmod{p}
同余号两边同乘k^{-1},大功告成。
\left(p-\left\lfloor\dfrac{p}{k}\right\rfloor\right)\times(p\text{ mod }k)^{-1}\equiv k^{-1}\pmod{p}
于是我们用p\text{ mod }k的逆元求出了k的逆元。
p\text{ mod }k显然小于k,于是这个式子是可以用于递推的。时间复杂度O(n)。
阶乘逆元:
这个要简单许多。
利用a!=(a-1)!\times a,
显然((a-1)!\times a)^{-1}\equiv (a!)^{-1}\pmod{p}
利用逆元的完全积性拆开:
(a-1)!^{-1}\times a^{-1}\equiv (a!)^{-1}\pmod{p}
大功告成。不过还要线性预处理逆元才行。时间复杂度O(n)。
也可以倒过来推,但这会多算一个exgcd。时间复杂度O(n+\log p)。
离线逆元:
这个是要求任意n个数在模p意义下的逆元。
这里我们仍然要用到逆元的完全积性。
记这n个数为a_1,a_2,\cdots,a_n。
考虑求这n个数的前缀积。记s_i为前i个数的积。
接下来我们求出s_n^{-1}。
利用逆元的完全积性,我们知道n个数的积的逆元也是这n个数逆元的积。
于是容易得出s_{i-1}^{-1}=s_i^{-1}\times a_i。
这样我们求出了所有的s_i^{-1}。
最后查询的时候,有a_i^{-1}=s_{i-1}\times s_i^{-1}。
时间复杂度O(n+\log p)。
5. CRT与exCRT#
都是解一次同余方程组的利器。时间复杂度也都是O(n\log n)。
考虑一次同余方程组\begin{cases}x\equiv r_1\pmod{m_1}\\x\equiv r_2\pmod{m_2}\\\cdots\\x&\equiv r_n\pmod{m_n}\end{cases}
当m_1,m_2,\cdots,m_n两两互质时:
构造:\begin{cases}M=\prod\limits_{i=1}^nm_i\\M_i=\dfrac{M}{m_i}\\M_iK_i\equiv1\pmod{m_i}\end{cases}
于是原方程有整数解x=\sum\limits_{i=1}^nr_iM_iK_i。代入即可验证。
这种构造特殊同余方程组解的方法叫做CRT(中国剩余定理)。
但要是模数不两两互质呢?
那只能暴力合并了。
假设我们已经解出了前(i-1)个方程。
记前i个方程的解为ans_i,前i个模数的最小公倍数为lcm_i。
考虑方程组:\begin{cases}ans_i\equiv ans_{i-1}\pmod{lcm_{i-1}}\\ans_i\equiv r_i\pmod{m_i}\end{cases}
由第一个方程,我们有ans_i=ans_{i-1}+k\times lcm_{i-1},将这个式子代入第二个方程:
ans_{i-1}+k\times lcm_{i-1}\equiv r_i\pmod{m_i}
解出k(就是解不定方程lcm_{i-1}\times k+m_i\times y=r_i-ans_{i-1})
如果这个方程无解那么整个方程组就都无解了。
然后计算出ans_i,则方程被合并为x\equiv ans_i\pmod{lcm_i}。
最后的解就是x\equiv ans_n\pmod{lcm_n}。
这种暴力合并方程组的操作就叫做exCRT。当然exCRT的常数大一些。
6. Lucas定理与exLucas#
这两个东西都是用来计算组合数的,但鉴于计算方法与数论有关就放到这里了
Lucas定理:C_a^b\equiv C_{a\text{ mod }p}^{b\text{ mod }p}\times C_{\lfloor a/p\rfloor}^{\lfloor b/p\rfloor}\pmod{p}(不会证明)
仅当p为质数时成立。
Lucas定理用于模数p是小质数时快速计算组合数。
不做预处理时间复杂度O(p\log_pa),做好预处理可以优化到O(p+\log_pa)。
接下来讨论更一般的exLucas。
exLucas其实和Lucas定理没什么关系QwQ
首先提醒一下:exLucas很麻烦,虽然时间复杂度比较优秀但是几乎没人写(
直接考虑组合数计算式
C_m^n\text{ mod }p=\dfrac{m!}{(m-n)!n!}\text{ mod }p
其中p不一定为质数。但是我们只需要根据唯一分解定理拆开p,最后再CRT合并就行。
也就是说令p=\prod {p_i}^{c_i},我们只需要计算出每个\dfrac{m!}{(m-n)!n!}\text{ mod }{p_i}^{c_i}即可。
先考虑一个式子\dfrac{m!}{(m-n)!n!}\text{ mod }{p_k}^{c_k}
然后我们尴尬地发现这些阶乘的逆元可能不存在。。。
但问题不大,我们把每项所含的p_k全都除掉就行了(
定义f(n)=\dfrac{n!}{p_k^x},并保证p_k\nmid f(n)。
再定义g(n)=x,x的意义同上。
于是,原式变成了
\dfrac{f(m)}{f(m-n)f(n)}\times p_k^{g(m)-g(n)-g(m-n)}\text{ mod }{p_k}^{c_k}
于是我们的任务变成了求出f(n)\text{ mod }{p_k}^{c_k}和g(n)\text{ mod }{p_k}^{c_k},
更要命的是求出了g(n)对于求f(n)没有半点作用。。。因为逆元还是不存在。。。
不慌,一点一点求。
先求f(n)。
考虑n!\text{ mod }{p_k}^{c_k}。
n!=1\times 2\times 3\times\cdots\times n,将p_k拆出来:
n!={p_k}^{\lfloor n/p_k\rfloor}\times \lfloor n/p_k\rfloor!\times\prod_{i=1}^n[p_k\nmid i]\times i
因为将条件都堆在求积号下面太难看了,就用了艾弗森括号。
为了保护眼睛,记prod(a,b)=\prod_{i=a}^b[p_k\nmid i]\times i。
后面的那一大堆乘积还是有循环节,再将它拆开。
prod(1,n)=prod(1,{{p_k}^{c_k}})^{\lfloor n/{p_k}^{c_k}\rfloor}\times prod({p_k}^{c_k}\cdot\lfloor n/{p_k}^{c_k}\rfloor,n)
式子看上去很难看,但确实不能再化简了。
于是f(n)=f(\lfloor n/p_k\rfloor)\times prod(1,n),边界条件f(0)=1。
g(n)能简单一些,可以直接无视掉prod(1,n)。
g(n)=\lfloor n/p^k\rfloor+g(\lfloor n/p^k\rfloor)
边界条件:当n<p^k时g(n)=0。
综上所述,我们以一种十分暴力的方式解决了求组合数的问题。
时间复杂度比较玄学,大概为O(p),常数略大。
7. BSGS与exBSGS#
BSGS用于解同余方程A^x\equiv B\pmod{C},其中gcd(A,C)=1。
首先考虑暴力做法:
我们发现这个A^x\text{ mod }C是有循环节的。
由费马小定理,A^{C-1}\equiv 1\pmod{C}。
也就是说我们只需要枚举位于[0,C-1)之间的A就行了。
时间复杂度O(C),不够优秀。
但是如果我们设x=i\times\sqrt{C}-j\quad(j\in [0,\sqrt{C})),并将其代入原式:
A^{i\times\sqrt{C}-j}\equiv B\pmod{C}
gcd(A,C)=1保证了逆元存在,于是原式变形为\dfrac{A^{i\times\sqrt{C}}}{A^j\times B}\equiv 1\pmod{C}
也就是说A^{i\times\sqrt{C}}=A^j\times B时得出解。
接下来就简单了,预处理A^j\times B\text{ mod }C\quad(j\in [0,\sqrt{C})),存到哈希表里;
然后枚举i\in[1,\sqrt{C}]查询即可。
时间复杂度O(\sqrt{C})。
但是有时候C会为任意数,这是我们就需要使用exBSGS。
首先特判几种情况。
若B=1,则x=0;
若A=0,则当B=0时可取x=1,当B\neq0时无解。
题目中没有了互质,那我们就来创造互质。
设g=gcd(A,C)。
注意到这时原同余方程相当为A^x+kC=B。
根据裴蜀定理,必须有g\mid B,否则方程无解。
于是方程除以g得
A^{x-1}\cdot \dfrac{A}{g}\equiv \dfrac{B}{g}\pmod{\dfrac{C}{g}}
以此类推,直到满足BSGS的条件为止。
当然方程左边多了一个系数,不过我们直接求一次逆元乘到右边去就可以了。
最后别忘了将BSGS的答案加上除以最大公因数的次数。
8. Miller-Rabin与Pollard-Rho#
朴素的判断质数的方法太慢了,时间复杂度达到了O(\sqrt{n})。
但是我们有一个更快的Miller-Rabin算法,时间复杂度达到了O(\log n)的级别。
可惜这个算法是一个随机化的算法,会有0.25^k的错误概率,其中k为检测次数。
首先,我们有费马小定理:当p为质数时,a^{p-1}\equiv 1\pmod{p}。
但是这个定理的逆定理是不成立的,存在一类伪素数p,使得对于每一个小于p的a,都有a^{p-1}\equiv 1\pmod{p}。
于是我们要用到二次探测定理。
若x^2\equiv 1\pmod{p},则x\equiv 1\pmod{p}或x\equiv p-1\pmod{p}。
这个证明起来非常简单,只要一次平方差公式就行。
接下来我们应用这两个判定方法来判断p是否为质数。(更准确地说,是判断是不是合数)
首先我们随机选一个数x,进行费马测试。
也就是说,如果x^{p-1}\equiv 1\pmod{p}不成立,那么p一定不是质数。
接下来,我们进行二次探测。
若2\mid p-1,(如果不成立就判断不出来,直接返回)根据刚刚费马测试得出的结果,我们有(x^{(p-1)/2})^2\equiv 1\pmod{p}。
这时式子就变成了二次探测的标准形式。
讨论x^{(p-1)/2}\bmod p的值。
如果值非1且非p-1,那么p为合数。
如果值为p-1,无法判断,直接返回。
如果值为1且\dfrac{p-1}{2}仍然为偶数,继续二次探测。
如果值为1且\dfrac{p-1}{2}为奇数,无法判断,直接返回。
一般来说一次测试是远远不够的,我们要进行多次Miller-Rabin。
Miller-Rabin只能排除合数的情况 ,因此每次返回时,如果不能确定,都要认为p是质数。
只有每次判定都说明p不是合数,我们才能够认为p是质数。
强大的大数分解质因数算法——Pollard-Rho
这个算法是一个随机化算法,时间复杂度约O(\sqrt[4]{N})。
生日悖论:在n个数中随机选取约\sqrt{n}次,就会有较大概率出现选值的重复。
我们就是应用生日悖论来快速分解质因数。
我们在[1,N]中随便rand两个数,那么这两个数的差与N的最大公因数大于1的概率就很高了。
这样的话大概要选\sqrt[4]{N}个数,无法存储。
于是我们构造一个伪随机数列:f(x)=(x^2+c)\bmod N。
rand一个x_1,然后让x_2=f(x_1),x_3=f(x_2),以此类推。
但是我们发现这个数列是有循环节的,大致呈一个\rho形。(所以说这个算法叫做Pollard-Rho)
我们使用Floyd判环法:设有两个指针p_1,p_2,让p_2的速度是p_1速度的两倍。
如果两个指针相遇,那么就一定存在环,且两指针走过的路程差恰为环的长度的整数倍。
判断到环时,直接退出。
于是我们有了初步的算法:(以luogu模板题为例)
1.Miller-Rabin判断N是否为素数。是素数就记录下来。
2.Pollard-Rho找一个因子p。
3.继续分解N/p和p。
4.根据记录求得最大质因子。
最后再对这个算法进行一些小优化。
首先频繁地求gcd会让复杂度多一个log,于是考虑将一些测试样本乘起来一起求gcd。这样既快速又没有漏掉该有的因子。
一般来说是127个样本乘到一起比较快我也不知道原因
最后注意判断环的长度小于127的情况即可。
使用路径倍增的方法将测试样本乘起来也可以。
9. 数论函数初步#
首先进行一些符号约定:
[P]:艾佛森括号,若P为真则[P]=1,若P为假则[P]=0。
n\perp m:表示n与m互质,即\gcd(n,m)=1。
数论函数用加粗的小写字母 或 希腊字母表示。
一般来说p,q表示质数。另有说明的除外。
数论函数:定义域为正整数,陪域为复数的一类函数。
积性函数:满足:n\perp m\Rightarrow {\bf f}(nm)={\bf f}(n){\bf f}(m)的数论函数。
完全积性函数:满足:{\bf f}(nm)={\bf f}(n){\bf f}(m)的数论函数。
注意:由积性函数的定义,{\bf f}(1\times1)={\bf f}(1){\bf f}(1),即有{\bf f}(1)=1(不考虑{\bf f}(1)=0,那样相当于{\bf f}(n)\equiv0)。
接下来介绍常见的积性函数:
幂函数:{\bf id}_k(n)=n^k,特别地,当k=1时为恒等函数{\bf id}(n)=n,当k=0时为常数函数{\bf 1}(n)=1。
单位函数:{\bf \varepsilon}(n)=[n=1]
事实上,这两个函数都是完全积性函数。
欧拉函数:{\bf \varphi}(n)=\sum\limits_{i=1}^n[i\perp n]
除数函数:{\bf \sigma}_k(n)=\sum\limits_{d\mid n}d^k(注意k的位置,{\bf \sigma}_k(n)\neq{\bf \sigma}^k(n))
特别地,当k=1时为除数和函数{\bf \sigma}(n),当k=0时为除数个数函数{\bf d}(n)(或记作{\bf \tau}(n))
莫比乌斯函数:{\bf \mu}(n)=\begin{cases}(-1)^k,n=p_1p_2p_3\cdots p_k\\0,\text{otherwise}\end{cases}
积性函数线性筛:
积性函数特有的科技。
每一个积性函数的求值,通过分解质因数都能转化为计算{\bf f}({p_i}^{k_i})的值。
于是我们考虑在线性筛中计算积性函数的值。由之前的讨论知{\bf f}(1)=1,于是我们只需讨论{\bf f}(2)到{\bf f}(n)的值即可。
为了方便计算,我们定义c_i表示i的最小质因子的指数次幂,即{p_1}^{k_1}。(这可不是积性函数)
注意当i为质数次幂时,有c_i=i。
再次考虑线性筛的过程,我们发现线性筛中分了几种情况来讨论。
设当前枚举到的值为i。
若i为质数:直接算出{\bf f}(i),并且c_i=i。
我们知道n以内有O(\dfrac{n}{\log n})个质数,因此当前计算{\bf f}(i)的时间复杂度单次不能超过O(\log i)。
接下来是枚举质数,我们设当前枚举到的质数为p。
若i\nmid p,则i\perp p。于是直接根据积性函数定义有{\bf f}(i\times p)={\bf f}(i){\bf f}(p),并且c_{i\times p}=p。
若i\mid p,此时必有c_{i\times p}=c_i\times p。
为了更好地进行计算,我们再分两种情况讨论:
若c_i=i,即i=p^k:
暴力算出{\bf f}(i\times p),即{\bf f}(p^{[\log i/\log p]+1}),或者通过{\bf f}(i)递推。
与质数的情形一样,我们也要求算{\bf f}(i\times p)的单次时间复杂度不超过O(\log(i\times p))。
若c_i\neq i:
这时c_i就派上用场了。我们知道在线性筛中,一个数只能被它的最小质因子筛掉。于是有c_i=p^k。
则{\bf f}(i\times p)={\bf f}(c_i\times(i/c_i)\times p)={\bf f}((i/c_i)\times(c_i\times p))={\bf f}(i/c_i)\times{\bf f}(c_i\times p)。
接下来介绍几个与{\bf \varphi}(n)和{\bf \sigma}_k(n)有关的性质。
1.{\bf \varphi}(n)=n\prod\limits_{i=1}^m(1-\dfrac{1}{p_i}),其中p_1,p_2,p_3,\cdots,p_m为n的所有互不相同的质因数。
2.{\bf \varphi}(p^k)=p^k-p^{k-1}(直接数个数即可)
3.若n>2,则2\mid {\bf \varphi}(n)。
分类讨论即可。若2\mid n显然成立。
若2\nmid n则n没有质因数2,用公式就能推知2\mid {\bf \varphi}(n)。
4.\sum\limits_{i=1}^ni[i\perp n]=\dfrac{n{\bf \varphi}(n)+[n=1]}{2}(在莫比乌斯反演应用篇中会进行证明)
5.a\perp n\Rightarrow a^{\varphi(n)}\equiv1\pmod{n}(欧拉定理)
6.b>\varphi(m)\Rightarrow a^b\equiv a^{b\bmod \varphi(m)+\varphi(m)}\pmod{m}(扩展欧拉定理,又称降幂公式)
7.\sum\limits_{d\mid n}\varphi(d)=n(欧拉反演)
非常有用的公式。在之后推式子的时候用这个有时候比用莫比乌斯反演不知道快到哪里去了。
给一个证明:
定义数论函数{\bf f}(n)=\sum\limits_{d\mid n}\varphi(d)。
首先证明这是个积性函数。
{\bf f}(n){\bf f}(m)=\left(\sum\limits_{i\mid n}\varphi(i)\right)\left(\sum\limits_{j\mid m}\varphi(j)\right)=\sum\limits_{i\mid n}\sum\limits_{j\mid m}\varphi(i)\varphi(j)=\sum\limits_{i\mid n}\sum\limits_{j\mid m}\varphi(ij)=\sum\limits_{d\mid nm}\varphi(d)={\bf f}(nm)
接下来进行具体计算。
{\bf f}(p^k)=\sum\limits_{i=0}^k\varphi(p^i)=\sum\limits_{i=0}^k(p^k-p^{k-1})=p^k
然后对于任意合数n,分解质因数再相乘就有{\bf f}(n)=n,即\sum\limits_{d\mid n}\varphi(d)=n。
接下来是\sigma_k(x)。
8.\sigma_x(p^k)=\sum\limits_{i=0}^k(p^i)^x=\sum\limits_{i=0}^k(p^x)^i=\dfrac{(p^x)^{k+1}-1}{p^x-1}
9.\sigma_x(n)=\prod\limits_{i=1}^m\dfrac{(p_i^x)^{a_i+1}-1}{p_i^x-1}
10.\sum\limits_{i=1}^n\sigma_k(i)=\sum\limits_{i=1}^ni^k\times\left\lfloor\dfrac{n}{i}\right\rfloor(著名的除数函数求和)
10. 原根#
这一章基本上都是结论性的东西。
首先不加证明地介绍两个定理:
1.拉格朗日定理:设p为质数,则模p意义下的整系数多项式f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots+a_0的同余方程f(x)\equiv0\pmod{p}在模p意义下至多有n个不同的解。
2.欧拉定理:\gcd(a,m)=1\Rightarrow a^{\varphi(m)}\equiv1\pmod{m}
接下来引入数论中阶和原根的概念:
阶:满足同余式a^n\equiv1\pmod{m}的最小正整数n被称为a模m的阶,记作\delta_m(a)(也有人记作\text{ord}_ma)
原根:若\gcd(a,m)=1且\delta_m(a)=\varphi(m),则称a为模m的原根。
接下来不加证明地给出若干阶和原根的性质。就是不会证
1.a^n\equiv1\pmod{m}\Rightarrow\delta_m(a)\mid n
2.若\gcd(a,m)=\gcd(b,m)=1,则\delta_m(ab)=\delta_m(a)\delta_m(b)\Longleftrightarrow\gcd(\delta_m(a),\delta_m(b))=1
3.\gcd(a,m)=1\Rightarrow\delta_m(a^k)=\dfrac{\delta_m(a)}{\gcd(\delta_m(a),k)}
4.只有2,4,p^{\alpha},p^{2\alpha}有原根(p为奇素数)。
5.若n存在原根,则原根的数量为\varphi(\varphi(n))。
6.n的最小原根是不多于\sqrt[4]{n}级别的。
7.所有的原根都可以由最小原根的若干次乘方得到。
接下来是求所有原根的操作:
1.线性筛\varphi(n)。
2.将\varphi(n)分解质因数(第一步中已经筛出了质数,故这里分解质因数会快一些,可达到O(\dfrac{\sqrt{n}}{log n}))
3.找最小原根。从小到大枚举并检验。利用与阶和原根性质1类似的性质。
枚举\varphi(n)的质因数,如果有a^{\varphi(n)/p}\equiv1(mod n)则该数不是原根。
4.枚举所有满足\gcd(s,\varphi(n))的指数s,则g^s\bmod n为原根。(这两步都可以利用第二步优化复杂度)
5.排序输出。
时间复杂度大概是O(n\log n),也有更加优秀的O(n)的做法,但一般情况下O(n\log n)就够用了。
11. 二次剩余与n次剩余#
二次剩余:
模意义开根。就是解方程x^2\equiv n\pmod{p}。这里讨论p是奇素数的情况。
由原根一节中的拉格朗日定理,这个方程在模p意义下至多有两个解。
如果存在x满足上面的式子,那么称n是模p的二次剩余。如果存在二次剩余,那么二次剩余的数量为\dfrac{p-1}{2}。
定义勒让德符号\left(\dfrac{n}{p}\right):
如果p\mid n,则\left(\dfrac{n}{p}\right)=0。
如果n是模p的二次剩余,则\left(\dfrac{n}{p}\right)=1。
如果n不是模p的二次剩余,则\left(\dfrac{n}{p}\right)=-1。
二次剩余有一些性质:
\left(\dfrac{a}{p}\right)\left(\dfrac{b}{p}\right)=\left(\dfrac{ab}{p}\right)(完全积性)
a\equiv b\pmod{p}\Rightarrow \left(\dfrac{a}{p}\right)=\left(\dfrac{b}{p}\right)(p-周期性)
\left(\dfrac{a^2}{p}\right)=1(显然)
\left(\dfrac{q}{p}\right)\left(\dfrac{p}{q}\right)=(-1)^{(p-1)(q-1)/4}(著名的二次互反律,这里p,q都为奇素数)
同时二次互反律还有所谓的“第一补充”和“第二补充”。不过这些都没有用
真正有用的东西:
\left(\dfrac{n}{p}\right)\equiv n^{(p-1)/2}\pmod{p}(欧拉判别准则)
接下来介绍解同余方程x^2\equiv n\pmod{p}(p为奇素数)的Cipolla算法。
首先应用欧拉判别准则判断是否有解。
随机找一个a使得\left(\dfrac{a^2-n}{p}\right)=-1。
由于二次剩余和二次非剩余都有\dfrac{p-1}{2}个,所以期望随机两次就能找到满足条件的a。
接下来就玄学了:扩展数域,定义i^2\equiv a^2-n\pmod{p}。
我们来研究几个简单的性质:
(a+b)^p\equiv a^p+b^p\pmod{p},这个二项式展开就能证明。
i^p\equiv i(i^2)^{(p-1)/2}\equiv i(a^2-n)^{(p-1)/2}\equiv p-i\pmod{p}
则(a+i)^{p+1}\equiv(a^p+i^p)(a+i)\equiv(a-i)(a+i)\equiv a^2-i^2\equiv n\pmod{p}
于是(a+i)^{(p+1)/2}和p-(a+i)^{(p+1)/2}即为解。
最后证明解的虚部一定为0。
反证法,设存在(A+Bi)^2\equiv n\pmod{p}且B在模p意义下不为0。
展开得A^2+B^2(a^2-n)-n\equiv p-2ABi\pmod{p}
左边无虚部,于是右边也无虚部。即AB\equiv0\pmod{p},则A\equiv0\pmod{p}。
则B^2i^2\equiv n\pmod{p},则i^2\equiv nB^{-2}\pmod{p}。
由i^2的定义:nB^{-2}\equiv a^2-n\pmod{p}。
但是\left(\dfrac{a^2-n}{p}\right)=-1,a^2-n不是二次剩余。
于是产生矛盾,于是解的虚部一定为0。
n次剩余先咕咕咕了。
12. 狄利克雷卷积与莫比乌斯反演(理论篇)#
太长了,放到这里了。
13. 狄利克雷卷积与莫比乌斯反演(应用篇)#
同样太长了,放到这里了。
14. 积性函数前缀和再进阶#
数论部分就先写这些了。
作者:pjykk
出处:https://www.cnblogs.com/pjykk/p/14358354.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理