后续:数论整理(代码篇)
当然有的证明因为水平所限不是那么的严谨……
编号不一定与代码篇中的一致。
顺序可能会有点奇怪(笑
建议阅读顺序:1-2-9-3-4-5-7-8-6-10-11-12-13-14
参考资料:可以认为是各道模板的题解
目前这一篇除了n次剩余和积性函数前缀和都已经更完了。
1. 快速幂和光速幂
这个不应该算数论(
快速幂:
快速求出(a^b mod p)的值。
递归实现原理:
当(b)为偶数时,(a^b=(a^{b/2})^2)
当(b)为奇数时,(a^b=(a^{lfloor b/2
floor})^2 imes a)
递归实现会出现爆栈等问题。
迭代实现快速幂:其实和递归实现的也没什么区别。
时间复杂度(O(log b))。
光速幂:
快速求出:(x^{a_1}mod p,x^{a_2}mod p,cdots,x^{a_n}mod p)的值。
其实是一种暴力预处理的做法……
首先我们任取一个(S)。
预处理(x^1,x^2,cdots,x^S)和(x^S,x^{2S},cdots,x^{lfloor y/S
floor*S})。
其中(y=max{a_i})。
然后(x^k=x^{kpmod S} imes x^{lfloor k/S
floor*S}),于是可以做到(O(1))查询。
时间复杂度(O(S+dfrac{y}{S}+n)),(S)取(sqrt{y})时最优为(O(sqrt{y}+n))。
(y)过大时可用扩展欧拉定理降幂。
2. 最大公因数和最小公倍数与质数筛
关于欧几里得算法:
证明(gcd(a,b)=gcd(b,a ext{ mod }b)quad(a>b)):
只需证明(a,b)的公因数与(b,a ext{ mod }b)的公因数相等即可。
设(a=kb+r),则(r=a ext{ mod }b)
设(d)是(a,b)的公因数,则(dmid a,dmid b)
则(dmid kb+r),又因为(dmid b)故(dmid r)
于是(d)是(b,r)的公因数即(b,a ext{ mod }b)的公因数,
即(a,b)的公因数是(b,a ext{ mod }b)的公因数。
若有(dmid b,dmid r)同样可得(dmid kb+r)即(dmid a)
于是(b,a ext{ mod }b)的公因数也是(a,b)的公因数。
于是(a,b)的公因数与(b,a ext{ mod }b)的公因数相等。
于是(gcd(a,b)=gcd(b,a ext{ mod }b)quad(a>b))。
时间复杂度(O(log max{a,b}))。
最小公倍数的求法:
证明(gcd(a,b) imes lcm(a,b)=ab):
设有质数(p)满足(p^n||a)且(p^m||b)
有(p^{n+m}||ab)
又因为(p^min{n,m}||gcd(a,b)),(p^max{n,m}||lcm(a,b))
故(p^{min{n,m}+max{n,m}}||gcd(a,b) imes lcm(a,b))
即(p^{n+m}||gcd(a,b) imes lcm(a,b))
于是(gcd(a,b) imes lcm(a,b)=ab)
时间复杂度(O(logmax{a,b}))。
质数筛:
顾名思义,这是用来筛出(n)以内的质数的。
筛法1:埃氏筛
需要一个vis数组标记合数。
从2开始枚举。
当前的数如果未被标记为合数,那么它就是质数。否则继续枚举下一个质数。
设当前的数为(i)(注意这个(i)一定为质数)。显然(i^2)之前的数都已经被判断过。
我们从(i^2)开始枚举(i)的倍数,并将其标记为合数。
最终,未被标记过的数字就是质数。(1除外)
注意到有的数会被重复标记。
可以证明时间复杂度为(O(nloglog n))。
一般来说和(O(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))这个式子即可。对于一般的二元一次不定方程求完答案之后扩倍即可。
设(egin{cases}a'=b\b'=a ext{ mod }bend{cases})
我们知道(gcd(a,b)=gcd(b,a ext{ mod }b)=gcd(a',b')),
于是方程(a'x'+b'y'=gcd(a,b))一定有整数解。
将(a')和(b')的定义式代入,有
(egin{aligned}a'x'+b'y'&=gcd(a,b)\bx'+(a ext{ mod }b)y'&=gcd(a,b)\bx'+left(a-leftlfloordfrac{a}{b}
ight
floor imes b
ight)y'&=gcd(a,b)\bx'+ay'-leftlfloordfrac{a}{b}
ight
floor imes b imes y'&=gcd(a,b)\ay'+bleft(x'-leftlfloordfrac{a}{b}
ight
floor imes y'
ight)&=gcd(a,b)end{aligned})
与原式对比,有
(egin{cases}x=y'\y=x'-leftlfloordfrac{a}{b}
ight
floor imes yend{cases})
也就是说,我们完全可以先解出方程(a'x'+b'y'=gcd(a,b)),然后再用这个新方程的解来表示原方程的解。
另外,在(b=0)时原方程有显然解(egin{cases}x=1\y=0end{cases})
于是我们就可以运用欧几里得算法的思想来解二元一次不定方程组。
这个操作被称为扩展欧几里得(exgcd)。时间复杂度(O(logmax{a,b}))。
我们求得了特殊解,接下来讨论通解。
设我们已经获得了一组解(egin{cases}x=x_0\y=y_0end{cases})
那么显然(egin{cases}x=x_0pm b\y=y_0mp aend{cases})也是一组解。
于是我们就能获得原方程的所有整数解了。
4. 逆元
定义:如果有一个数(a)满足(maequiv 1pmod{p}),
那么称(a)是(m)在模(p)意义下的逆元,记作(m^{-1})。
注意逆元可能不存在。
逆元满足完全积性。
证明:显然((a imes a^{-1})(b imes b^{-1})equiv 1pmod{p})
乘法结合律得((ab)(a^{-1}b^{-1})equiv 1pmod{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(nlog p))的(n)次exgcd。
考虑一个显然的式子:(p ext{ mod }k imes (p ext{ mod }k)^{-1}equiv -1pmod{p})
我们将那个(p ext{ mod }k)拆开。
(egin{aligned}left(p-leftlfloordfrac{p}{k}
ight
floor imes k
ight) imes(p ext{ mod }k)^{-1}&equiv1pmod{p}\p imes(p ext{ mod }k)^{-1}-leftlfloordfrac{p}{k}
ight
floor imes k imes(p ext{ mod }k)^{-1}&equiv1pmod{p}end{aligned})
(p)的倍数模(p)肯定是(0),于是所有(p)的乘积项都可以任意添加和消去。
(left(p-leftlfloordfrac{p}{k}
ight
floor
ight) imes k imes(p ext{ mod }k)^{-1}equiv1pmod{p})
同余号两边同乘(k^{-1}),大功告成。
(left(p-leftlfloordfrac{p}{k}
ight
floor
ight) imes(p ext{ mod }k)^{-1}equiv k^{-1}pmod{p})
于是我们用(p ext{ mod }k)的逆元求出了(k)的逆元。
(p ext{ mod }k)显然小于(k),于是这个式子是可以用于递推的。时间复杂度(O(n))。
阶乘逆元:
这个要简单许多。
利用(a!=(a-1)! imes a),
显然(((a-1)! imes a)^{-1}equiv (a!)^{-1}pmod{p})
利用逆元的完全积性拆开:
((a-1)!^{-1} imes 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} imes a_i)。
这样我们求出了所有的(s_i^{-1})。
最后查询的时候,有(a_i^{-1}=s_{i-1} imes s_i^{-1})。
时间复杂度(O(n+log p))。
5. CRT与exCRT
都是解一次同余方程组的利器。时间复杂度也都是(O(nlog n))。
考虑一次同余方程组(egin{cases}xequiv r_1pmod{m_1}\xequiv r_2pmod{m_2}\cdots\x&equiv r_npmod{m_n}end{cases})
当(m_1,m_2,cdots,m_n)两两互质时:
构造:(egin{cases}M=prodlimits_{i=1}^nm_i\M_i=dfrac{M}{m_i}\M_iK_iequiv1pmod{m_i}end{cases})
于是原方程有整数解(x=sumlimits_{i=1}^nr_iM_iK_i)。代入即可验证。
这种构造特殊同余方程组解的方法叫做CRT(中国剩余定理)。
但要是模数不两两互质呢?
那只能暴力合并了。
假设我们已经解出了前((i-1))个方程。
记前(i)个方程的解为(ans_i),前(i)个模数的最小公倍数为(lcm_i)。
考虑方程组:(egin{cases}ans_iequiv ans_{i-1}pmod{lcm_{i-1}}\ans_iequiv r_ipmod{m_i}end{cases})
由第一个方程,我们有(ans_i=ans_{i-1}+k imes lcm_{i-1}),将这个式子代入第二个方程:
(ans_{i-1}+k imes lcm_{i-1}equiv r_ipmod{m_i})
解出(k)(就是解不定方程(lcm_{i-1} imes k+m_i imes y=r_i-ans_{i-1}))
如果这个方程无解那么整个方程组就都无解了。
然后计算出(ans_i),则方程被合并为(xequiv ans_ipmod{lcm_i})。
最后的解就是(xequiv ans_npmod{lcm_n})。
这种暴力合并方程组的操作就叫做exCRT。当然exCRT的常数大一些。
6. Lucas定理与exLucas
这两个东西都是用来计算组合数的,但鉴于计算方法与数论有关就放到这里了
Lucas定理:(C_a^bequiv C_{a ext{ mod }p}^{b ext{ mod }p} imes C_{lfloor a/p
floor}^{lfloor b/p
floor}pmod{p})(不会证明)
仅当(p)为质数时成立。
Lucas定理用于模数(p)是小质数时快速计算组合数。
不做预处理时间复杂度(O(plog_pa)),做好预处理可以优化到(O(p+log_pa))。
接下来讨论更一般的exLucas。
exLucas其实和Lucas定理没什么关系QwQ
首先提醒一下:exLucas很麻烦,虽然时间复杂度比较优秀但是几乎没人写(
直接考虑组合数计算式
(C_m^n ext{ mod }p=dfrac{m!}{(m-n)!n!} ext{ mod }p)
其中(p)不一定为质数。但是我们只需要根据唯一分解定理拆开(p),最后再CRT合并就行。
也就是说令(p=prod {p_i}^{c_i}),我们只需要计算出每个(dfrac{m!}{(m-n)!n!} ext{ mod }{p_i}^{c_i})即可。
先考虑一个式子(dfrac{m!}{(m-n)!n!} ext{ mod }{p_k}^{c_k})
然后我们尴尬地发现这些阶乘的逆元可能不存在。。。
但问题不大,我们把每项所含的(p_k)全都除掉就行了(
定义(f(n)=dfrac{n!}{p_k^x}),并保证(p_k
mid f(n))。
再定义(g(n)=x),(x)的意义同上。
于是,原式变成了
(dfrac{f(m)}{f(m-n)f(n)} imes p_k^{g(m)-g(n)-g(m-n)} ext{ mod }{p_k}^{c_k})
于是我们的任务变成了求出(f(n) ext{ mod }{p_k}^{c_k})和(g(n) ext{ mod }{p_k}^{c_k}),
更要命的是求出了(g(n))对于求(f(n))没有半点作用。。。因为逆元还是不存在。。。
不慌,一点一点求。
先求(f(n))。
考虑(n! ext{ mod }{p_k}^{c_k})。
(n!=1 imes 2 imes 3 imescdots imes n),将(p_k)拆出来:
(n!={p_k}^{lfloor n/p_k
floor} imes lfloor n/p_k
floor! imesprod_{i=1}^n[p_k
mid i] imes i)
因为将条件都堆在求积号下面太难看了,就用了艾弗森括号。
为了保护眼睛,记(prod(a,b)=prod_{i=a}^b[p_k
mid i] imes i)。
后面的那一大堆乘积还是有循环节,再将它拆开。
(prod(1,n)=prod(1,{{p_k}^{c_k}})^{lfloor n/{p_k}^{c_k}
floor} imes prod({p_k}^{c_k}cdotlfloor n/{p_k}^{c_k}
floor,n))
式子看上去很难看,但确实不能再化简了。
于是(f(n)=f(lfloor n/p_k
floor) imes prod(1,n)),边界条件(f(0)=1)。
(g(n))能简单一些,可以直接无视掉(prod(1,n))。
(g(n)=lfloor n/p^k
floor+g(lfloor n/p^k
floor))
边界条件:当(n<p^k)时(g(n)=0)。
综上所述,我们以一种十分暴力的方式解决了求组合数的问题。
时间复杂度比较玄学,大概为(O(p)),常数略大。
7. BSGS与exBSGS
BSGS用于解同余方程(A^xequiv Bpmod{C}),其中(gcd(A,C)=1)。
首先考虑暴力做法:
我们发现这个(A^x ext{ mod }C)是有循环节的。
由费马小定理,(A^{C-1}equiv 1pmod{C})。
也就是说我们只需要枚举位于([0,C-1))之间的(A)就行了。
时间复杂度(O(C)),不够优秀。
但是如果我们设(x=i imessqrt{C}-jquad(jin [0,sqrt{C}))),并将其代入原式:
(A^{i imessqrt{C}-j}equiv Bpmod{C})
(gcd(A,C)=1)保证了逆元存在,于是原式变形为(dfrac{A^{i imessqrt{C}}}{A^j imes B}equiv 1pmod{C})
也就是说(A^{i imessqrt{C}}=A^j imes B)时得出解。
接下来就简单了,预处理(A^j imes B ext{ mod }Cquad(jin [0,sqrt{C}))),存到哈希表里;
然后枚举(iin[1,sqrt{C}])查询即可。
时间复杂度(O(sqrt{C}))。
但是有时候(C)会为任意数,这是我们就需要使用(exBSGS)。
首先特判几种情况。
若(B=1),则(x=0);
若(A=0),则当(B=0)时可取(x=1),当(B
eq0)时无解。
题目中没有了互质,那我们就来创造互质。
设(g=gcd(A,C))。
注意到这时原同余方程相当为(A^x+kC=B)。
根据裴蜀定理,必须有(gmid 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 1pmod{p})。
但是这个定理的逆定理是不成立的,存在一类伪素数(p),使得对于每一个小于(p)的(a),都有(a^{p-1}equiv 1pmod{p})。
于是我们要用到二次探测定理。
若(x^2equiv 1pmod{p}),则(xequiv 1pmod{p})或(xequiv p-1pmod{p})。
这个证明起来非常简单,只要一次平方差公式就行。
接下来我们应用这两个判定方法来判断(p)是否为质数。(更准确地说,是判断是不是合数)
首先我们随机选一个数(x),进行费马测试。
也就是说,如果(x^{p-1}equiv 1pmod{p})不成立,那么(p)一定不是质数。
接下来,我们进行二次探测。
若(2mid p-1),(如果不成立就判断不出来,直接返回)根据刚刚费马测试得出的结果,我们有((x^{(p-1)/2})^2equiv 1pmod{p})。
这时式子就变成了二次探测的标准形式。
讨论(x^{(p-1)/2}mod 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)mod N)。
rand一个(x_1),然后让(x_2=f(x_1),x_3=f(x_2)),以此类推。
但是我们发现这个数列是有循环节的,大致呈一个(
ho)形。(所以说这个算法叫做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)。
(nperp m):表示(n)与(m)互质,即(gcd(n,m)=1)。
数论函数用加粗的小写字母 或 希腊字母表示。
一般来说(p,q)表示质数。另有说明的除外。
数论函数:定义域为正整数,陪域为复数的一类函数。
积性函数:满足:(nperp mRightarrow {f f}(nm)={f f}(n){f f}(m))的数论函数。
完全积性函数:满足:({f f}(nm)={f f}(n){f f}(m))的数论函数。
注意:由积性函数的定义,({f f}(1 imes1)={f f}(1){f f}(1)),即有({f f}(1)=1)(不考虑({f f}(1)=0),那样相当于({f f}(n)equiv0))。
接下来介绍常见的积性函数:
幂函数:({f id}_k(n)=n^k),特别地,当(k=1)时为恒等函数({f id}(n)=n),当(k=0)时为常数函数({f 1}(n)=1)。
单位函数:({f varepsilon}(n)=[n=1])
事实上,这两个函数都是完全积性函数。
欧拉函数:({f varphi}(n)=sumlimits_{i=1}^n[iperp n])
除数函数:({f sigma}_k(n)=sumlimits_{dmid n}d^k)(注意(k)的位置,({f sigma}_k(n)
eq{f sigma}^k(n)))
特别地,当(k=1)时为除数和函数({f sigma}(n)),当(k=0)时为除数个数函数({f d}(n))(或记作({f au}(n)))
莫比乌斯函数:({f mu}(n)=egin{cases}(-1)^k,n=p_1p_2p_3cdots p_k\0, ext{otherwise}end{cases})
积性函数线性筛:
积性函数特有的科技。
每一个积性函数的求值,通过分解质因数都能转化为计算({f f}({p_i}^{k_i}))的值。
于是我们考虑在线性筛中计算积性函数的值。由之前的讨论知({f f}(1)=1),于是我们只需讨论({f f}(2))到({f f}(n))的值即可。
为了方便计算,我们定义(c_i)表示(i)的最小质因子的指数次幂,即({p_1}^{k_1})。(这可不是积性函数)
注意当(i)为质数次幂时,有(c_i=i)。
再次考虑线性筛的过程,我们发现线性筛中分了几种情况来讨论。
设当前枚举到的值为(i)。
若(i)为质数:直接算出({f f}(i)),并且(c_i=i)。
我们知道(n)以内有(O(dfrac{n}{log n}))个质数,因此当前计算({f f}(i))的时间复杂度单次不能超过(O(log i))。
接下来是枚举质数,我们设当前枚举到的质数为(p)。
若(i
mid p),则(iperp p)。于是直接根据积性函数定义有({f f}(i imes p)={f f}(i){f f}(p)),并且(c_{i imes p}=p)。
若(imid p),此时必有(c_{i imes p}=c_i imes p)。
为了更好地进行计算,我们再分两种情况讨论:
若(c_i=i),即(i=p^k):
暴力算出({f f}(i imes p)),即({f f}(p^{[log i/log p]+1})),或者通过({f f}(i))递推。
与质数的情形一样,我们也要求算({f f}(i imes p))的单次时间复杂度不超过(O(log(i imes p)))。
若(c_i
eq i):
这时(c_i)就派上用场了。我们知道在线性筛中,一个数只能被它的最小质因子筛掉。于是有(c_i=p^k)。
则({f f}(i imes p)={f f}(c_i imes(i/c_i) imes p)={f f}((i/c_i) imes(c_i imes p))={f f}(i/c_i) imes{f f}(c_i imes p))。
接下来介绍几个与({f varphi}(n))和({f sigma}_k(n))有关的性质。
1.({f varphi}(n)=nprodlimits_{i=1}^m(1-dfrac{1}{p_i})),其中(p_1,p_2,p_3,cdots,p_m)为(n)的所有互不相同的质因数。
2.({f varphi}(p^k)=p^k-p^{k-1})(由公式直接得出)
3.若(n>2),则(2mid {f varphi}(n))。
分类讨论即可。若(2mid n)显然成立。
若(2
mid n)则(n)没有质因数(2),用公式就能推知(2mid {f varphi}(n))。
4.(sumlimits_{i=1}^ni[iperp n]=dfrac{n{f varphi}(n)+[n=1]}{2})(在莫比乌斯反演应用篇中会进行证明)
5.(aperp nRightarrow a^{varphi(n)}equiv1pmod{n})(欧拉定理)
6.(b>varphi(m)Rightarrow a^bequiv a^{bmod varphi(m)+varphi(m)}pmod{m})(扩展欧拉定理,又称降幂公式)
7.(sumlimits_{dmid n}varphi(d)=n)(欧拉反演)
非常有用的公式。在之后推式子的时候用这个有时候比用莫比乌斯反演不知道快到哪里去了。
给一个证明:
定义数论函数({f f}(n)=sumlimits_{dmid n}varphi(d))。
首先证明这是个积性函数。
({f f}(n){f f}(m)=left(sumlimits_{imid n}varphi(i)
ight)left(sumlimits_{jmid m}varphi(j)
ight)=sumlimits_{imid n}sumlimits_{jmid m}varphi(i)varphi(j)=sumlimits_{imid n}sumlimits_{jmid m}varphi(ij)=sumlimits_{dmid nm}varphi(d)={f f}(nm))
接下来进行具体计算。
({f f}(p^k)=sumlimits_{i=0}^kvarphi(p^i)=sumlimits_{i=0}^k(p^k-p^{k-1})=p^k)
然后对于任意合数(n),分解质因数再相乘就有({f f}(n)=n),即(sumlimits_{dmid n}varphi(d)=n)。
接下来是(sigma_k(x))。
8.(sigma_x(p^k)=sumlimits_{i=0}^k(p^i)^x=sumlimits_{i=0}^k(p^x)^i=dfrac{(p^x)^{k+1}-1}{p^x-1})
9.(sigma_x(n)=prodlimits_{i=1}^mdfrac{(p_i^x)^{a_i+1}-1}{p_i^x-1})
10.(sumlimits_{i=1}^nsigma_k(i)=sumlimits_{i=1}^ni^k imesleftlfloordfrac{n}{i}
ight
floor)(著名的除数函数求和)
10. 原根
这一章基本上都是结论性的东西。
首先不加证明地介绍两个定理:
1.拉格朗日定理:设(p)为质数,则模(p)意义下的整系数多项式(f(x)=a_nx^n+a_{n-1}x^{n-1}+cdots+a_0)的同余方程(f(x)equiv0pmod{p})在模(p)意义下至多有(n)个不同的解。
2.欧拉定理:(gcd(a,m)=1Rightarrow a^{varphi(m)}equiv1pmod{m})
接下来引入数论中阶和原根的概念:
阶:满足同余式(a^nequiv1pmod{m})的最小正整数(n)被称为(a)模(m)的阶,记作(delta_m(a))(也有人记作( ext{ord}_ma))
原根:若(gcd(a,m)=1)且(delta_m(a)=varphi(m)),则称(a)为模(m)的原根。
接下来不加证明地给出若干阶和原根的性质。就是不会证
1.(a^nequiv1pmod{m}Rightarrowdelta_m(a)mid n)
2.若(gcd(a,m)=gcd(b,m)=1),则(delta_m(ab)=delta_m(a)delta_m(b)Longleftrightarrowgcd(delta_m(a),delta_m(b))=1)
3.(gcd(a,m)=1Rightarrowdelta_m(a^k)=dfrac{delta_m(a)}{gcd(delta_m(a),k)})
4.只有(2,4,p^{alpha},p^{2alpha})有原根((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^smod n)为原根。(这两步都可以利用第二步优化复杂度)
5.排序输出。
时间复杂度大概是(O(nlog n)),也有更加优秀的(O(n))的做法,但一般情况下(O(nlog n))就够用了。
11. 二次剩余与n次剩余
二次剩余:
模意义开根。就是解方程(x^2equiv npmod{p})。这里讨论(p)是奇素数的情况。
由原根一节中的拉格朗日定理,这个方程在模(p)意义下至多有两个解。
如果存在(x)满足上面的式子,那么称(n)是模(p)的二次剩余。如果存在二次剩余,那么二次剩余的数量为(dfrac{p-1}{2})。
定义勒让德符号(left(dfrac{n}{p}
ight)):
如果(pmid n),则(left(dfrac{n}{p}
ight)=0)。
如果(n)是模(p)的二次剩余,则(left(dfrac{n}{p}
ight)=1)。
如果(n)不是模(p)的二次剩余,则(left(dfrac{n}{p}
ight)=-1)。
二次剩余有一些性质:
(left(dfrac{a}{p}
ight)left(dfrac{b}{p}
ight)=left(dfrac{ab}{p}
ight))(完全积性)
(aequiv bpmod{p}Rightarrow left(dfrac{a}{p}
ight)=left(dfrac{b}{p}
ight))((p-)周期性)
(left(dfrac{a^2}{p}
ight)=1)(显然)
(left(dfrac{q}{p}
ight)left(dfrac{p}{q}
ight)=(-1)^{(p-1)(q-1)/4})(著名的二次互反律,这里(p,q)都为奇素数)
同时二次互反律还有所谓的“第一补充”和“第二补充”。不过这些都没有用
真正有用的东西:
(left(dfrac{n}{p}
ight)equiv n^{(p-1)/2}pmod{p})(欧拉判别准则)
接下来介绍解同余方程(x^2equiv npmod{p})((p)为奇素数)的Cipolla算法。
首先应用欧拉判别准则判断是否有解。
随机找一个(a)使得(left(dfrac{a^2-n}{p}
ight)=-1)。
由于二次剩余和二次非剩余都有(dfrac{p-1}{2})个,所以期望随机两次就能找到满足条件的(a)。
接下来就玄学了:扩展数域,定义(i^2equiv a^2-npmod{p})。
我们来研究几个简单的性质:
((a+b)^pequiv a^p+b^ppmod{p}),这个二项式展开就能证明。
(i^pequiv i(i^2)^{(p-1)/2}equiv i(a^2-n)^{(p-1)/2}equiv p-ipmod{p})
则((a+i)^{p+1}equiv(a^p+i^p)(a+i)equiv(a-i)(a+i)equiv a^2-i^2equiv npmod{p})
于是((a+i)^{(p+1)/2})和(p-(a+i)^{(p+1)/2})即为解。
最后证明解的虚部一定为(0)。
反证法,设存在((A+Bi)^2equiv npmod{p})且(B)在模(p)意义下不为(0)。
展开得(A^2+B^2(a^2-n)-nequiv p-2ABipmod{p})
左边无虚部,于是右边也无虚部。即(ABequiv0pmod{p}),则(Aequiv0pmod{p})。
则(B^2i^2equiv npmod{p}),则(i^2equiv nB^{-2}pmod{p})。
由(i^2)的定义:(nB^{-2}equiv a^2-npmod{p})。
但是(left(dfrac{a^2-n}{p}
ight)=-1),(a^2-n)不是二次剩余。
于是产生矛盾,于是解的虚部一定为(0)。
n次剩余先咕咕咕了。
12. 狄利克雷卷积与莫比乌斯反演(理论篇)
太长了,放到这里了。
13. 狄利克雷卷积与莫比乌斯反演(应用篇)
同样太长了,放到这里了。
14. 积性函数前缀和再进阶
数论部分就先写这些了。