【学习笔记】数论

哈哈。

正确性和复杂度的证明没给就是不会或者懒得写。

基础式子,定义

xy 代表 x 整除 yxy 的因数。

多个数最大的公因数用 gcd(a1,a2,,an) 表示。

(x,y) 表示 gcd(x,y)[x,y] 表示 \lcm(x,y)

[x] 中如果 x 为关系式,若 x 成立则 [x]=1,否则 [x]=0

积性函数

若函数 f(n) 满足 f(1)=1 且对于任何 (i,j)=1,有 f(i×j)=f(i)×f(j),则称 f(n) 为积性函数。

更甚,若函数 f(n) 满足 f(1)=1 且对于任意 i,j 都有 f(i×j)=f(i)×f(j),则称 f(n) 为完全积性函数。

f(x),g(x) 均为积性函数,那么以下函数皆为积性函数:

  • h(x)=f(xp),这个应该很简单,令 x=i×j(i,j)=1,那么 (ip,jp)=1。所以 f(xp) 是积性函数,
  • h(x)=fp(x)fp(x) 定义是 f(x) 这个值的 p 次方,这个应该也很简单,每一个 f(x)=f(i)f(j),那么它们的 p 次方 fp(x)=fp(i)fp(j),也即 h(x)=h(i)h(j)
  • h(x)=f(x)g(x),这个显然吧。
  • h(x)=k|xf(k)g(xk)。挺好记的记就好了。

有一些常用的函数如下:

  • 单位函数 ε(n)=[n=1],完全积性。卷积中有用。
  • 恒等函数 idk(n)=nk,完全积性,其中 id1(n) 简记为 id(n)
  • 常数函数 1(n)=1,完全积性。
  • 除数函数 σk(x)=i|xik,其中 σ0(x) 代表 x 的因子个数,简记为 d(x)σ1(x) 代表 x 的因子和,简记为 σ(x)。积性。对于 d(x×y) 还有一个特殊性质:d(xy)=i|xj|y[gcd(i,j)=1]=k|x,k|yμ(k)d(xk)d(yk)

main

欧几里得定理

gcd(a,b)=gcd(b,amodb)。其实挺简单,懒得证。

可以用来求两个数的 gcd,复杂度 O(logmax(a,b))

Il int gcd(int x,int y){return (y?gcd(y,x%y):x);}

扩展欧几里得算法(扩欧,exgcd)

给定 a,b,求 ax+by=gcd(a,b) 的任意一组整数解。

ax1+by1=gcd(a,b),假设有方程 bx2+(amodb)y2=gcd(b,amodb)

由欧几里得定理 gcd(a,b)=gcd(b,amodb),所以 ax1+by1=bx2+(amodb)y2

amodb=aab×b,代进去:

ax1+by1=bx2+ay2(ab×b)y2=ay2+b(x2aby2)

所以我们如果得到了 x2,y2,那么 x1,y1 的一种可能解就是 y2,x2aby2

所以我们可以考虑递归求,找到一个边界 axk+byk=gcd(a,b) 中的 ba,那么 gcd(a,b)=a,此时的一个解为 x=1,y=0

递归按求 gcd 的方式递归下去,复杂度是 O(logmax(a,b))

扩欧得到的解一定满足 |x|a,|y|b。不会证,可能不补。

裴蜀定理(贝祖定理)

方程 ax+by=c 有整数解当且仅当 gcd(a,b)c

这个很简单,gcd(a,b)axgcd(a,b)bygcd(a,b)ax+by

裴蜀能推广到多个数,不证。

关于逆元

x 在模 p 同余下若有逆元,则 (x,p)=1。证明显然,xx11(modp)xx1=kp+1xx1kp=1,这里面 x,p 都是给定常量,所以根据裴蜀可知这个方程有整数解当且仅当 (x,p)=1。同理逆元可以直接用扩欧来算。

费马小定理

p 为质数且 a,p 互质时有 ap1=1(modp)。可以通过这个加快速幂算逆元。

证明:

  • 先假设有一个序列 A=1,2,,p1,取一个不是 p 的倍数 a,有 Ai=aAi(modp)。先证明这个式子。
  • 也就是所有 a×Ai(modp) 互不相等。考虑反证,假设有 a×Ai=a×Aj(modp),因为 a,p 互质,显然就有 Ai=Aj,产生了冲突。
  • 所以 (p1)!ap1×(p1)!(modp),那么就有 ap11(modp)

欧拉筛(线性筛)

