【数论基础】—— 欧拉函数

1. 定义

φ \varphi φ(n) 表示小于等于 n n n的正整数中与 n n n互质的数的数目,例如 φ ( 8 ) = 4 \varphi(8) = 4 φ(8)=4因为 1 , 3 , 5 , 7 1,3,5,7 1,3,5,7 8 8 8互质

特殊的令 φ ( 1 ) = 1 \varphi(1) = 1 φ(1)=1

2.欧拉函数值

(1)n 为 质数

此时只有 n n n n n n 不互质其余正整数均与其互质(注意 g c d ( 1 , n ) = 1 gcd(1,n) = 1 gcd(1,n)=1也与其互质)

所以 φ ( n ) = n − 1 ( n 为质数 ) \varphi(n) = n - 1 (n 为质数) φ(n)=n1(n为质数)

(2)n 为 合数

n n n 时质数 p p p k k k此幂,

φ ( n ) = φ ( p k ) = p k − p k − 1 = ( p − 1 ) × p k − 1 \varphi(n) = \varphi(p^k) = p^k-p^{k-1} = (p - 1) \times p ^{k - 1} φ(n)=φ(pk)=pkpk1=(p1)×pk1

这个公式其实也很好理解,只要不是 p p p的倍数的数都和 n n n互质,所以所有数 p k p^k pk减去所有 p p p的倍数( 1 × p , 2 × p , … , p k − 1 × p 1 \times p,2 \times p,\ldots,p^{k-1} \times p 1×p,2×p,,pk1×p,总共 p k − 1 p^{k-1} pk1)得到一共有 p k − p k − 1 = ( p − 1 ) × p k − 1 p^k-p^{k-1} = (p - 1) \times p ^{k - 1} pkpk1=(p1)×pk1个数,也就是 φ ( n ) = ( p − 1 ) × p k − 1 \varphi(n) = (p - 1) \times p ^{k - 1} φ(n)=(p1)×pk1

然后推广一下

令 n = p 1 k 1 × p 2 k 2 × ⋯ × p r k r 则 φ ( n ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) × ⋯ × φ ( p r k r ) 令n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} \\则 \varphi(n) = \varphi(p_1^{k_1}) \times \varphi(p_2^{k_2}) \times \cdots \times \varphi(p_r^{k_r}) n=p1k1×p2k2××prkrφ(n)=φ(p1k1)×φ(p2k2)××φ(prkr)

欧拉函数的积性大家可以自己证明一下,方法同 n = p k n = p^k n=pk一样,容斥原理用总体减局部在加上减重的,然后对算式化简

(提示:可以先思考一下 φ ( p 1 k 1 × p 2 k 2 ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) \varphi(p_1^{k_1} \times p_2^{k_2}) = \varphi(p_1^{k_1}) \times \varphi(p_2^{k_2}) φ(p1k1×p2k2)=φ(p1k1)×φ(p2k2)如何用上述方法证明)

继续化简公式 将 φ ( n ) = φ ( p k ) = p k − p k − 1 = ( p − 1 ) × p k − 1 \varphi(n) = \varphi(p^k) = p^k-p^{k-1} = (p - 1) \times p ^{k - 1} φ(n)=φ(pk)=pkpk1=(p1)×pk1
所以
φ ( n ) = ∏ i = 1 r p i k i − 1 × ( p i − 1 ) = n × ∏ i = 1 r p i − 1 p i \varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} φ(n)=i=1rpiki1×(pi1)=n×i=1rpipi1
这个直接转换一下就好了( n = p 1 k 1 × p 2 k 2 × ⋯ × p r k r n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} n=p1k1×p2k2××prkr带入)
所以我们就有了一个较为简便的求解欧拉函数的公式

3.欧拉函数的常用性质与证明 (共7条)

以下部分是后面的基础,很简单,但是一定先要搞明白

(1) 积性性质

