欧拉函数学习笔记

本文介绍了欧拉函数的定义,求法包括基于质因数分解和线性求法,并详细探讨了欧拉函数在解决求和问题和利用欧拉定理降幂中的应用。通过例题展示了如何在实际问题中运用欧拉函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

φ ( n ) \varphi(n) φ(n)(读作fai)定义为[1, n]中与n互质的数的个数

显然,当 n n n 是素数时, φ ( n ) = n − 1 \varphi(n) = n-1 φ(n)=n1




欧拉函数的求法

关于 φ ( n ) \varphi(n) φ(n) ,有几种不同的求法,视情况使用。


首先呢,我们需要知道一个性质。

两个数 a , b a, b a,b 互质时, φ ( a b ) = φ ( a ) ∗ φ ( b ) \varphi(ab)=\varphi(a)*\varphi(b) φ(ab)=φ(a)φ(b)
这是欧拉函数的积性性质,具体证明可以参考网上撒(因为我不会,我们对欧拉函数的求法,基本上都会基于此性质。


① 基于质因数分解的求法

考虑 p , q p,q pq都是素数, n = p ∗ q n=p*q n=pq的情况。
由容斥原理:
φ ( n ) = n − n p − n q + n p q = n ( 1 − 1 p ) ( 1 − 1 q ) = ( p − 1 ) ∗ ( q − 1 ) = φ ( p ) ∗ φ ( q ) \varphi(n)=n - \dfrac{n}{p} - \dfrac{n}{q} + \dfrac{n}{pq} = n(1-\dfrac{1}{p})(1-\dfrac{1}{q}) = (p-1)*(q-1)=\varphi(p)*\varphi(q) φ(n)=npnqn+pqn=n(1p1)(1q1)=(p1)(q1)=φ(p)φ(q)
拓展到多个素因子的情况 n = p 1 k 1 p 2 k 2 . . . . p m k m n = p_1^{k_1}p_2^{k_2}....p_m^{k_m} n=p1k1p2k2....pmkm
那么
φ ( n ) = ∏ i = 1 m φ ( p i ) = n ( 1 − 1 p 1 ) . . . ( 1 − 1 p m ) \varphi(n) = \prod \limits_{i=1}^{m}\varphi(p_i) \\ = n(1-\dfrac{1}{p_1})...(1-\dfrac{1}{p_m}) φ(n)=i=1mφ(pi)=n(1p11)...(1pm1)
( 其实把二式拆开,我们会发现满足容斥原理 )
那么我们就得到了求 φ ( n ) \varphi(n) φ(n) 的 第一种方法,就是求出 n n n 的 素因子(俗称质因数分解=。=
复杂度 O ( n ) O(\sqrt{n}) O(n )

代码如下:
int phi(int x) {
    int ret = x;
    for (int i = 2; i * i <= x; ++i)
        if (x % i == 0) {
            while (x % i == 0) x /= i;
            ret = ret / i * (i - 1);
        }
    if (x > 1) ret = ret / x * (x - 1);
    return ret;
}


② 线性求法

继续考虑
n = p 1 k 1 p 2 k 2 . . . . p m k m n = p_1^{k_1}p_2^{k_2}....p_m^{k_m} n=p1k1p2k2....pmkm

k 1 = 1 k_1 = 1 k1=1

那么 n / p 1 n / p_1 n/p1 p 1 p_1 p1互质,由积性函数可得:
φ ( n ) = φ ( n / p 1 )   ∗   φ ( p 1 ) = φ ( n / p 1 )   ∗   ( p 1 − 1 ) \varphi(n) = \varphi(n/p_1) ~* ~\varphi(p_1) = \varphi(n/p1)~*~(p1-1) φ(n)=φ(n/p1)  φ(p1)=φ(n/p1)  (p11)

k 1 &gt; = 2 k_1 &gt;= 2 k1>=2

那么 n / p 1 n / p_1 n/p1 n n n 有共同的素因子,也就是说,与 n n n 互质的数,同时也与 n / p 1 n/p1 n/p1 互质。
利用这个性质,我们考虑用 φ ( n / p 1 ) \varphi(n/p_1) φ(n/p1) 来递推。
g c d ( a ,   b ) = g c d ( a + k b ,   b ) gcd(a,~b)=gcd(a+kb,~b) gcd(a, b)=gcd(a+kb, b)

因此 φ ( n ) = φ ( n / p 1 ) ∗ p 1 \varphi(n) = \varphi(n/p_1) * p_1 φ(n)=φ(n/p1)p1

因此我们先用线性筛求出 n n n 的最小素因子,然后递推即可。

代码如下
for(i = 2; i <= m; i++){
		if(!x[i]) x[i] = p[++cnt] = i;
		for(j = 1; j <= cnt; j++){
			t = p[j] * i;
			if(t > m) break;
			x[t] = p[j];
			if(i % p[j] == 0) break;
		}
	}
	phi[1] = 1;
	for(i = 2; i <= m; i++){
		if(x[i / x[i]] == x[i]) phi[i] = phi[i / x[i]] * x[i];
		else phi[i] = phi[x / x[i]] * (x[i] - 1);
	} 



欧拉函数的应用

① 将求和问题转化为求个数问题

eg. 求 s = ∑ i = 1 n ∑ j = 1 n g c d ( i , j ) s = \sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n} gcd(i,j) s=i=1nj=1ngcd(i,j)
考虑枚举 d = g c d ( i , j ) d = gcd(i,j) d=gcd(i,j)
那么 s = ∑ d = 1 n d ∗ ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = = d ] = ∑ d = 1 n d ∗ ∑ i = 1 n ∑ j = 1 n [ g c d ( i / d , j / d ) = = 1 ] = ∑ d = 1 n d ∗ ( 2 ∗ ∑ i = 1 n ∑ j = 1 i [ g c d ( i / d , j / d ) = = 1 ] − 1 ) = ∑ d = 1 n d ∗ ( 2 ∗ ∑ i = 1 n φ ( i / d ) − 1 ) = ∑ d = 1 n d ∗ ( 2 ∗ ∑ i = 1 n / d φ ( i ) − 1 ) s = \sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i,j)==d] \\ =\sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i/d,j/d)==1] \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\sum \limits_{j=1}^{i}[gcd(i/d,j/d)==1] - 1) \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\varphi(i/d) - 1) \\ = \sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n/d}\varphi(i) - 1) s=d=1ndi=1nj=1n[gcd(i,j)==d]=d=1ndi=1nj=1n[gcd(i/d,j/d)==1]=d=1nd(2i=1nj=1i[gcd(i/d,j/d)==1]1)=d=1nd(2i=1nφ(i/d)1)=d=1nd(2i=1n/dφ(i)1)
预处理个前缀和即可。
这种想法非常常见!!!!!很重要!!!

