既然选择了远方,便只顾风雨兼行|

H_W_Y

园龄:1年10个月粉丝:28关注:15

Number Theory(3)

7 数论函数基础

数论函数是数论中相当重要的一环,我们先来将一些基本的函数。

7.1 相关定义

  • 数论函数:定义域为正整数的函数称为 数论函数。因其在所有正整数处均有定义,故可视作数列。OI 中常见的数论函数的陪域(即可能的取值范围)为整数。

  • 加性函数:若对于任意 a,bN+ab 均有 f(ab)=f(a)+f(b),则称 f加性函数。注意区分代数中的加性函数。

  • 积性函数:若对于任意 a,bN+ab 均有 f(ab)=f(a)f(b),则称 f积性函数。容易发现 f(1)=1 是必要条件。

  • 完全积性函数:若对于任意 a,bN+ 均有 f(ab)=f(a)f(b),则称 f完全积性函数。完全积性函数一定是积性函数。

  • 数论函数的 加法:对于数论函数 f,gf+g 表示 fg 对应位置相加,即 (f+g)(x)=f(x)+g(x)

  • 数论函数的 数乘:对于数 c 和数论函数 fcf 表示 f 的各个位置乘 c,即 (cf)(x)=cf(x)。一般简记作 cf

  • 数论函数的 点乘:对于数论函数 f,gfg 表示 fg 对应位置相乘,即 (fg)(x)=f(x)g(x)。为与狄利克雷卷积符号 作区分,点乘符号通常不省略。


7.2 常见函数

n 的唯一分解为 i=1mpici,以下是一些常见的数论函数:

  • 单位函数:ϵ(n)=[n=1]完全积性函数

  • 常数函数:1(n)=1完全积性函数

  • 恒等函数:idk(n)=nkid1(n) 记作 id(n)完全积性函数

  • 除数函数:σk(n)=dndkσ0(n) 表示 n 的约数个数,记作 τ(n)d(n)σ1(n) 表示 n 的约约数和,记作 σ(n)σk(n) 有计算式