当 m , n 互质时 φ ( n × m ) = φ ( n ) × φ ( m ) 当m,n互质时 \varphi(n \times m) = \varphi(n) \times \varphi(m) m,n互质时φ(n×m)=φ(n)×φ(m)

(2) 当n为奇数时

φ ( 2 ∗ n ) = φ ( n ) \varphi(2 * n) = \varphi(n) φ(2n)=φ(n)
证明很简单:
n 为奇数 gcd ⁡ ( 2 , n ) = 1 \gcd(2,n) = 1 gcd(2,n)=1 所以由(1)可知 φ ( 2 × n ) = φ ( 2 ) × φ ( n ) = 1 × φ ( n ) = φ ( n ) \varphi(2 \times n) = \varphi(2) \times \varphi(n) = 1 \times \varphi(n) = \varphi(n) φ(2×n)=φ(2)×φ(n)=1×φ(n)=φ(n)
前两个都很好理解,接下来是重点

(3) φ ( n ) = φ ( n P 1 ) × P 1 \varphi(n) = \varphi(\frac{n}{P_1}) \times P_1 φ(n)=φ(P1n)×P1 (p 能整除 n p \frac{n}{p} pn)

证明:
因为 P 1 P_1 P1能整除 n P 1 \frac{n}{P_1} P1n,所以 n n n P 1 2 P_1^2 P12的倍数
带入 φ ( n ) = ∏ i = 1 r p i k i − 1 × ( p i − 1 ) = n × ∏ i = 1 r p i − 1 p i \varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} φ(n)=i=1rpiki1×(pi1)=n×i=1rpipi1
m = n P 1 m = \frac{n}{P_1} m=P1n
所以 φ ( m ) \varphi(m) φ(m) φ ( n ) \varphi(n) φ(n) 相当于给他乘上一些p因子且p因子是他本身就有的因子(可能为多个,因为 P 1 P_1 P1可以是合数)
所以
φ ( m ) = ∏ i = 1 r p i k i − 1 × ( p i − 1 ) = m × ∏ i = 1 r p i − 1 p i φ ( n ) = ∏ i = 1 r p i k i ( + 1 ) − 1 × ( p i − 1 ) = m × ∏ i = 1 r p i − 1 p i ( 其中 k i ( + 1 ) − 1 的地方 p i 同时是 P 1 的因子 ) \varphi(m) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} \\ \varphi(n) = \prod_{i=1}^{r}p_i^{k_i (+1) - 1} \times (p_i - 1) = m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} (其中k_i(+1)-1的地方p_i同时是P_1的因子) φ(m)=i=1rpiki1×(pi1)=m×i=1rpipi1φ(n)=i=1rpiki(+1)1×(pi1)=m×i=1rpipi1(其中ki(+1)1的地方pi同时是P1的因子)
中某些 k i − 1 k_i - 1 ki1变成了 k i k_i ki所以再把它提出来
φ ( n ) = P 1 × ∏ i = 1 r p i k i − 1 × ( p i − 1 ) = P 1 × m × ∏ i = 1 r p i − 1 p i = P 1 × φ ( m ) \varphi(n) = P_1 \times \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = P_1 \times m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} = P_1 \times \varphi(m) φ(n)=P1×i=1rpiki1×(pi1)=P1×m×i=1rpipi1=P1×φ(m)
注意上述 P 1 P_1 P1 p p p是两个不同的含义 P 1 P_1 P1是一个数而 p p p表示m的质因子集合(当然也是n的)

(4) φ ( n ) = φ ( n p ) × ( p − 1 ) \varphi(n) = \varphi(\frac{n}{p}) \times (p - 1) φ(n)=φ(pn)×(p1) ( p p p n p \frac{n}{p} pn互质 且 p p p是质数)

