博客
关于我
【学习笔记】欧拉函数,欧拉公式
阅读量:303 次
发布时间:2019-03-04

本文共 9407 字,大约阅读时间需要 31 分钟。

A.欧拉函数

0.概述

一个函数。只有毒瘤出题人会用到它。

1.定义

φ ( n ) = ∑ x = 1 n [ gcd ⁡ ( x , n ) = 1 ] \varphi(n)=\sum_{x=1}^{n}\big[\gcd(x,n)=1\big] φ(n)=x=1n[gcd(x,n)=1]

即,所有小于等于 n n n 的正整数,与 n n n 互质的有多少个。

2.计算

有好多好多公式呢。

2.1.积性函数

如果 a a a b b b 互质,那么 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)

注:这是我在 c s d n \rm{csdn} csdn 上曾经看到过的一篇证明

发现 gcd ⁡ ( x , a b ) = 1 \gcd(x,ab)=1 gcd(x,ab)=1 的充要条件是 gcd ⁡ ( x , a ) = 1 ∧ gcd ⁡ ( x , b ) = 1 \gcd(x,a)=1\wedge\gcd(x,b)=1 gcd(x,a)=1gcd(x,b)=1

1 , 2 , 3 , … , a b 1,2,3,\dots,ab 1,2,3,,ab 写成一个矩阵:

1 2 3 … b b + 1 b + 2 b + 3 … 2 b 2 b + 1 2 b + 2 2 b + 3 … 3 b ⋮ ⋮ ⋮ ⋱ ⋮ ( a − 1 ) b + 1 ( a − 1 ) b + 2 ( a − 1 ) b + 3 … a b \begin{matrix} 1&2&3&\dots&b\\ b+1&b+2&b+3&\dots&2b\\ 2b+1&2b+2&2b+3&\dots&3b\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ (a-1)b+1&(a-1)b+2&(a-1)b+3&\dots&ab \end{matrix} 1b+12b+1(a1)b+12b+22b+2(a1)b+23b+32b+3(a1)b+3b2b3bab

现在,某个元素 ( x , y ) (x,y) (x,y) 就是 x b + y xb+y xb+y(行从 0 0 0 开始编号,列从 1 1 1 开始编号)。

由于 x b + y xb+y xb+y b b b 互质,所以 y y y b b b 互质。而 y ≤ b y\le b yb ,所以不同的 y y y的数量是 φ ( b ) \varphi(b) φ(b)

然后考虑 x x x 。发现一列上的元素构成模 a a a 的完全剩余系。(这应该是初等数论基础内容,不给出证明了。)所以,对于一个定值 y y y ,只有 φ ( a ) \varphi(a) φ(a) x x x 满足 x b + y xb+y xb+y a a a 互质。

乘法原理, φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b) ,得证。

2.2.一般的计算

如果 p p p 是一个质数, k k k 是正整数,那么 φ ( p k ) = p k − 1 ( p − 1 ) \varphi(p^k)=p^{k-1}(p-1) φ(pk)=pk1(p1)

证明:考虑有多少个 x x x 满足 x ≤ p k x\le p^k xpk gcd ⁡ ( x , p k ) ≠ 1 \gcd(x,p^k)\ne 1 gcd(x,pk)=1

如果 x x x p p p 互质,那么 x x x p k p^k pk 互质;如果 x x x p p p 不互质,那么 x x x p k p^k pk 不互质。

x x x p p p 不互质,等价于 x x x p p p 的倍数——因为 p p p 是质数。

p k p^k pk 范围中,有多少个数是 p p p 的倍数呢? p k p = p k − 1 \frac{p^k}{p}=p^{k-1} ppk=pk1 个。

作差即可。 φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) \varphi(p^k)=p^k-p^{k-1}=p^{k-1}(p-1) φ(pk)=pkpk1=pk1(p1) ,得证。