板子会背就行。板子里面在 i0(modprimej) 的时候就跳出标记合数的循环,原因是如果 iprimej 标记了,那么 i 乘上其他质数的答案一定也被 primej 标记了,所以每个合数会且只会被标记一遍。我们在线性筛的过程中能够得到每个合数的最小质因子。

根据数学知识我们知道 1n 的质数约有 nlnn 个,如果我们能做到用不高于 log2 的复杂度对于质数求解答案,对于任意质数 p,任意正整数 k,能做到 O(1) 计算 f(pk),就能做到对于积性函数 f 线性筛出 1n 的答案。

威尔逊定理

学长说没什么用。正整数 p 是质数的充要条件是 (p1)!1(modp)。不证。

卢卡斯定理

用于解决大组合数的取模,式子是 (nm)modp=(npmp)×(nmodpmmodp)modp。要求 p 是质数。后面那个通过预处理阶乘做,前面那个可以继续递归求解,复杂度为 O(p+logp)p 是预处理阶乘的复杂度,logp 是模一个数至少减半,logp 次之后 m 就会变成 0 进入到组合数边界。

中国剩余定理(CRT)

对于 nxai(modpi) 的式子求通解。限制是对于任何 ij,有 (pi,pj)=1。记 P=p,Pi=Ppi,这里不模东西,一般来说可以开到 int128。然后 qiPi 在模 pi 意义下的逆元,那么该方程组有唯一通解 x=i=1naiqiPi(modP)

证明:

  • 对于 ijPi=0(modpi)
  • 此时 xmodpi=j=1n[i==j]ajqjPjmodpi=aiqiPimodpi=ai
  • 所以此时的 x 是方程组的解。唯一性不会证明不证了。

扩展中国剩余定理(exCRT)

普通的 CRT 适用范围太小了,要求过于严格,exCRT 可以基本做到全方面碾压普通 CRT。同样是 O(nlogV) 的复杂度,exCRT 不需要任何限制。