证明:
利用(1)积性性质 可得
φ ( n ) = φ ( n p × p ) = φ ( n p ) × φ ( p ) \varphi(n) = \varphi(\frac{n}{p} \times p) = \varphi(\frac{n}{p}) \times \varphi(p) φ(n)=φ(pn×p)=φ(pn)×φ(p)
又因为 p p p是质数,所以 φ ( p ) = p − 1 \varphi(p) = p - 1 φ(p)=p1
所以
φ ( n ) = φ ( n p ) × φ ( p ) = ( p − 1 ) × φ ( n p ) \varphi(n) = \varphi(\frac{n}{p}) \times \varphi(p) = (p - 1) \times \varphi(\frac{n}{p}) φ(n)=φ(pn)×φ(p)=(p1)×φ(pn)
以上部分是线性筛求欧拉函数的基础 重点
以下部分是一些美妙的性质

(5) n = ∑ d ∣ n φ ( d ) n = \sum_{d|n} \varphi(d) n=dnφ(d)

证明:
f ( n ) = ∑ d ∣ n φ ( d ) f(n) = \sum_{d|n}{\varphi(d)} f(n)=dnφ(d)
n , m n,m n,m互质
f ( n m ) = ∑ d ∣ n m φ ( d ) f(nm) = \sum_{d|nm}{\varphi(d)} f(nm)=dnmφ(d)
注意到 n , m n,m n,m互质,所以 n , m n,m n,m的质因子没有相同的
所以我们相当于在 n , m n,m n,m的质因子中各取一些组合在一起成了 d d d
又因为(1)积性性质 φ ( n × m ) = φ ( n ) × φ ( m ) ( n , m 互质 ) \varphi(n \times m) = \varphi(n) \times \varphi(m) (n,m互质) φ(n×m)=φ(n)×φ(m)(n,m互质)
所以
f ( n m ) = ∑ d ∣ n φ ( d 1 × d 2 ) ( 其中 d 1 是 n 的因数, d 2 是 m 的因数且 d 1 × d 2 = d ) 所以 f ( n m ) = ( ∑ d 1 ∣ n φ ( d 1 ) ) × ( ∑ d 2 ∣ m φ ( d 2 ) ) = f ( n ) × f ( m ) f(nm) = \sum_{d|n}\varphi(d_1 \times d2) (其中d_1是n的因数,d_2是m的因数 且 d_1 \times d_2 = d)\\ 所以 f(nm)= (\sum_{d_1|n}{\varphi(d_1)}) \times (\sum_{d_2|m}{\varphi(d_2)}) = f(n) \times f(m) f(nm)=dnφ(d1×d2)(其中d1n的因数,d2m的因数且d1×d2=d)所以f(nm)=(d1nφ(d1))×(d2mφ(d2))=f(n)×f(m)
所以 f ( n ) f(n) f(n)也是积性函数
和前面2.欧拉函数的值的部分一样,继续利用质因数分解证明
先解决其中的一个小问题 当 p p p 是质数时 f ( p k ) f(p^k) f(pk),得
f ( p k ) = ∑ d ∣ p k φ ( d ) = φ ( 1 ) + φ ( p ) + φ ( p 2 ) + … + φ ( p k ) f(p^k) = \sum_{d|p^k}{\varphi(d)} = \varphi(1) + \varphi(p) + \varphi(p^2) + \ldots + \varphi(p^k) f(pk)=dpkφ(d)=φ(1)+φ(p)+φ(p2)++φ(pk)
再利用前面2.欧拉函数的值中已经证明的 φ ( n ) = ( p − 1 ) × p k − 1 \varphi(n) = (p - 1) \times p ^{k - 1} φ(n)=(p1)×pk1
所以
f ( p k ) = 1 + ( p − 1 ) × ( p 0 + p 1 + p 2 + … + p k − 1 ) f(p^k) = 1+(p - 1) \times (p^0 + p^1 + p^2 + \ldots + p^{k - 1}) f(pk)=1+(p1)×(p0+p1+p2++pk1)
明显的等比数列
所以
f ( p k ) = 1 + ( p − 1 ) × ( 1 − p k ) ( 1 − p ) = 1 + ( p k − 1 ) = p k f(p^k) = 1 + (p - 1) \times \frac{(1 - p^k)}{(1 - p)} = 1 + (p^k - 1) = p^k f(pk)=1+(p1)×(1p)(1pk)=1+(pk1)=pk
所以
n = p 1 k 1 × p 2 k 2 × ⋯ × p r k r n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} n=p1k1×p2k2××prkr,的
f ( n ) = f ( p 1 k 1 × p 2 k 2 × ⋯ × p r k r ) = f ( p 1 k 1 ) × f ( p 2 k 2 ) × … × f ( p r k r ) = p 1 k 1 × p 2 k 2 × ⋯ × p r k r = n f(n) = f(p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r}) = f(p_1^{k_1}) \times f(p_2^{k_2}) \times \ldots \times f(p_r^{k_r}) = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} = n f(n)=f(p1k1×p2k2××prkr)=f(p1k1)×f(p2k2)××f(prkr)=p1k1×p2k2××prkr=n
得证