② 欧拉定理及拓展
欧拉定理:如果 a , n a,n a,n互质,那么 a φ ( n ) ≡ 1     ( m o d   n ) a^{\varphi(n)} \equiv 1~~~ (mod~n) aφ(n)1   (mod n)
证明

构造简化剩余系证明就可以了。

拓展欧拉定理:

b &gt; p h i ( n ) b &gt; phi(n) b>phi(n) 时, a b ≡ a b   m o d   φ ( n ) + φ ( n )      ( m o d   n ) a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n) abab mod φ(n)+φ(n)    (mod n)

证明

证明 a φ ( n ) ≡ a 2 φ ( n )     ( m o d   n ) 即 可 a^{\varphi(n)} \equiv a^{2\varphi(n)}~~~(mod~n) 即可 aφ(n)a2φ(n)   (mod n)
证明:设 n = n 1 n 2 n=n_1n_2 n=n1n2,其中 n 1 = ( a ∞ , n ) n1=(a^\infin, n) n1=(a,n)
则有 ( a , n 2 ) = ( n 1 , n 2 ) = 1 (a, n_2)=(n_1, n_2)=1 (a,n2)=(n1,n2)=1
注意到 φ ( n ) ≥ l o g 2 n \varphi(n)≥log2n φ(n)log2n,因此 n 1 ∣ a φ ( n ) n_1|a^{\varphi(n)} n1aφ(n), a φ ( n ) ≡ a 2 φ ( n ) ≡ 0 ( m o d   n 1 ) . . . ( 1 ) a^{\varphi(n)}≡a^{2\varphi(n)}≡0 (mod ~n_1)...(1) aφ(n)a2φ(n)0(mod n1)...(1)
又由 ( n 1 , n 2 ) = 1 (n_1, n_2)=1 (n1,n2)=1 φ ( n ) = φ ( n 1 ) φ ( n 2 ) \varphi(n)=\varphi(n_1)\varphi(n_2) φ(n)=φ(n1)φ(n2),
由欧拉定理 a φ ( n ) ≡ a 2 φ ( n ) ≡ 1 ( m o d   n 2 ) . . . ( 2 ) a^{\varphi(n)}≡a^{2\varphi(n)}≡1 (mod~n_2)...(2) aφ(n)a2φ(n)1(mod n2)...(2)
中国剩余定理合并12两式得证。
推论: b &gt; p h i ( n ) b &gt; phi(n) b>phi(n) 时, a b ≡ a b   m o d   φ ( n ) + φ ( n )      ( m o d   n ) a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n) abab mod φ(n)+φ(n)    (mod n)

得到欧拉定理及拓展,我们就可以利用欧拉定理来降幂。

eg.求 7 222   m o d   10 7^{222}~mod~10 7222 mod 10
分析:(7, 10)=1, 故 7 φ ( 10 ) = 7 5 ≡ 1 ( m o d 10 ) 7^{\varphi(10)}=7^5≡1 (mod 10) 7φ(10)=751(mod10)
所以 7 222 ≡ 7 222   m o d   5 = 7 2 = 49 ≡ 9 ( m o d 10 ) 7^{222}≡7^{222~mod~5}=7^2=49≡9 (mod 10) 72227222 mod 5=72=499(mod10)
7 222   m o d   10 = 9 7^{222}~ mod ~10 = 9 7222 mod 10=9


一些例题

[SDOI2012] Longge的问题 (利用第一条应用

[SDOI2008]沙拉公主的困惑 (利用gcd的性质

bzoj 3884 上帝与集合的正确用法(利用欧拉定理降幂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值