现在我们先考虑只有两个方程 {xa1(modp1)xa2(modp2)。为了方便可以前面多加一个 x0(mod1)。首先可以转化为 x=k1p1+a1=k2p2+a2,移项得 p1k1p2k2=a2a1。这是一个二元一次不定方程,可以用裴蜀判无解然后扩欧求一个方程 p1K1+p2K2=gcd(p1,p2) 的解,那么 k1=K1×a2a1gcd(p1,p2),k2=K2×a2a1gcd(p1,p2)。这个时候我们的 x 就可以等于 k1p1+a1。令这个得到的解为 x0,可以先把它模一下 lcm(p1,p2)。显然它满足上面的方程,那么就能得到 x 的通解 x=x0+k×lcm(p1,p2),即 xx0modlcm(p1,p2)(modlcm(p1,p2))。这时我们把两个方程用 O(logV) 的复杂度合并成了一个方程,这么合并下去就能得到解。

还看到另一种好理解的办法,我们假设已经求出来前 i1 组的答案 la,令 lp=lcm(p1,p2,,pi1),则对于任意整数 xans+lp×x 是前 i1 组的解,所以我们就是想找到一个 x 使得 ans+lp×xai(modpi),爆改一下式子就变成 lp×x+pi×k=aians,扩欧就好。

记得输出时再对答案取一次模,无论在过程中是否有取模。

欧拉函数

φ(x) 表示有多少个 i 满足 1ix,(i,x)=1。这是一个积性函数。显然 φ(1)=1,对于质数 pφ(p)=p1

如果是仅求一个数的欧拉函数值,可以直接在质因子分解的时候做,对于一个包含的质因子 p,每 p 个数中都有一个数的因子包含 p,所以答案乘上 p1p 就好。有 φ(n)=n×pi1pi

然后欧拉函数可以直接筛的。对于 pn 的最小质因子,我们令 t=np,如果 (p,t)=1 那么 φ(n) 可以直接用 φ(t)φ(p) 表示出来。否则我们可以知道 n 中含有不止一个 p,即 n 含有的所有质因子 t 都应该含有。那么 φ(n)=n×pi1pi=p×t×pi1pi=p×φ(t)

注意这里求 gcd 我们只需要知道 t 是否仍然包含 p,可以改成取模,这样就能线性筛出来欧拉函数了。

性质:n=k|nφ(k)。证明用莫反,现在不会,摆了。

性质:对于任意 x>2,都有 φ(x) 是偶数。

证明:

  • 如果 x 是质数,那么 φ(x)=x1 为偶数。否则 φ(x)=x×pi1pi
  • 对于任何 pi2,乘上的 pi1 会让 φ(x) 变成偶数。
  • 如果 x 只有一种质因子 2,因为 x 至少为 4,而上式只能让 x 乘一个 12,仍然是偶数。

根据上面那条性质我们可以得知对一个数 a 一直取 φ(a) 只需要 O(loga) 次就能降到 1

欧拉定理

若有 (a,p)=1,则 aφ(p)1(modp)。可以用这个求逆元。但是求 φ(p) 是根号的,一般题目 p 确定也用不到线性筛,所以单纯用欧拉定理求逆元应该没用。

证明可以参考费马小定理的证明。可以构造一个长度为 φ(p) 的数列 P,每一个数 Pi 就是那个和 p 互质的数,显然对于一个 (a,p)=1aPiPi(modp),同时约掉 Pi 就可以得到欧拉定理的式子。

扩展欧拉定理

能够进行模意义下的光速幂,可以支持在指数过大比如无法存下来的时候将指数 p 化成一个可以支持的范围内,比如 φ(p)

ab{abmodφ(p),                          gcd(a,p)=1ab,                      gcd(a,p)1,b<φ(p)a(bmodφ(p))+φ(p),gcd(a,p)1,bφ(p)(modp)

显然通过这个我们能将指数降到一个 2φ(p) 的可以接受的范围内。至于定理的证明,可能待补,先贴链接

欧拉反演

来自欧拉函数的一个性质 d|nφ(d)=n

感性证明:

  • 假设有 1n,2n,,nnn 个分数,现约分到最简形式。
  • 那么对于分母为 d 的分数 id,有 i,d 互质且 id。我们发现分母为 d 的分数个数就是 φ(d)
  • 因为是约分,所以分母 d 一定满足 d|n,全部加起来就是总分数个数 n

所以把 n 换成其他东西,比如 gcd(x,y),可以得到 d|gcd(x,y)φ(d)=d|x,d|yφ(d)

欧拉反演公式:i=1ngcd(i,n)=i=1nd|n[d|i]φ(d)=d|ni=1n[d|i]φ(d)=d|nndφ(d)。考虑 1n 中是 d 的倍数的数有 nd 个。

拉格朗日定理

对于 n 次同余方程 f(x)=i=0naixi,其最多有 n 个不同解。不证。

na 的阶,当且仅当存在 n 是满足同余式 an1(modm) 的最小正整数,记作 δm(a)

a1,a2,,aδm(a)m 互不同余。

  • 若有 1i<jδmaiaj(modm),则有 aji1(modm)
  • 显然有 1ji<δm(a),与阶最小性相冲突。

由此我们也可以推出若 an1(modm),则 δm(a)|n

A=δm(a),B=δm(b),X=δn(ab),则 X=AB 的充要条件是 (A,B)=1

必要性证明:

  • aA1(modm),bB1(modm) 可得 (ab)[A,B]1(modm)

  • 由前文性质可知 X|[A,B]。又由于 X=AB 所以有 AB|[A,B]。即为 (A,B)=1

充分性证明:

  • 由定义 (ab)X1(modm) 可知 ((ab)X)B1(modm),即 aXB1(modm),所以有 A|XB

  • 又因为有 (A,B)=1 所以有 A|X。同理也有 B|X。所以可以得到 AB|X

  • 另一方面,(ab)AB(aA)B(bB)A1(modm),所以有 X|AB

  • 结合起来得到 X=AB

(a,m)=1,则 δm(ak)=δm(a)(δm(a),k)

原根

启动!?

正整数 g 是正整数 n 的原根,当且仅当 1g<ngn 的阶为 φ(n)

当且仅当 m=2,4,pk,2pk 时,m 拥有至少一个原根,其中 p 是奇质数,不证。

m 的原根个数为 φ(φ(m))。其中最小原根大小不大于 m0.25 级别。令最小原根为 g,则其他原根皆为满足 (i,φ(m))=1,iφ(m)gi

g 为模 m 的原根,则对于任意 φ(m) 质因子 p 都有 gφ(m)p1(modm)

找最小原根直接枚举即可,复杂度不会太大?

库默尔定理

(n+mm) 质因数分解得到质数 p 的个数是 n+mp 进制下进位的次数。不会证。

整除分块(数论分块)

O(n) 计算 i=1nni 之类的。考虑可以对于 ni 相等的 i 一起讨论,显然这是相邻的。分块讨论是 O(n) 块,且值 ni 所在的块的最右段为 nni。较为非常优美的形式。最喜欢的一集。

莫比乌斯函数

定义莫比乌斯函数 μ(x),当 x1 时,取值为 μ(x)=1,当 x 为一个除 1 外的平方数的倍数时,μ(x)=0,其他情况下 μ(x)=(1)ω(x),其中 ω(x) 定义为 x 中本质不同的质因子个数,是一个加性函数,即对于互质的 a,b,有 ω(a)+ω(b)=ω(ab)。可以线性筛出来。比较难以描述,建议直接看代码。

Il void init(){
mu[1]=1;memset(isp,1,sizeof(isp));
for(Ri i=2;i<=n;i++){
if(isp[i])pr[++pn]=i,mu[i]=1;
for(Ri j=1;j<=pn**i*pr[j]<=n;j++){
isp[i*pr[j]]=0;mu[i*pr[j]]=-mu[i];
if(i%pr[j]==0){mu[i*pr[j]]=0;break;}
}
}
return;
}

卷积(狄利克雷卷积)

对于两个数论函数 f(x),g(x),它们的卷积定义为 h(x)=d|xf(d)g(xd),简记为 h=fg。卷积带有交换律:fg=gf。卷积带有结合律:f(gh)=(fg)h。卷积带有分配率:(f+h)g=fg+hg。卷积拥有等式的性质:f=g 的充要条件是 fh=gh,其中 h 满足 h(1)0。积性函数的单位函数 ε 是单位元,也就是令 fε=f 的函数。两个积性函数的卷积也是积性函数。积性函数的逆元定义为 fg=εgg 也是积性函数。

常见的 卷积式:不证。

  • ε=μ1
  • d=11
  • σ=id1
  • φ=μid
  • id=φ1

莫比乌斯反演

反演结论:d|gcd(i,j)μ(d)=[gcd(i,j)=1]

证明:

  • 我们证明 μ1=ε,也可以表达成 d|nμ(d)=[n=1],和上面的形式是一样的。
  • 因为带有平方因子的数都不会造成贡献,令 n=i=1kpici,n=i=1kpi
  • d|nμ(d)=d|nμ(d)。所以所有 d 都是 k 中一些 p 组合出来的。排列组合得 i=0k(ki)(1)i
  • 典的二项式定理,得上式 =[k=0]k=0 代表 n 没有任何质因子,所以原式 =[n=1]

如果有 f(n)=d|ng(d),那么有 g(n)=d|nμ(d)f(nd)。这种情况下 f(n) 称作 g(n) 的莫比乌斯变换,g(n) 称作 f(n) 的莫比乌斯反演。

证明:

  • d|nμ(d)f(nd)=d|nμ(d)k|ndg(k)=d|ng(d)k|ndμ(k)
  • 最后一步变换了求和顺序,容易发现每一个原本对应的 g(d)μ(k) 现在仍然对应一个 g(d)μ(k) 所以仍然是正确的。
  • 后面那一块可以用一个反演结论。所以 d|ng(d)k|ndμ(k)=d|ng(d)[n=d]=g(n)

如果有 f(n)=n|dg(d),那么有 g(n)=n|df(d)μ(dn)

证明:

  • 考虑和上面类似的证明方式。把 dn 的倍数形式表示。n|dμ(dn)f(d)=k=1μ(k)f(kn)
  • f 拆开成 gk=1μ(k)kn|dg(d)。枚举 k 再枚举 kn 的倍数等价于枚举 n 的倍数然后枚举可行的 kn|dg(d)k|dnμ(k)
  • 后面那一坨还是反演结论,d|ng(d)[d=n]=g(n)

杜教筛

较快地计算某些数论函数的前缀和,即在低于线性的时间内计算 S(n)=i=1nf(i)

对于任意数论函数 f,gh=fg,则 i=1nh(i)=i=1nd|ig(d)f(id)。考虑常见的枚举 d,得到上式 =d=1ng(d)k=1ndf(k)=d=1ng(d)S(ni)

考虑 g(1)S(n) 的特殊含义。显然 g(1)S(n)=i=1ng(i)S(ni)i=2ng(i)S(ni)。前面那个可以转化成 i=1n(fg)(i)

得到杜教筛核心式子 g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)。如果我们令 g 为积性函数,则得到 S(n) 的取值,如果我们能找到一个合适的积性函数 g(注意 f 不一定需要为积性),并且支持快速求 gfg 的前缀和,后面的部分可以递归数论分块做,那么我们就达到低于线性的复杂度内求得 f 的前缀和。

朴素杜教筛的复杂度为 O(n34)。不会证。

有一个优化,即提前筛出 f 的前 m=n23 个答案(前提是能线性筛出)后再使用杜教筛,可以使复杂度平衡至 O(n23)。可以加上哈希表进行记忆化。

posted @   Wind_Leaves_ShaDow  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示