再结合 积性函数 ,如果 n n n 的唯一质数分解是 n = p 1 t 1 p 2 t 2 p 3 t 3 … p m t m n=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_m^{t_m} n=p1t1p2t2p3t3pmtm ,那么

φ ( n ) = ∏ x = 1 m p x t x − 1 ( p x − 1 ) \varphi(n)=\prod_{x=1}^{m}p_x^{t_x-1}(p_x-1) φ(n)=x=1mpxtx1(px1)

2.3.特殊的计算

发现 p x t x − 1 ( p x − 1 ) = p x t x × p x − 1 p x p_x^{t_x-1}(p_x-1)=p_x^{t_x}\times\frac{p_x-1}{p_x} pxtx1(px1)=pxtx×pxpx1 。那么

φ ( n ) = n ∏ x = 1 m ( 1 − 1 p x ) \varphi(n)=n\prod_{x=1}^{m}(1-\frac{1}{p_x}) φ(n)=nx=1m(1px1)

这个东西其实可以理解为 容斥

因为 p x − 1 p x = 1 − 1 p x \frac{p_x-1}{p_x}=1-\frac{1}{p_x} pxpx1=1px1 ,所以说, ∏ p x − 1 p x \prod\frac{p_x-1}{p_x} pxpx1 就是考虑,是否要去掉 p x p_x px 的倍数——毕竟 n × 1 p x n\times\frac{1}{p_x} n×px1 就是 p x p_x px 的倍数个数。

嗯?你说为什么长的不像普通容斥?我个人倾向于,将其当做类似母函数的东西。

3.性质

3.0.积性函数

前面已经讲过 积性函数 ,这里就略过。

3.1.与 n n n 的关系

还有一个很美妙的结论(使得杜教筛在 φ \varphi φ 上可以大显身手): ∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n

注:这是我在博客园中看到的

{ 1 , 2 , 3 , … , n } \{1,2,3,\dots,n\} {

1,2,3,,n} 按如下规则划分: S d = { x ∣ gcd ⁡ ( x , n ) = d } S_d=\{x|\gcd(x,n)=d\} Sd={
xgcd(x,n)=
d}
,即公因数为 d d d 的。

显然,任意 x ∈ S d x\in S_d xSd ,可以写成 x = k d ( 1 ≤ k ≤ n d x=kd(1\le k\le\frac{n}{d} x=kd(1kdn 但不一定取遍 ) ) )

由定义, gcd ⁡ ( x , n ) = gcd ⁡ ( k d , n ) = d ⇒ gcd ⁡ ( k , n d ) = 1 \gcd(x,n)=\gcd(kd,n)=d\Rightarrow\gcd(k,\frac{n}{d})=1 gcd(x,n)=gcd(kd,n)=dgcd(k,dn)=1

这样一来, ∣ S d ∣ = φ ( n d ) |S_d|=\varphi(\frac{n}{d}) Sd=φ(dn) 。于是 n = ∑ d ∣ n card ( S d ) = ∑ d ∣ n φ ( n d ) n=\sum_{d|n}\text{card}(S_d)=\sum_{d|n}\varphi(\frac{n}{d}) n=dncard(Sd)=dnφ(dn) ,得证。

3.2.与莫比乌斯挂钩

还有一个骚骚的操作(将 n n n 移项,类似容斥,证明略):

∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} dndμ(d)=nφ(n)

3.3.“偶性”

对于所有 n > 2 n>2 n>2 都有 φ ( n ) \varphi(n) φ(n) 为偶数。

证明:如果 n n n 中含有任意一个奇素因数 p p p ,那么根据 一般的计算 ,可知 2 ∣ ( p − 1 ) ∣ φ ( n ) 2|(p-1)|\varphi(n) 2(p1)φ(n)

而不包含奇素因数的数只有 1 1 1 2 2 2

3.4.“收敛”速度快

接下来的这一点,是很多题复杂度的保障:如果 2 ∣ n 2|n 2n ,那么 φ ( n ) ≤ n 2 \varphi(n)\le \frac{n}{2} φ(n)2n