(6) 小于 n n n且与 n n n互质的数的和等于 n × φ ( n ) 2 \frac{n \times \varphi(n)}{2} 2n×φ(n)

假设 a 1 , a 2 , … , a m a_1,a_2,\ldots,a_m a1,a2,,am n n n互质, m = φ ( n ) m = \varphi(n) m=φ(n),可以得到 n − a 1 , n − a 2 , … , n − a m n - a_1,n - a_2,\ldots,n - a_m na1,na2,,nam也与 n n n互质,且恰好就是 a 1 , a 2 , … , a m a_1,a_2,\ldots,a_m a1,a2,,am
这里其实可以反证
若 n − x 与 n 不互质 则可以设 n − x = k 1 g , n = k 2 g ( 其中 g = g c d ( n − x , n ) , k 1 与 k 2 互质 ) 把 n = k 2 g 带入 n − x = k 1 g ,得 k 2 g − x = k 1 g x = ( k 2 − k 1 ) g 所以 g c d ( x , n ) = g c d ( ( k 2 − k 1 ) g , k 2 g ) = g 不成立 若n - x与n不互质\\ 则可以设 n - x = k_1g,n = k_2g (其中g = gcd(n - x,n),k_1与k_2互质) \\ 把n = k_2g带入n - x = k_1g,得\\ k_2g - x = k_1g \\ x = (k_2 - k_1)g \\ 所以 gcd(x,n) = gcd((k_2 - k_1)g,k_2g) = g不成立 nxn不互质则可以设nx=k1g,n=k2g(其中g=gcd(nx,n),k1k2互质)n=k2g带入nx=k1g,得k2gx=k1gx=(k2k1)g所以gcd(x,n)=gcd((k2k1)g,k2g)=g不成立
因为 { a 1 , a 2 , … , a m } , { n − a 1 , n − a 2 , … , n − a m } \{a_1,a_2,\ldots,a_m\},\{n - a_1,n - a_2,\ldots,n - a_m\} {a1,a2,,am},{na1,na2,,nam}中所有数都与n互质且与n互质的数只有 m m m个所以这两个集合必然相同,把这两个集合加起来
令 s = a 1 + a 2 + … + a m ,则 2 s = ∑ i = 1 m a i + ∑ i = 1 m n − a i = ∑ i = 1 m a i + ( n − a i ) = ∑ i = 1 m n = n × m s = n × m 2 令 s = a_1 + a_2 + \ldots + a_m,则\\ 2s = \sum_{i=1}^{m}{a_i} + \sum_{i=1}^{m}{n - a_i}= \sum_{i = 1}^{m}{a_i + (n - a_i)} = \sum_{i = 1}^{m}{n} = n \times m\\ s = \frac{n \times m}{2} s=a1+a2++am,则2s=i=1mai+i=1mnai=i=1mai+(nai)=i=1mn=n×ms=2n×m
得证

4.欧拉函数的代码实现