{i=1m(ci+1)k=0i=1mpi(ci+1)k1pi1k>0

根据乘法分配律,n 的所有约数的 k 次方之和可以写成

i=1mj=0cipijk

等比数列求和后即可。

  • 欧拉函数:φ(n)=i=1n[in],表示 n 以内与 n 互质的数的个数。后面我们会有所介绍。

  • 本质不同质因子个数函数:ω(n)=pP[pn],表示 n 的本质不同质因子个数。

  • 莫比乌斯函数:

μ(n)={1n=10d>1,d2n(1)w(n)otherwise

以上所有函数除 ω 是加性函数外,其余都是积性函数。根据计算式及积性函数的定义易证。


7.3 线性筛积性函数

在前面的素数部分,我们分析了线性筛素数,它提供了在线性时间内筛出具有特殊性质的积性函数在 1n 处所有取值的基本框架。

只要积性函数 f 可在 O(1) 时间内计算任意指数幂处的取值 f(pk),就适用线性筛。(这只是 f 可线性筛的 充分但不必要 条件。存在更弱的条件使得 f 可线性筛但并不常见,如 O(k) 计算 f(pk),这会在下一章介绍)。

根据积性函数的性质,只要预先求出 lowi 表示 i 的最小质因子 p 的最高次幂 pvp(i),对于 ipk,即可使用 f(lowi)f(ilowi) 计算 f(i)。其中 vp(i) 表示质因数次数符号。


下面放一个框架,from Alex_Wei:

for(int i = 2; i < N; i++) {
  if(!vis[i]) pr[++pcnt] = i, f[i] = ..., low[i] = i; // 单独算 f(p)
  for(int j = 1; j <= pcnt && i * pr[j] < N; j++) {
    vis[i * pr[j]] = 1;
    if(i % pr[j] == 0) { // i 与 p 不互质
      low[i * pr[j]] = low[i] * pr[j];
      if(i == low[i]) f[i * pr[j]] = ...; // i = p ^ k,单独算 f(p ^ {k + 1})
      else f[i * pr[j]] = f[i / low[i]] * f[low[i * pr[j]]];
      break;
    }
   	low[i * pr[j]] = pr[j];
    f[i * pr[j]] = f[i] * f[pr[j]]; // i 与 p 互质,f(ip) = f(i)f(p) 
  }
}

8 狄利克雷卷积

钢筋混凝土。


8.1 定义与性质

两个数论函数 f,g 的狄利克雷卷积为一个新的数论函数,记作 fg。定义

h(n)=x×y=nf(x)g(y)=dnf(d)g(nd)

上面简记成 h=fg。按照定义是计算狄利克雷卷积,复杂度为 O(nlnn)


狄利克雷卷积还有一些有趣的性质。

交换律,分配律,结合律

fg=gf(f+g)h=fh+gh(fg)h=f(gh)

这三个东西都可以用定义式稍微推一下就证明出来了。


单位元: ϵf=f


逆元:若函数 f,g 满足 fg=ϵ,则称 f,g 互为逆元。

积性函数总是有且仅有一个逆元。


f 可逆当且仅当 f(1)0

下面写出证明和逆元的计算式:

g=f1。当 f(1)=0 时,f(1)g(1)=1f(1)g(1)=ϵ(1)=1 矛盾。当 f(1)0 时,g(1)=1f(1),对于 n>1g(n),我们可以用已知的 g(1)g(n1) 推出

(fg)(n)=ϵ(n)dnf(d)g(nd)=0g(n)f(1)+dn,d1f(d)g(nd)=0g(n)=dn,d1f(d)g(nd)f(1)

这同时也说明了逆元的 唯一性


f=g 的充要条件是 fh=gh,其中 h(1)0

直接乘上 h 的逆元即可。


积性函数的狄利克雷卷积也是积性函数

设有两个积性函数 f,g,令 h=fg,设 a,b 满足 ab

h(ab)=dabf(d)g(abd)=Tab,da,tb,dt=Tf(dt)g(abdt)=datbf(d)f(t)g(ad)g(bt)=(daf(d)g(ad))(tbf(t)g(bt))=h(a)h(b)

第二行中,由于 ab,所以满足 da,tb,dt=Td,t 只有一对,可以从 w 中分别提取属于 a,b 的质因子得到。


积性函数的逆元也是积性函数

设有积性函数 f,它的逆是 g。设 a,b 满足 ab,证 g(ab)=g(a)g(b)

使用归纳法。当 ab1 时,根据计算式显然成立。假设我们对 a<a,b<b(a,b) 都已经完成了证明,根据求你计算式可得

g(ab)=dab,d1f(d)g(abd)=ia,jb,ij1f(i)f(j)g(ai)g(bj)=f(1)f(1)g(a)g(b)iaf(i)g(ai)jbf(j)g(bj)=f(1)f(1)g(a)g(b)ϵ(a)ϵ(b)=g(a)g(b)

综合后面的两个性质,两个积性函数的积与商都是积性函数,但和与差不是。


8.2 线性筛狄利克雷卷积

给出 f,g 如何快速计算 h=fg 呢?


我们直接用定义式计算,把枚举因数变成枚举倍数,根据调和级数,时间复杂度为 O(nlnn)


如果 f,g 是积性函数,我们可以尝试以下的优化,写出 h 的表达式,有

h(n)={1n=1c=0kf(pc)g(pkc)n=pkh(pk)h(m)n=pkm(m>1,pm)

对于第一项和第三项,我们都可以在线性筛中总代价 O(n) 求出,而现在问题就来到了第二项。

如果 f,g 在质数幂处的取值已经求出,则需要 O(k) 的时间计算,我们尝试估算它的复杂度。考虑所有 nk 的质数对复杂度产生 O(k) 的贡献,因此

T(n)=x=1log2nxπ(nx)=x=1log2nxnxlnnx=1lnnx=1log2nx2nx

x2nx 随着 n 增大,而 x2 的增大速度,远小于 nx 的减小速度,于是从这一点入手,我们考虑证明 x2nxO(n)

x=1 是显然成立,于是考虑 x[2,log2n]x2 的最大值 log22nnx 的最大值 n 之积,因为当 x+log2xx 的高阶无穷小,所以 O(nlog2n)O(n)

因此,

T(n)1lnni=1log2nO(n)=O(n)

综上,使用线性筛求出两个在质数幂处取值已知的积性函数的狄利克雷卷积在 1n 处的取值的时间复杂度是 O(n)

这样我们就得到了积性函数线性筛更弱的条件:可以 O(k) 时间计算质数幂处的取值。


P6222 「P6156 简单题」加强版

给出 k,多次给出 n,求

i=1nj=1n(i+j)Kμ2(gcd(i,j))gcd(i,j)

1n107,K231,T104

会用到稍后要讲的莫比乌斯反演。


枚举 gcd,再进行莫比乌斯反演

i=1nj=1n(i+j)Kμ2(gcd(i,j))gcd(i,j)=d=1nμ2(d)di=1nj=1n[gcd(i,j)=d](i+j)k=d=1nμ2(d)di=1ndj=1nd[gcd(i,j)=1]dk(i+j)k=d=1nμ2(d)di=1ndj=1nddk(i+j)kti,tjμ(t)=T=1n(dTμ2(d)dμ(Td))Tki=1nTj=1nT(i+j)k

我们需要线性筛预处理出 f=(d×μ2)μ,并对 Tk 做前缀和,整除分块求解,时间复杂度 O(nlogklogn)

这就需要用到我们上面讨论的线性筛狄利克雷卷积。代码


简单版本:P6156 简单题


8.3 狄利克雷前缀和

对于任意数论函数 f 卷常数函数 1 等价于对 f狄利克雷前缀和:令 g=f1,则 g(n)=dnf(d)

对每个 n 计算给定数论函数在其所有因数处的取值之和有很好的实际含义,因此狄利克雷前缀和是相当重要的。


首先容易想到一种暴力做法,直接枚举每一个数的倍数,这样就可以做到 O(nlnn)

但是并不是最优的,于是我们有了下面的算法。


将每个数 n 写成一个无穷的序列 an={c1,c2,},表示 n=pici,其中 pi 表示第 i 个质数。因为 xy 的充要条件是 ax(ci)ay(ci),所以 f1 可以看成对下标做关于其无穷序列的高维前缀和,即

g(n)=i,ad(ci)an(ci)f(d)

根据高位前缀和的求法,枚举每一维并将所有下标关于该维做前缀和,可以得到狄利克雷前缀和的实现方法:

初始令 xi=f(i),从小到大枚举每一个质数 pi,枚举 k,将 xpik 加上 xk,相当于 k 的贡献给到 ak(i) 加上 1 之后的下标。

最终得到的 x 即为 g。根据小于 n 的素数倒数之和是 lnlnn 这一结论(埃氏筛法),狄利克雷卷积的时间复杂度是 O(nlnlnn)

于是你就可以通过 P5495 【模板】Dirichlet 前缀和 了。代码

#include <bits/stdc++.h>
using namespace std;
#define uint unsigned int

const int N=2e7+5;
uint seed,ans,a[N];
int n,p[N>>3],cnt=0;
bool vis[N];

uint rd(){seed^=seed<<13,seed^=seed>>17,seed^=seed<<5;return seed;}

void init(){
  for(int i=2;i<N;i++){
    if(!vis[i]) p[++cnt]=i;
    for(int j=1;j<=cnt&&i*p[j]<N;j++){
      vis[i*p[j]]=true;
      if(i%p[j]==0) break;
    }
  }
}

int main(){
  cin>>n>>seed;init();
  for(int i=1;i<=n;i++) a[i]=rd();
  for(int i=1;i<=cnt;i++) for(int j=1;p[i]*j<=n;j++) a[p[i]*j]+=a[j];
  for(int i=1;i<=n;i++) ans^=a[i];
  cout<<ans;return 0;
}

9 整除分块

整除分块又称为数论分块,因其解决的问题与整除密切相关而得名。数论分块是用于求解形如

i=1nf(i)g(ni)

的合适,前提为 f 的前缀和可以快速计算。


9.1 介绍

如果 ni 的数量不多,那么我们可以考虑转化成贡献形式,把原式写成若干个 g(ni) 乘上一段 f 的和。那么不同的 ni 到底又多少个呢?


i[1,n],nN+,不同的 ni 至多只有 2n 个。

证明是简单的:

  • in 时,ni 只有 n 个。

  • i>n 时,nin,也只有 n 个。


根据这条结论,我们枚举 O(n) 种整除值 d,求出最小和最大的 i 使得 ni=d,分别记作 l,r,那么原式可以写成

dg(d)i=lrf(i)

只要我们能对 f 进行快速的前缀和预处理,在 g 处能快速得到值,那么整个和式就可以在 O(n) 的时间复杂度内求得。


那么问题就转化成求使得 ni=d 的最大和最小的 i


转化一下,发现 ni=di 有两条限制:

i(d+1)>n

idn

两边把 d 除过去就可以得到

nd+1<ind

那么我们不重不漏地枚举所有整除值时,可以对于每一个 i 计算 nilr,借助上面的式子跳过这个极长的连续段。

具体地,我们令当前枚举到的 il,此时整除值为 d=ni。因为使得 ni=d 的最大的 i 等于 nd,所以

r=nnl

g(d)(s(r)s(l1)) 算入答案,下一次 l=r+1 表示跳过了 lr 这一段,如果 l>n 就退出即可。(s 是前缀和)


这样每一次的整除值都可以被算一次,时间复杂度 O(n)

  • i 的上界不为 n 时,要特殊处理:若 mn,每次要把 rm 取最小值;反之要特殊处理 ni=0 的情况。

  • 写的时候不要写成了 rn 了!(有些人因为这个常常调很久)


9.2 拓展

拓展也是较为简单的。


我们尝试将 向下取整 转换成 向上取值

对于左边界 l,求出使得 nl=nr 的最大的 r

k=nl,那么

nr>k1r(k1)<nr<nk1rn1k1

最后一步是因为 n,k 都是正整数,于是我们每次有

r=n1nl1

注意到 nl=1 时上界为 +,所以要去实际上界。


另外一个拓展就是我们尝试进行 高维数论分块

当和式中出现若干个下取整,形如

i=1nf(i)j=1mg()

时,我们只需要每次令

r=minj=1c(njnjl)

即可。最后要对 nmin

时间复杂度 nj

因为我们把存在 nj 满足 njinji+1 的位置 i 视作断点,总断点数量为每个下取整式的断点数量相加,于是就有该时间复杂度。


9.3 例题

几道简单题。


CF1603C Extreme Extension

对于一个数列,定义一次操作为选择数列中任何一个元素 ai ,将这个位置替换成两个正整数 x,y 满足 x+y=ai

定义一个数列的极端值为将这个数列变成 不降 数列的最小操作次数

给定一个长度为 n 的数列 a1ai105 ),让你求它的所有非空子段的极端值之和,对 998244353 取模

一个测试点中有多组数据,保证所有数据 n 的规模总和不超过 105


P2260 [清华集训2012] 模积和

i=1nj=1m(nmodi)×(mmodj),ij

mod 19940417 的值

1n,m109


P3579 [POI2014] PAN-Solar Panels

对于 n 组询问,每组询问给定四个整数 a,b,c,d,从区间 [a,b][c,d] 中任意选取两个整数 xy,求 gcd(x,y) 的最大值是多少。

1n10001ab1091cd109


10 欧拉函数

欧拉函数是一类非常重要的数论函数。


10.1 定义与性质

欧拉函数的定义为在 [1,n] 中与 n 互质的整数的个数,记作 φ(n)

显然,当 n 是质数时,有 φ(n)=n1


p 为质数,则 φ(pk)=(p1)×pk1

[1,pk] 中不是 p 的倍数的数都和 pk 互质。因此 φ(pk)=pkpk1=(p1)pk1


φ积性函数。即若 φ(ab)=φ(a)×φ(b)

设与 a 互质的数为 {a1,a2,,aφ(a)},那么在 [1,ab] 内与 a 互质的整数可以表示为 i×a+aj(0i<b,1jφ(a))

因为 ab,所以 ia(0i<b) 在模 b 意义下互不相同,即对于每一个 aj{i×a+aj}(0i<b) 均构成 b 的完全剩余系 {0,1,,b1},即随着 i0 变到 b1i×a+ajb 的余数取遍 0b1

因此,对于每一个 aj,满足 bi×a+aji 的个数为 φ(b),所以与 ab 互质的数的个数为 φ(ab)=φ(a)+φ(b)。得证。


根据算术基本定理,设 n 被唯一分解为 i=1mpici,则 φ(n)=n×i=1mpi1pi

根据前面两个性质

φ(n)=pφ(pk)=ppk×p1p=n×i=1mpi1pi;

得证。

当然,我们还可以用 容斥原理 来证明。

考虑去掉所有被至少一个 n 的质因子整除的数,再加上被至少两个 n 的质因子整除的数,以此类推,我们可以得到

φ(n)=n×S(1)|S|pSp

其中 Sn 的质因子集合的子集。容易发现,这个式子就是

n×pi(11pi)

这样我们也可以反推到积性函数上面。设 a=i=1m1pici,b=i=1m2qidi。由于 ab,所以 pi,qi 互不相同。因此

ab=i=1m1pici×i=1m2qidi

于是有

φ(ab)=ab×i=1m1pi1pi×i=1m2qi1qi=φ(a)×φ(b)


ab,则 φ(ab)=a×φ(b)

根据前面 φ 的计算式,容易发现这时比较显然的。

于是我们也容易得到这样的结论:

ab,则 φ(a)φ(b)


欧拉反演:

dnφ(d)=n

考虑 φ(n) 的定义是与 n 互质的数的个数,那么容易发现 φ(n) 就是分母为 n 的最简基本分数的个数,而法里级数 Fn 既包含分母不超过 n[0,1] 范围内的所有最简分数,我们尝试从这一点来论证欧拉反演。

我们把法里级数中非零的部分提出来,例如当 n=12 时,在约分成最简基本分数前,分母为 12 的所有基本分数集合是

112,212,312,412,512,612,712,812,912,1012,1112,1212

约分得到

112,16,14,13,512,12,712,23,34,56,1112,11

我们可以根据它们的分母将这些分数分组,就可以得到

11;12;13,23;14,34;16,56;112,512,712,1112

对此,我们如何就是呢?

发现 12 的每一个因子都出现在分母上,与其一起出现的还有 φ(d) 个分子,从而

φ(1)+φ(2)+φ(3)+φ(4)+φ(6)+φ(12)=12

也就是

dnφ(d)=n

这就是 欧拉反演


同时它可以被表示成狄利克雷卷积的形式,也就是 φ1=id,这在杜教筛中颇有应用。


2φ(n)(n>2)

假设 xn,那么一定有 (nx)n。于是与 n 互质的数是两两配对的,唯一的特殊情况就是 x=nx 的时候。

容易发现这种情况显然是满足条件的,即 x=n2,那么 gcd(n,x)=x1。得证。这个性质在莫反的某道题中有所应用。


使得 gcd(n,x)=d1xnx 的个数为 φ(nd)

使得这个条件成立的条件可以被表示成 ndxd,同时 1xdnd,从而答案就是 φ(nd)。得证

如果我们把条件转移到 0x<n,也是成立的,因为我们之前定义了 gcd(0,n)=gcd(n,n)=n


10.2 线性筛欧拉函数

根据上面欧拉函数的计算式,我们可以得到它的线性筛法,若 pn,则

φ(n)={p×φ(np)p2n(p1)×φ(np)p2n

于是代码就是简单的

  phi[1]=1;
  for(int i=2;i<N;i++){
  	if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
  	for(int j=1;j<=cnt&&i*p[j]<N;j++){
  	  vis[i*p[j]]=true;
	  if(i%p[j]==0){
	  	phi[i*p[j]]=phi[i]*p[j];
	  	break;
	  }	
	  else phi[i*p[j]]=phi[i]*(p[j]-1);
	}
  }

10.3 欧拉定理

欧拉发现费马的定理可以用下面的方式推广到非素数的模:

nφ(m)1(modm),nm

这和费马小定理是相当类似的,于是我们可以尝试用类似于费马小定理的方法来证明它。


φ(m) 个数 {knmodmkm0k<m} 就是 {kkm0k<m} 按照某种次序排列。

将它们相乘并用 0k<m,kmk 来除即可。


而当 m 是素数时,带入就可以得到费马小定理。


10.4 扩展欧拉定理

再把欧拉定理进行一个扩展,可以得到

ab={abmodφ(m)gcd(a,m)=1abgcd(a,m)1,b<φ(m)a(bmodφ(m))+φ(m)gcd(a,m)1,bφ(m)(modm)


感性理解:

gcd(a,m)1 时,不断乘 a 会让 aimgcd 不断变大,这到某个特定的 ar 之后 gcd 就不再变化,因为此时 gcd(ar,m) 受到 m 的每个与 a 相同的质因子的次数限制。

令这个 gcd=d,考虑 armodm,ar+1modm,,显然它们均是 d 的倍数,且除以 d 之后会取遍所有与 md 互质的数,这时因为 amd

根据欧拉定理,akmodmd 有循环节 φ(md),因此 (akmodmd)×dakmodm,也有循环节 φ(md),故从 ar 开始,ar+kmodm 有循环节 φ(p)

比较抽象,非常感性。


严谨证明 摘自 OI-wiki

  • a 的从 0 次,1 次到 b 次幂模 m 构成的序列中,存在 r,s,使得前 r 个数(即从 a0modmar1modm)互不相同,从 r 开始,每 s 个数就循环依次。

    在 3.5 中,我们对这个遗留问题进行了讨论。

  • a 为素数的情况,该是成立。

    证明

    • 若模 m 不能被 a 整除,那么有 gcd(a,m)=1 成立,根据欧拉定理容易证明。

    • 若模 m 能被 a 整除,那么存在 rm 使得 m=arm,且 gcd(a,m)=1 成立。所以根据欧拉定理有 aφ(m)1(modm)

    又由于 gcd(ar,m)=1,所以根据欧拉函数的计算式,容易得到 φ(m)=φ(m)×(a1)ar1,即我们有 φ(m)φ(m)

    所以 aφ(m)1(modm),φ(m)φ(m)aφ(m)1(modm),即 aφ(m)=km+1,两边同时乘 ar,得 ar+φ(m)=km+ar,因为 m=arm

    所以 m 中素因子 a 的次数 r 满足:arar+φ(m)(modm)。我们可以简单变换形式,得到 推论

    b>rabar+(br)modφ(m)(modm)

    又由于 m=arm,所以 φ(m)=φ(ar)φ(m)φ(ar)=ar1(a1)r

    所以因为 φ(m)r,故有:

    arar+φ(m)armodφ(m)+φ(m)(modm)

    所以

    abar+(br)modφ(m)armodφ(m)+φ(m)+(br)modφ(m)aφ(m)+bmodφ(m)(modm)

    ababmodφ(m)+φ(m)

  • a 为素数幂的情况,该式成立。

    证明

    不妨令 a=pk,是否依然有 r,arar+φ(m)(modm)

    答案是肯定的,由于第一点可知存在 s 使得 as1(modm),所以 plcm(s,k)1(modm),所以令 s=sgcd(s,k) 时,我们能有 psk1(modm)

    此时有关系 sssφ(m),且 r=rkrφ(m),由 r,sφ(m) 的关系,依然可以得到 ababmodφ(m)+φ(m)(modm)

  • a 为合数的情况,该是成立。

    证明:

    只证 a 拆成两个素数的幂的情况,大于两个的用数学归纳法可证。

    a=a1a2,其中 ai=piki,而 ai 的循环长度为 si

    slcm(s1,s2),由于 s1φ(m),s2φ(m),那么 lcm(s1,s2)φ(m),所以 sφ(m),r=max(riki)max(ri)φ(m)

    r,sφ(m) 的关系,依然可以得到 ababmodφ(m)+φ(m)(modm)

证毕。乐。


于是你就可以通过 P5091 【模板】扩展欧拉定理代码


10.5 例题

煎蛋题。


P2158 [SDOI2008] 仪仗队


本文作者:H_W_Y

本文链接:https://www.cnblogs.com/H-W-Y/p/18203759/NumberTheory3

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   H_W_Y  阅读(57)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起