证明: n n n 中含有 p = 2 p=2 p=2 这一质因子。根据 特殊的计算 φ ( n ) ≤ n ( 1 − 1 p ) = n 2 \varphi(n)\le n(1-\frac{1}{p})=\frac{n}{2} φ(n)n(1p1)=2n

那么, n ′ = φ ( n ) n'=\varphi(n) n=φ(n) 需要多少次到达 1 1 1 呢? O ( log ⁡ n ) \mathcal O(\log n) O(logn) 次。结合 φ ( n ) \varphi(n) φ(n) 永远是偶数,每次都至少变小一半嘛,除了第一步。

4.代码实现

4.1.求一个数的 φ \varphi φ

直接用 一般的计算 即可。

int getPhi(int n){   	int res = 1;	for(int x=2; 1ll*x*x<=n; ++x){   		if(n%x) continue;		n /= x, res *= (x-1);		while(n%x == 0)			n /= x, res *= x;	}	if(n != 1) res *= (n-1);	return res;}

还有写法二:

long long __phi(long long n){   	long long res = n;	for(int i=2; 1ll*i*i<=n; ++i)		if(n%i == 0){   			res = res/i*(i-1);			while(n%i == 0)				n /= i;		}	if(n != 1) res = res/n*(n-1);	return res;}

4.2.求一群数的 φ \varphi φ

与线性筛相配合。毕竟是积性函数。

void sievePrime(int n){   	for(int i=2; i<=n; ++i)		isPrime[i] = true;	primes.clear(); phi[1] = 1;	for(int i=2; i<=n; ++i){   		if(isPrime[i]){   			primes.push_back(i);			phi[i] = i-1;		}		for(int j=0,len=primes.size(); j

4.3.奇怪法求一个

就使用 骚骚的操作 ,用 μ \mu μ 来算(当然,你直接当成容斥也可以)。

int getPhi(int n){   	vector
ys; // 质因数 while(n != 1){ d = findDivisor(n); // 找到一个质因数 ys.push_back(d); while(n%d == 0) n /= d; } sort(ys.begin(),ys.end()); n = ys.size(); int res = n; for(int S=1; S<(1<
>i&1){ sgn = -sgn; cnt /= ys[i]; } res += sgn*cnt; } return res;}

好处是什么呢?——可以求 ∑ x = 1 n [ gcd ⁡ ( x , m ) = 1 ] \sum_{x=1}^{n}[\gcd(x,m)=1] x=1n[gcd(x,m)=1] 。只需要稍稍作一点改动。

4.4.奇怪求法进行推广

int getCoprime(int n,int m){   	vector
ys; // 质因数 while(m != 1){ d = findDivisor(m); // 找到一个质因数 ys.push_back(d); while(m%d == 0) m /= d; } sort(ys.begin(),ys.end()); m = ys.size(); int res = n; for(int S=1; S<(1<
>i&1) sgn = -sgn, cnt /= ys[i]; res += sgn*cnt; } return res;}

4.5.求 n n n 的所有因数的 φ \varphi φ

能够做到 n \sqrt n n 的复杂度——也就是说,均摊 O ( 1 ) \mathcal O(1) O(1)

首先线性筛求出 ∀ x ≤ n \forall x\le \sqrt n xn φ ( x ) \varphi(x) φ(x) ,然后 O ( n ) \mathcal O(\sqrt n) O(n ) 的求出 φ ( n ) \varphi(n) φ(n) 。接下来要做的,就是研究 φ ( x ) , φ ( n x ) , φ ( n ) \varphi(x),\varphi(\frac{n}{x}),\varphi(n) φ(x),φ(xn),φ(n) 的关系。

观察 2.3.特殊的计算 中的右半部分,也就是 ∏ p ∣ n , p ∈ P ( 1 − 1 p ) \prod_{p|n,p\in\Bbb{P}}(1-\frac{1}{p}) pn,pP(1p1) ,将其记为 λ ( n ) \lambda(n) λ(n) 。于是就有 n λ ( n ) = φ ( n ) n\lambda(n)=\varphi(n) nλ(n)=φ(n)