1.不常见的 O ( n l o g 2 n ) O(n log^2n) O(nlog2n)

利用
欧拉函数的性质5: n = ∑ d ∣ n φ ( d ) n = \sum_{d|n} \varphi(d) n=dnφ(d)
移向: φ ( n ) = n − ∑ d ∣ n , d ≠ n φ ( d ) \varphi(n) = n - \sum_{d|n,d \neq n} \varphi(d) φ(n)=ndn,d=nφ(d)

const int MAXN = 1e5;
int phi[MAXN + 5];
void GetPhi(int N) {
	for(int i = 1;i <= N;i++) {
		phi[i] = i; 
		/*
			相当于标记数组
			如果 phi[i] == i 则其为质数
		*/
	}
	for(int i = 1;i <= N;i ++) {
		for(int j = 2 * i;j <= N;j += i) { // j = k * i 
			phi[j] -= phi[i];
		}
	}
}

2.朴素版本(类似埃筛) O ( n l o g 2 n ) O(n log^2n) O(nlog2n)

利用 φ ( n ) = ∏ i = 1 r p i k i − 1 × ( p i − 1 ) = n × ∏ i = 1 r p i − 1 p i \varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} φ(n)=i=1rpiki1×(pi1)=n×i=1rpipi1先初始话phi[i] = i相当于 × n \times n ×n然后主动枚举 p i p_i pi乘上 p i − 1 p i \frac{p_i - 1}{p_i} pipi1

//筛出 1 ~ N的欧拉函数
const int MAXN = 1e5;
int phi[MAXN + 5];
void GetPhi(int N) {
	phi[1] = 1;
	for(int i = 2;i <= N;i++) {
		phi[i] = i; 
		/*
			相当于标记数组
			如果 phi[i] == i 则其为质数
		*/
	}
	for(int i = 2;i <= N;i ++) {
		if (phi[i] == i) {
			// 这里从i开始会把 phi[i] 设为 i - 1
			for(int j = i;j <= N;j += i) { // j = k * i 
				phi[j] = phi[j] / i * (i - 1);
				// 先除是防止乘法时溢出
			}
		}
	}
}

3.线性筛 O ( n ) O(n) O(n)

利用
欧拉函数的性质3: φ ( n ) = φ ( n P 1 ) × P 1 \varphi(n) = \varphi(\frac{n}{P_1}) \times P_1 φ(n)=φ(P1n)×P1 (p 能整除 n p \frac{n}{p} pn)
欧拉函数的性质4: φ ( n ) = φ ( n p ) × ( p − 1 ) \varphi(n) = \varphi(\frac{n}{p}) \times (p - 1) φ(n)=φ(pn)×(p1) ( p p p n p \frac{n}{p} pn互质 且 p p p是质数)

const int MAXN = 1e5;
int phi[MAXN + 5],pri[MAXN + 5],cnt;
bool not_prim[MAXN + 5];
void GetPhi(int N) {
	phi[1] = 1;
	for(int i = 2;i <= N;i ++){
		if (!not_prim[i]) {
			pri[++cnt] = i;
			phi[i] = i - 1; // 素数的欧拉函数=素数本身 - 1
		}
		for(int j = 1;j <= cnt && i * pri[j] <= N;j ++){
			not_prim[i * pri[j]] = true;
			if (i % pri[j] == 0) { // i * pri[j']中最小的质因子一定为pri[j]而不是pri[j']所以break掉
				phi[i * pri[j]] = phi[i] * pri[j]; // 欧拉函数的性质3
				break;
			}
			phi[i * pri[j]] = phi[i] * (pri[j] - 1); // 欧拉函数的性质4
		}
	}	
}

超详细的欧拉函数讲解
详细证明欧拉函数的性质
实现三种欧拉函数的求值
最后 撰写不易,做人,一定要善良; 点赞,好人,有好福
关注我,收藏 点赞 评论文章 更多精品文章将尽快出炉

  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值