【学习笔记】数论

前言

lyc 买了洛谷网校 - 省选基础

但是她发现每次听了数论课之后过了一会就会忘掉

于是她写了一篇学习笔记

【持续更新】
upd:鸽了

数论函数

定义域为正整数、值域为复数的自己的函数称为 数论函数

积性函数

ff 为数论函数且当 gcd(a,b)=1\gcd(a,b)=1 时,有 f(a)×f(b)=f(a×b)f(a)\times f(b)=f(a \times b) ,则称 ff 为积性函数

容易看出,对于任何积性函数有 f(1)=1f(1)=1

特别的,若数论函数 ff 对于任何 a,ba,b 都有 f(a)×f(b)=f(a×b)f(a)\times f(b)=f(a\times b) ,则称 ff完全积性函数

容易看出,若 ff 为积性函数,且 n=p1a1p2a2psasn={p_1}^{a_1}{p_2}^{a_2}\dots{p_s}^{a_s}nn标准分解,则有

f(n)=f(p1a1)f(p2a2)f(psas)f(n)=f({p_1}^{a_1})f({p_2}^{a_2})\dots f({p_s}^{a_s})

利用上式,大部分积性函数可以用欧拉筛进行求值

线性筛(欧拉筛)

这个 lyc 至少还记得住(

一些有用的函数

单位函数(或者是元函数之类的东西,不太清楚qwqwq) ϵ\epsilon 的定义为 ϵ(n)=[n=1]\epsilon (n)=[n=1]

这里 [ ][\ ] 的含义为:若 [ ][\ ] 内的条件为真则为 11 ,否则为 00

显然,单位函数是积性函数

除数函数 σk(n)\sigma_k(n) 表示 nn 的因子的 kk 次方之和

形式化的, σk(n)=dndk\sigma_k(n)=\sum\limits_{d|n}d^k

nn 的约数个数 σ0(n)\sigma_0(n) 常记为 d(n)d(n) ,约数和 σ1(n)\sigma_1(n) 常记为 σ(n)\sigma(n)

除数函数是积性函数

幂函数 Idk(n)=nkId_k(n)=n^kId=Id1Id=Id_1

一般的,11 表示取值恒为 11 的常函数

欧拉函数

定义

欧拉函数 φ(n)\varphi(n) 表示不超过 nn 且与 nn 互质的整数个数。

形式化的, φ(n)=i=1n[gcd(i,n)=1]\varphi(n)=\sum\limits_{i=1}^{n}[\gcd(i,n)=1]

欧拉函数是积性函数

计算

通过容斥原理可以得到

φ(n)=ni=1s(11p1)\varphi (n)=n\prod\limits_{i=1}^{s} (1- \frac{1}{p_1})

其中 n=p1a1p2a2psasn={p_1}^{a_1}{p_2}^{a_2}\dots{p_s}^{a_s}nn标准分解

时间复杂度 O(n)\mathcal{O(\sqrt{n})}

int phi(int x){
	int ans=x;
	for (int i=2;i*i<=x;i++){
		if (x%i==0){
			ans=ans/i*(i-1);
			while (x%i==0) x/=i;
		}
	}
	if (x>1) ans=ans/x*(x-1);
	return ans;
}

可以利用 欧拉筛O(n)\mathcal{O(n)} 的时间内计算 φ\varphi11nn 处的取值

memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
sum[1]=phi[1]=1;

for (int i=2;i<=MAXN;i++){
	if (prime[i]){
		primes[++tot]=i;
		phi[i]=i-1;
	}

	for (int j=1;j<=tot&&primes[j]*i<=MAXN;j++){
		prime[i*primes[j]]=false;
		if (i%primes[j]==0){
			phi[i*primes[j]]=phi[i]*primes[j];
			break;
		}
		else phi[i*primes[j]]=phi[i]*(primes[j]-1);
	}
}
性质

对于任意 nn ,有

n=dnφ(d)n=\sum\limits_{d|n}\varphi(d)

数论分块

是非常常用的东西 所以有必要讲一讲

数论分块适用于这样的形式:

i=1nni\sum\limits_{i=1}^{n} \left\lfloor \frac{n}{i} \right\rfloor

我们发现有许多的 ni\left\lfloor \frac{n}{i} \right\rfloor 值是相同的,相同的值形成了一个个连续的块,所以可以用数论分块来加速求和过程,复杂度 O(n)\mathcal{O(\sqrt{n})}

附代码

for(int l=1,r;l<=n;l=r+1){
	r=n/(n/l);
	ans+=(r-l+1)*(n/l);
}

其中 ans+=(r-l+1)*(n/l); 的意义为 有长度为 r-l+1 的块的值为 n\l

顺带一提,这个式子可以化为

i=1nni=k=1nd(k)\sum\limits_{i=1}^{n} \left\lfloor \frac{n}{i} \right\rfloor = \sum\limits_{k=1}^{n}d(k)

这里 d(k)d(k) 是前文提到过的表示约数个数的函数

由于 dd 可以用欧拉筛预处理出来,而这个式子就是 dd 的前缀和,所以可以在线性时间内预处理出来。

当然,并不是所有可以用数论分块解决的问题都可以这样在线性时间内预处理(比如在求和的时候乘个什么东西 是很常见的形式),这就是数论分块的意义所在。

Dirichlet 卷积

定义

f,gf,g 是数论函数,且数论函数 hh 满足

h(n)=dnf(d)g(dn)h(n)=\sum\limits_{d|n}f(d)g(\frac{d}{n})

则称 hhf,gf,gDirichlet 卷积, 记作 h=fgh=f*g

性质

对于任意数论函数 ff ,有 f=fϵ=ϵff = f * \epsilon = \epsilon * f ,即单位函数 ϵ\epsilon 是 Dirichlet 卷积的 单位元

Dirichlet 卷积满足 交换律和结合律

f,gf,g 为积性函数,则 h=fgh=f * g 也是积性函数

应用

除数函数的定义可以写成

σk=1Idk\sigma_k= 1 * Id_k

欧拉函数的性质可以写成

Id=φ1Id=\varphi * 1

Mobius 函数

莫比乌斯函数 μ(n)\mu(n) 的定义为

μ(n)={1n=1(1)sn=p1p2ps0otherwise\mu(n)= \begin{cases} 1&n=1\\ (-1)^s&n=p_1 p_2 \dots p_s\\ 0&\text{otherwise} \end{cases}

其中 p1,p2psp_1 , p_2 \dots p_s 为不同的质数

容易看出, μ(n)\mu(n)nn平方因子时非 00

μ\mu积性函数

非常非常重要的性质

对于任意正整数 nn ,有

dnμ(d)=ϵ(n)\sum\limits_{d|n}\mu(d)=\epsilon (n)

写成狄利克雷卷积的形式即为

μ1=ϵ\mu * 1=\epsilon

Proof:

n=1n=1 时显然。

n>1n > 1,设 nnss不同的素因子,由于 μ(d)0\mu(d) \ne 0 (这里不等号渲染有莫名其妙的锅)当且仅当 dd 无平方因子,故 dd 中每个素因子的指数只能为 0011。故有

dnμ(d)=i=0s(1)i(si)=i=0s1si(1)i(si)=(11)s=0\sum\limits_{d|n}\mu(d)=\sum\limits_{i=0}^{s}(-1)^i \dbinom{s}{i}=\sum\limits_{i=0}^{s}1^{s-i}(-1)^i \dbinom{s}{i}=(1-1)^s=0

(第三步使用了 二项式定理

Mobius 变换

我们有数论函数 ff ,定义数论函数 gg 。若

g(n)=dnf(d)g(n)=\sum\limits_{d|n}f(d)

则称 ggffMobius 变换ffggMobius 逆变换

写成 Dirichlet 卷积 的形式即为 g=f1g=f * 1

Mobius 反演定理

Mobius 反演定理 指出,上式的充要条件为

f(n)=dng(d)μ(nd)f(n)=\sum\limits_{d|n}g(d)\mu(\frac{n}{d})

写成 Dirichlet 卷积 形式即为 f=gμf=g*\mu

Proof:

μ\mu 的定义代进去就证出来了(

可是我们有更优美的证明方法

f=fϵ=f1μ=gμf = f * \epsilon = f * 1 * \mu = g * \mu

关于解题

首先我们来看一道题。

求二元组 (x,y)(x,y) 的个数,满足 1xn,1ym1\le x\le n, 1\le y \le mx,yx,y 互质

n,m107n,m \le 10^7 ,多测。

显然,答案为

i=1nj=1n[gcd(i,j)=1]\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} [\gcd(i,j)=1]

进行转化

i=1nj=1m[gcd(i,j)=1]=i=1nj=1mϵ(gcd(i,j))=i=1nj=1mdgcd(i,j)μ(d)=i=1nj=1mdi,djμ(d)=d=1nμ(d)ndmd\begin{aligned} \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} [\gcd(i,j)=1] &= \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \epsilon(\gcd(i,j))\\ &= \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sum\limits_{d|\gcd(i,j)} \mu(d)\\ &= \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sum\limits_{d|i,d|j} \mu(d)\\ &= \sum\limits_{d=1}^{n} \mu(d) \left\lfloor \frac{n}{d} \right\rfloor \left\lfloor \frac{m}{d} \right\rfloor \end{aligned}

(第二步使用了 Mobius 函数的性质 μ1=ϵ\mu * 1 = \epsilon

然后这个式子可以通过预处理 μ\mu ,然后数论分块在 O(n)\mathcal{O(\sqrt n)} 时间内求出

Q:就这?

Q:这就是莫比乌斯反演嘛,i了i了

Q:那你之前提到的 Mobius 反演定理Mobius 变换 是干啥的?

A:之后填坑(((