数论学习笔记
BSGS
普通BSGS
求解 ax≡b(modp) ,其中 a⊥p 。
方程的解满足 0≤x<p 。
令 x=A⌈p⌉−B ,其中 0≤A,B≤⌈p⌉ ,所以
aA⌈p⌉≡baB(modp)
可以先算出等式右边 baB 的所有取值,将其存到一个 hash 表里。
然后计算 aA⌈p⌉ 并查表寻找是否有相等值,即可得到x。
因为 A,B≤p ,所以时间复杂度就是 O(p) 。
扩展BSGS
现在 a 与 p 不一定互质。
不互质就硬搞成互质的,设 d1=gcd(a,p) 。
如果 d1∤b ,则方程无解,否则把方程同时除以 d1 ,得到
d1a⋅ax−1≡d1b(modd1p)
若 p 和 d1 不互质就再除,直到 a⊥d1d2⋯dkp 。
记 D=∏i=1kdi ,所以我们得到了
Dak⋅ax−k≡Db(modDp)
因为 a⊥Dp ,所以 ak⊥Dp ,现在就是一个普通的BSGS问题了,求解 x−k 再加上 k 即原方程的解。
不排除解小于等于 k 的情况,这时候只要 O(k) 枚举验证一下即可。
杜教筛
用来快速求积性函数前缀和。
设给定的积性函数为 f(n) ,所以我们设 S(n) 为 f 函数的前缀和
S(n)=i=1∑nf(i)
现在的目标就是求出 S(n) 的值
考虑构造一个合适的积性函数 g(n) ,然后求他们卷积 h(n) 的前缀和
i=1∑nh(i)=i=1∑n(f∗g)(i)
由卷积定义得
i=1∑nh(i)=i=1∑nd∣i∑f(di)g(d)
把 d 和 g(d) 提到前面
i=1∑nh(i)=d=1∑ng(d)i=1∑⌊dn⌋f(i)
后面那个求和就是 f 的前缀和
i=1∑nh(i)=d=1∑ng(d)S(⌊dn⌋)
因为我们求解的是 S(n) ,所以将 d=1 与 d>1 分开计算
i=1∑nh(i)=g(1)S(n)+d=2∑ng(d)S(⌊dn⌋)
其中 g 是积性函数,所以 g(1)=1 ,移项得
S(n)=i=1∑nh(i)−d=2∑ng(d)S(⌊dn⌋)
如果我们可以快速求出 h(i) 和 g(n) 的前缀和,那么问题就可以用整除分块+递归求解了。
常见的积性函数
积性函数: φ,μ,σ,d
完全积性函数: ε,I,id
其中
ε(n)=[n=1]I(n)=1idk(n)=nkσk(n)=d∣n∑dk
一些常用的卷积性质
μ∗I=εφ∗I=id1μ∗id1=φ
Min_25筛
求积性函数 f(x) 前缀和,其中 f(pk),p∈Prime 可快速求出。
下面式子中设 p 为一个质数, px 为第 x 个质数
一、设完全积性函数 g(x) ,且 g(p)=f(p),p∈Prime
二、设 G(n,x) 为 [1,n] 中质数或最小质因子大于等于 px 的和数的 g 值的和,所以有递推式:
G(n,x+1)=G(n,x)−g(px)⎝⎛G(⌊pxn,x⌋)−p∈Prime∑p≤px−1g(p)⎠⎞
三、设 S(n,x) 为 [1,n] 中最小质因子大于等于 px 的合数的 f 值的和, tot 为 [1,n] 中质数的个数,递推式:
S(n,x)=S(n,x+1)+i=1∑pxi+1≤n⎝⎛f(pxi+1)+f(pxi)⋅⎝⎛G(⌊pxin⌋,tot+1)−p∈Prime∑p≤pxf(p)+S(⌊pxin⌋,x+1)⎠⎞⎠⎞
类欧几里得算法
用来求一些奇奇怪怪的式子
f(a,b,c,n)=i=0∑n⌊cai+b⌋g(a,b,c,n)=i=0∑n⌊cai+b⌋ih(a,b,c,n)=i=0∑n⌊cai+b⌋2
无特殊说明,以下数学公式中以 % 代替 mod 。
函数 f(a,b,c,n)
分两种情况:
当 a≥c or b≥c 时:
f(a,b,c,n)=i=0∑n⌊c(⌊a/c⌋c−a%c)i+(⌊b/c⌋c−b%c)⌋=i=0∑n(⌊a/c⌋i+⌊b/c⌋)+i=0∑n⌊c(a%c)i+(b%c)⌋=2(n+1)(n+2)⌊a/c⌋+(n+1)⌊b/c⌋+f(a%c,b%c,c,n)
这样我们就能把 a 和 b 缩小范围了。
当 a<c and b<c 时:
f(a,b,c,n)=i=0∑nj=0∑⌊cai+b⌋1=i=0∑nj=0∑⌊can+b⌋[j<⌊cai+b⌋]
记 m=⌊can+b⌋ , 所以有
f(a,b,c,d)=i=0∑nj=0∑m−1[j+1≤cai+b]=i=0∑nj=0∑m−1[acj+c−b≤i]=i=0∑nj=0∑m−1[acj+c−b−1<i]=j=0∑m−1i=0∑n[i>acj+c−b−1]=j=0∑m−1(n−⌊acj+c−b−1⌋)=mn−i=0∑m−1⌊acj+c−b−1⌋=mn−f(c,c−b−1,a,m−1)
所以我们得到了 f 的递归解法,递归过程就像是欧几里得算法求 gcd 一样,所以是类欧几里得算法
f(a,b,c,n)={2n(n+1)⌊a/c⌋+(n+1)⌊b/c⌋+f(a%c,b%c,c,n)mn−f(c,c−b−1,a,m−1),a≥c or b≥c,a<c and b<c
函数 g(a,b,c,n)
还是相同的分情况方法:
当 a>c or b>c 时:
g(a,b,c,n)=i=0∑n⌊c(⌊a/c⌋c+a%c)i+(⌊b/c⌋c+b%c)⌋i=i=0∑n⌊a/c⌋i2+i=0∑n⌊b/c⌋i+i=0∑n⌊c(a%c)i+b%c⌋i=6n(n+1)(2n+1)⌊a/c⌋+2n(n+1)⌊b/c⌋+g(a%c,b%c,c,n)
当 a<c and b<c 时:
g(a,b,c,d)=i=0∑nij=0∑m[j<⌊cai+b⌋]=i=0∑nij=0∑m−1[j+1≤cai+b]=i=0∑nij=0∑m−1[acj+c−b≤i]=i=0∑nij=0∑m−1[⌊acj+c−b−1⌋<i]
设 A=⌊acj+c−b−1⌋ ,则
g(a,b,c,d)=i=0∑nij=0∑m−1[i>A]=j=0∑m−1i=0∑ni[i>A]=j=0∑m−1i=A+1∑n=21j=0∑m−1(n+A+1)(n−A)=21j=0∑m−1(n2+n−A2−A)=21(n2m+nm−j=0∑m−1⌊acj+c−b−1⌋2−j=0∑m−1⌊acj+c−b−1⌋)=21(n(n+1)m−h(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1))
所以
g(a,b,c,n)={6n(n+1)(2n+1)⌊a/c⌋+2n(n+1)⌊b/c⌋+g(a%c,b%c,c,n)21(n(n+1)m−h(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1)),a>c or b>c,a<c and b<c
函数 h(a,b,c,n)
仍然分两种情况:
当 a>c or b>c 时:
h(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n⌊c⌊a/c⌋ci+⌊b/c⌋c+c(a%c)i+(b%c)⌋2=i=0∑n(⌊a/c⌋i+⌊b/c⌋+⌊c(a%c)i+(b%c)⌋)2
设 A=⌊a/c⌋i+⌊b/c⌋,B=⌊c(a%c)i+(b%c)⌋ , 所以
h(a,b,c,n)i=0∑nA22i=0∑nABi=0∑nB2h(a,b,c,n)=i=0∑n(A+B)2=i=0∑n(A2+2AB+B2)=i=0∑nA2+2i=0∑nAB+i=0∑nB2=i=0∑n(⌊a/c⌋i+⌊b/c⌋)2=i=0∑n⌊a/c⌋2i2+2i=0∑n⌊a/c⌋⌊b/c⌋i+i=0∑n⌊b/c⌋2=6n(n+1)(2n+1)⌊a/c⌋2+n(n+1)⌊a/c⌋⌊b/c⌋+(n+1)⌊b/c⌋2=2i=0∑n(⌊a/c⌋i+⌊b/c⌋)⌊c(a%c)i+(b%c)⌋=2i=0∑n⌊a/c⌋i⌊c(a%c)i+(b%c)⌋+2i=0∑n⌊b/c⌋⌊c(a%c)i+(b%c)⌋=2⌊a/c⌋g(a%c,b%c,c,n)+2⌊b/c⌋f(a%c,b%c,c,n)=h(a%c,b%c,c,n)=6n(n+1)(2n+1)⌊a/c⌋2+n(n+1)⌊a/c⌋⌊b/c⌋+(n+1)⌊b/c⌋2+2⌊a/c⌋g(a%c,b%c,c,n)+2⌊b/c⌋f(a%c,b%c,c,n)+h(a%c,b%c,c,n)
当 a<c and b<c 时:
h(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n⎝⎛2j=1∑⌊cai+b⌋j+⌊cai+b⌋⎠⎞=2i=0∑nj=1∑⌊cai+b⌋j+i=0∑n⌊cai+b⌋=2i=0∑nj=0∑m−1(j+1)[j<⌊cai+b⌋]−f(a,b,c,n)=2i=0∑nj=0∑m−1(j+1)[⌊acj+c−b−1⌋<i]−f(a,b,c,n)=2j=0∑m−1(j+1)i=0∑n[i>⌊acj+c−b−1⌋]−f(a,b,c,n)=2j=0∑m−1(j+1)(n−⌊acj+c−b−1⌋)−f(a,b,c,n)=2nj=0∑m−1(j+1)−2j=0∑m−1j⌊acj+c−b−1⌋−2j=0∑m−1⌊acj+c−b−1⌋−f(a,b,c,n)=nm(m+1)−2g(c,c−b−1,a,n)−2f(c,c−b−1,a,n)−f(a,b,c,n)
所以
h(a,b,c,n)={6n(n+1)(2n+1)⌊a/c⌋2+n(n+1)⌊a/c⌋⌊b/c⌋+(n+1)⌊b/c⌋2+2⌊a/c⌋g(a%c,b%c,c,n)+2⌊b/c⌋f(a%c,b%c,c,n)+h(a%c,b%c,c,n)nm(m+1)−2g(c,c−b−1,a,n)−2f(c,c−b−1,a,n)−f(a,b,c,n),a>c or b>c,a<c and b<c
生成函数
普通生成函数(OGF)
对于一个序列 a ,它的普通生成函数定义为形式幂级数: F(x)=∑iaixi
也就是将 a 中每一项作为多项式的系数。
基本运算
设两个序列 a,b 的生成函数分别为 F(x),G(x) ,则有
F(x)±G(x)=i∑(ai±bi)xi
也就是序列 ⟨ai±bi⟩ 的生成函数为 F(x)±G(x) 。
考虑乘法运算,也就是多项式卷积
F(x)G(x)=i∑(j=0∑iajbi−j)xi
所以 ⟨∑_i=0na_ib_n−i⟩ 的生成函数就是 F(x)G(x)
封闭形式
形式幂级数的形式无法快速进行乘法运算,所以需要转化为封闭形式简化运算。
例如 ⟨1,1,⋯⟩ 的普通生成函数为 F(x)=∑ixi 。
可以发现 F(x)=xF(x)+1 ,解方程得到 F(x)=1−x1 。
这就是函数 F(x)=∑ixi 的封闭形式。
等比数列 ⟨1,p,p2,p3,⋯⟩ 的生成函数 F(x)=∑ipixi , 有
F(x)=pxF(x)+1F(x)=1−px1
等比数列的封闭形式与展开形式之间的转化是常用的化简方法。
牛顿二项式定理
重新定义组合数:
Cnm=m!nm(n∈C,k∈n)
在这种情况下,对于 a∈C ,二项式定理为
(x+1)a=i≥0∑Cai xi
这样我们就可以通过牛顿二项式定理由封闭形式求某一项的系数了。
指数型生成函数(EGF)
序列 a 的指数生成函数定义为形式幂级数:
F^(x)=i∑aii!xi
基本运算
加减法还是一样,就是系数相加。
乘法不太一样,对于两个序列 a,b ,设它们的指数生成函数分别为 F^(x)G^(x) ,则
F(x)G(x)=i≥0∑aii!xij≥0∑bjj!xj=n≥0∑inj=0∑naibn−ii!(n−i)!1=n≥0∑n!xni=0∑nCniaibn−i
所以序列 ⟨∑_i=0nC_nia_ib_n−i⟩的指数生成函数为F^(x)G^(x) 。
封闭形式
同样考虑封闭形式简化运算。
序列 ⟨1,1,⋯⟩ 的指数生成函数是 ∑n≥0n!xn=ex 。
类似地,等比数列 ⟨1,p,p2,⋯⟩ 的指数生成函数是 ∑_n≥0n!pnxn=epx