考虑这样一个恒等式:记 d = gcd ⁡ ( x , n x ) d=\gcd(x,\frac{n}{x}) d=gcd(x,xn) ,那么

λ ( x ) λ ( n x ) = λ ( n ) λ ( d ) \lambda(x)\lambda\left(\frac{n}{x}\right)=\lambda(n)\lambda(d) λ(x)λ(xn)=λ(n)λ(d)

证明:如果 p ∣ d p|d pd ,那么会被计算两次;如果 p p p 不是 n n n 的因数,那么一次也不会计算;其他的情况,只计算一次。证毕。

把两边同时乘一个 n n n 可以得到:

x λ ( x ) ⋅ n x ⋅ λ ( n x ) = n λ ( n ) λ ( d ) ⇒ φ ( x ) φ ( n x ) = φ ( n ) φ ( d ) d ⇒ φ ( n x ) = φ ( n ) φ ( d ) d φ ( x ) x\lambda(x)\cdot \frac{n}{x}\cdot \lambda\Big(\frac{n}{x}\Big)=n\lambda(n)\lambda(d)\\ \Rightarrow \varphi(x)\varphi\Big(\frac{n}{x}\Big)=\varphi(n)\frac{\varphi(d)}{d}\\ \Rightarrow\varphi\Big(\frac{n}{x}\Big)=\frac{\varphi(n)\varphi(d)}{d\varphi(x)} xλ(x)xnλ(xn)=nλ(n)λ(d)φ(x)φ(xn)=φ(n)dφ(d)φ(xn)=dφ(x)φ(n)φ(d)

然后战斗结束了。更通用一点的公式就是: φ ( a ) φ ( b ) = φ ( a b ) φ [ gcd ⁡ ( a , b ) ] gcd ⁡ ( a , b ) \varphi(a)\varphi(b)=\varphi(ab)\frac{\varphi[\gcd(a,b)]}{\gcd(a,b)} φ(a)φ(b)=φ(ab)gcd(a,b)φ[gcd(a,b)]

可以发现,这是自洽的——在 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 的情况下,自然满足 3.0.积性函数 咯。


B.欧拉公式

0.概述

用来解决带取模的、指数极大的情况。

1.定义

传说中的——

a φ ( b ) ≡ { 1 ( gcd ⁡ ( a , b ) = 1 ) a 2 φ ( b ) ( gcd ⁡ ( a , b ) ≠ 1 ) ( m o d b ) a^{\varphi(b)}\equiv\begin{cases} 1&(\gcd(a,b)=1)\\ a^{2\varphi(b)}&(\gcd(a,b)\ne 1) \end{cases}\pmod b aφ(b){

1a2φ(b)(gcd(a,b)=1)(gcd(a,b)=1)(modb)

内涵就是——

a x ≡ { a x   m o d   φ ( b ) ( gcd ⁡ ( a , b ) = 1 ) a x   m o d   φ ( b ) + φ ( b ) ( gcd ⁡ ( a , b ) ≠ 1 ∧ x ≥ φ ( b ) ) a^x\equiv\begin{cases} a^{x\bmod \varphi(b)}&(\gcd(a,b)=1)\\ a^{x\bmod \varphi(b)+\varphi(b)}&(\gcd(a,b)\ne 1\wedge x\ge\varphi(b)) \end{cases} ax{

axmodφ(b)axmodφ(b)+φ(b)(gcd(a,b)=1)(gcd(a,b)=1xφ(b))

2.证明

第二个我不会证明。对于第一个,用这样的方法证明:

考虑 n = φ ( b ) n=\varphi(b) n=φ(b) 个与 b b b 互质且小于等于 b b b 的数 x 1 , x 2 , x 3 , … , x n x_1,x_2,x_3,\dots,x_n x1,x2,x3,,xn

都乘以 a a a ,得到 a x 1 , a x 2 , a x 3 , … , a x n ax_1,ax_2,ax_3,\dots,ax_n ax1,ax2,ax3,,axn 。由于 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 ,所以新的这 n n n 个数仍然与 b b b 互质。

将其同时   m o d     b \bmod\thickspace b modb ,显然,仍然与 b b b 互质,并且两两不同。与 b b b 互质并且小于等于 b b b 的数一共只有 n n n 个,所以两个序列形成的集合是相同的。

都累乘,一定相等,即 ∏ i = 1 n x i ≡ ∏ i = 1 n ( a x i ) ( m o d b ) \prod_{i=1}^{n}x_i\equiv\prod_{i=1}^{n}(ax_i)\pmod b i=1nxii=1n(axi)(modb)

所以 a n = a φ ( b ) ≡ 1 ( m o d b ) a^n=a^{\varphi(b)}\equiv1\pmod b an=aφ(b)1(modb)


C.实战

Naive Great Common Divisor \text{Naive Great Common Divisor} Naive Great Common Divisor

。应该算比较常规的方法。

The Luckiest Number \text{The Luckiest Number} The Luckiest Number

。用欧拉公式解决关于 x x x的方程 a x ≡ 1 ( m o d b ) a^x\equiv 1\pmod b ax1(modb)

POAIBE \text{POAIBE} POAIBE

p.s. \text{p.s.} p.s.这个名字是缩写。

杜教筛求 φ \varphi φ 的前缀和

我们已经知道了 φ ∗ I = i d \varphi*I=id φI=id ,直接用即可。

放公式:令 S n = ∑ i = 1 n φ ( i ) S_n=\sum_{i=1}^{n}\varphi(i) Sn=i=1nφ(i) ,一定有

S n = n ( n + 1 ) 2 − ∑ d = 1 n S ( ⌊ n d ⌋ ) S_n=\frac{n(n+1)}{2}-\sum_{d=1}^{n}S(\lfloor\frac{n}{d}\rfloor) Sn=2n(n+1)d=1nS(dn)

map
wk; /* WK(freopen) or2 */long long djs(int n){ if(n < SqrtN) return phi[n]; /* 线性筛中得到的结果 */ if(wk.count(n)) return wk[n]; /* 记忆化 */ long long res = 1ll*n*(n+1)>>1; for(int l=1,r; l<=n; l=r){ r = n/(n/l)+1; /* 整除分块 */ res -= (r-l)*djs(n/l); } return wk[n] = res;}

复杂度是 O ( n 2 3 ) \mathcal O(n^{

{2\over 3}}) O(n32) 的。不知道什么原理。

转载地址:http://qtvq.baihongyu.com/

你可能感兴趣的文章
VTK:隐式函数之ImplicitSphere
查看>>
VTK:InfoVis之DelimitedTextReader
查看>>
数据结构与算法学习1-----稀疏数组
查看>>
Java转换xml格式时间 (yyyy-MM-ddTHH:mm:ss.SSSZ)
查看>>
关于json
查看>>
焦点事件
查看>>
webpack打包常见报错
查看>>
web前端面试一从输入url到看到页面发生了什么
查看>>
智慧水利的泵站自动化监控系统解决方案
查看>>
C getopt.h
查看>>
TensorRT/parsers/caffe/caffeParser/caffeParser.h源碼研讀
查看>>
PCL MLS論文Computing and Rendering Point Set Surfaces研讀筆記
查看>>
CentOS下Nvidia docker 2.0之安裝教程&踩坑實錄
查看>>
PIL及matplotlib:OSError: cannot identify image file錯誤及解決方式
查看>>
H5页面授权获取微信授权(openId,微信nickname等信息)
查看>>
SpringBoot的URL是如何拼接的
查看>>
2018年年终总结
查看>>
解决checkbox未选中不传递value的多种方法
查看>>
【pgsql-参数详解1】PostgreSQL默认参数值
查看>>
HTTP协议(1)_入门的一些教程和资源
查看>>