当前位置: 首页 > news >正文

欧拉函数 | 定义 / 性质 / 应用

注:本文为 “欧拉函数” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。


欧拉函数最全总结

jiet07 已于 2024-10-22 10:00:54 修改

一、欧拉函数的引入

首先引入互质关系:

如果两个正整数,除了 111 以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。
比如,151515323232 没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。

其次引进缩系的概念:

在与模数 mmm 互素的全部剩余类中,各取一数所组成的集叫做模数 mmm 的一组缩系。

在讨论缩系的过程中,需要引入一个常用的数论函数–欧拉函数 φ(n)\varphi(n)φ(n)

请思考以下问题:
任意给定正整数 nnn,请问在小于等于 nnn 的正整数之中,有多少个与 nnn 构成互质关系?(比如,在 111888 之中,有多少个数与 888 构成互质关系?)

计算这个值的方法就叫做欧拉函数,以 φ(n)\varphi(n)φ(n) 表示。在 111888 之中,与 888 形成互质关系的是 111333555777,所以 φ(8)=4\varphi(8) = 4φ(8)=4

二、欧拉函数的定义

定义:欧拉函数 φ(n)\varphi(n)φ(n) 是一个定义在正整数集上的函数,φ(n)\varphi(n)φ(n) 的值等于序列 000111222,…,n−1n-1n1 中与 nnn 互素的数的个数。

此函数以其首名研究者欧拉命名 (Euler’s totient function),它又称为 Euler’s totient function、φ\varphiφ 函数、欧拉商数等。

特别的,φ(1)=1\varphi(1)=1φ(1)=1(和 111 互质的数 (小于等于 111) 就是 111 本身)。

函数表:0~100 欧拉函数表 ("x?"代表十位数, "x"代表个位数)

φ(n)0123456789
0?0112242646
1?41041268816618
2?812102282012181228
3?8301620162412361824
4?16401242202422461642
5?20322452184024362858
6?16603036324820663244
7?24702472364036602478
8?32544082246442564088
9?24724460467232964260

φ(100)=40\varphi(100)=40φ(100)=40

三、欧拉函数的性质

  1. 当 p 是素数时,φ(p)=p−1\varphi(p)=p-1φ(p)=p1
  2. 欧拉函数是积性函数,但不是完全积性函数。
    当且仅当 n 可以分解成两个互质的整数之积,即 n=p1×p2n = p_1 \times p_2n=p1×p2(其中 (p1,p2)=1(p_1,p_2)=1(p1,p2)=1),则 φ(n)=φ(p1p2)=φ(p1)φ(p2)\varphi(n) = \varphi(p_1p_2) = \varphi(p_1)\varphi(p_2)φ(n)=φ(p1p2)=φ(p1)φ(p2)
    特别的,对于两个素数 p, q,φ(pq)=(p−1)(q−1)\varphi(pq)=(p-1)(q-1)φ(pq)=(p1)(q1)(RSA 算法应用核心性质)。
  3. n>2n>2n2 时,φ(n)\varphi(n)φ(n) 都是偶数,也即 φ(n)≡0(mod2)\varphi(n) \equiv 0 \pmod{2}φ(n)0(mod2)
    简单证明:若 n 是质数 p 的 k 次幂(即 n=pkn=p^kn=pk),则 φ(n)=pk−pk−1=(p−1)pk−1\varphi(n)=p^k - p^{k-1}=(p-1)p^{k-1}φ(n)=pkpk1=(p1)pk1
    • 当 p=2 时,pk−1p^{k-1}pk1 必为偶数(k≥2 时,2k−12^{k-1}2k1 是偶数);
    • 当 p>2 时,(p-1) 必为偶数(奇素数减 1 为偶数)。
      因此无论 p 是 2 还是大于 2 的素数,φ(n)\varphi(n)φ(n) 均为偶数。

四、欧拉函数的计算方法

(一)素数分解法

  1. 对于一个正整数 N 的素数幂分解 N=P1q1P2q2…PnqnN=P_1^{q_1}P_2^{q_2}\dots P_n^{q_n}N=P1q1P2q2Pnqn(其中 PiP_iPi 为素数,1≤i≤n1 \leq i \leq n1in),根据欧拉函数的积性性质可得:
    φ(N)=φ(P1q1)φ(P2q2)…φ(Pnqn)\varphi(N)=\varphi(P_1^{q_1})\varphi(P_2^{q_2})\dots\varphi(P_n^{q_n})φ(N)=φ(P1q1)φ(P2q2)φ(Pnqn)
    注意:每种质因数只保留一个(即素数幂分解中每个素数的最高次幂)。

  2. 若 n 是质数 p 的 k 次幂(n=pkn=p^kn=pk),则 φ(n)=pk−pk−1=(p−1)pk−1\varphi(n)=p^k - p^{k-1}=(p-1)p^{k-1}φ(n)=pkpk1=(p1)pk1
    原理:除了 p 的倍数外,其他数都与 n 互质。

    简单证明:
    由 φ(n) 的定义,φ(pk)\varphi(p^k)φ(pk) 等于从 pkp^kpk 中减去 1 到 pkp^kpk 中与 p 不互素的数的个数。
    因为 p 是素数,1 到 pkp^kpk 中与 p 不互素的数就是 p 的倍数,共有 pk−1p^{k-1}pk1 个(即 p,2p,…,pk−1pp,2p,\dots,p^{k-1}pp,2p,,pk1p)。
    因此 φ(pk)=pk−pk−1=(p−1)pk−1\varphi(p^k)=p^k - p^{k-1}=(p-1)p^{k-1}φ(pk)=pkpk1=(p1)pk1,证完。

(二)编程思维

利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。

核心公式:欧拉函数与质因数的关系为
φ(N)=N×∏p∣N(1−1p)\varphi(N)=N \times \prod_{p|N} \left(1-\frac{1}{p}\right)φ(N)=N×pN(1p1)
其中 p∣Np|NpN 表示 p 是 N 的质因数(即 p 能整除 N)。

示例:

  • φ(10)=10×(1−12)×(1−15)=4\varphi(10)=10 \times \left(1-\frac{1}{2}\right) \times \left(1-\frac{1}{5}\right)=4φ(10)=10×(121)×(151)=4(10 的质因数为 2,5);
  • φ(30)=30×(1−12)×(1−13)×(1−15)=8\varphi(30)=30 \times \left(1-\frac{1}{2}\right) \times \left(1-\frac{1}{3}\right) \times \left(1-\frac{1}{5}\right)=8φ(30)=30×(121)×(131)×(151)=8(30 的质因数为 2,3,5);
  • φ(49)=49×(1−17)=42\varphi(49)=49 \times \left(1-\frac{1}{7}\right)=42φ(49)=49×(171)=42(49 的质因数为 7)。
1. 求 n 以内的所有素数
#l[]
def prime(n):#global l=[]  # 全局变量(错误写法,声明与赋值不能同时进行)global ll = []for x in range(n):# 判断如果 x 是素数,则加入列表,否则跳过if x < 2:continuefor i in range(2, x):if x % i == 0:breakelse:l.append(x)print(l)prime(100)

输出结果:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
2. 求 φ(n)
def phi(n):ans = nfor i in l:if n % i == 0:ans = ans * (1 - 1/i)  # 等价于核心公式,将 n 代入计算return int(ans)phi(100)# 可通过循环输出 1-9 的欧拉函数值
# for i in range(1, 10):
#     print(phi(i))

输出结果:

40
3. 格式化输出 0-100 欧拉函数表(“x?”代表十位数,“x”代表个位数)
步骤一:输出表头和表格横向数值
print("{:>40}".format("0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)"))
print()
print("{:>6}".format("φ(n)"), end='')
for x in range(0, 10):print("{:>6}".format(x), end='')

输出结果:

          0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)φ(n)     0     1     2     3     4     5     6     7     8     9
步骤二:输出表格横向和纵向数值
print("{:>40}".format("0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)"))
print()
print("{:>6}".format("φ(n)"), end='')
for x in range(0, 10):print("{:>6}".format(x), end='')for x in range(0, 10):print("\n")print("{:>6}".format(str(x) + "?"), end='')

输出结果:

          0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)φ(n)     0     1     2     3     4     5     6     7     8     90?1?2?3?4?5?6?7?8?9?
步骤三:输出最终效果
import termcolor
# title=termcolor.colored("0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)",'white','on_red',['bold'])
title = termcolor.colored("0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)", color=None, on_color=None, attrs=['bold'])  # 加粗
print("{0:^70}".format(title))
print()
print("{:>7}".format("φ(n)"), end='')
for x in range(0, 10):print("{:>7}".format(x), end='')for x in range(0, 10):a = x * 10print("\n")print("{:>8}".format(str(x) + "?"), end='')for y in range(0 + a, 10 + a):print("{0:>7}".format(phi(y)), end='')print()
print()
# print("φ(100)=", phi(100))
print("{:>40}{:}".format("φ(100)=", phi(100)))

输出结果:

                0~100 欧拉函数表(“x?”代表十位数,“x”代表个位数)φ(n)      0      1      2      3      4      5      6      7      8      90?      0      1      1      2      2      4      2      6      4      61?      4     10      4     12      6      8      8     16      6     182?      8     12     10     22      8     20     12     18     12     283?      8     30     16     20     16     24     12     36     18     244?     16     40     12     42     20     24     22     46     16     425?     20     32     24     52     18     40     24     36     28     586?     16     60     30     36     32     48     20     66     32     447?     24     70     24     72     36     40     36     60     24     788?     32     54     40     82     24     64     42     56     40     889?     24     72     44     60     46     72     32     96     42     60φ(100)=40

五、欧拉函数相关定理以及证明

定理 1:缩系与欧拉函数的关系

模数 m 的一组缩系含有 φ(m) 个数。

(根据缩系定义:缩系是从与 m 互素的剩余类中各取一个数组成的集合,而与 m 互素的剩余类个数恰好为 φ(m),故定理成立。)

定理 2:缩系的充要条件

a1,a2,…,aφ(m)a_1,a_2,\dots,a_{\varphi(m)}a1a2aφ(m) 是 φ(m) 个与 m 互素的整数,则 a1,a2,…,aφ(m)a_1,a_2,\dots,a_{\varphi(m)}a1a2aφ(m) 是模数 m 的一组缩系的充要条件是它们两两对模数 m 不同余。

定理 1 和定理 2,根据缩系和欧拉函数的定义显然成立。

定理 3:缩系拓展

(a,m)=1(a,m)=1(a,m)=1,x 通过模数 m 的缩系,则 ax 也通过模数 m 的缩系。

证明:

  1. 当 x 通过模数 m 的缩系时,ax 共生成 φ(m) 个整数。
  2. 由于 (a,m)=1(a,m)=1(a,m)=1(x,m)=1(x,m)=1(x,m)=1,根据互素性质可知 (ax,m)=1(ax,m)=1(ax,m)=1(即 ax 与 m 互素)。
  3. 假设 ax1≡ax2(modm)ax_1 \equiv ax_2 \pmod{m}ax1ax2(modm),两边同时乘以 a 的逆元(因 (a,m)=1,a 的逆元存在),可得 x1≡x2(modm)x_1 \equiv x_2 \pmod{m}x1x2(modm)。但 x 是通过缩系的元素,两两不同余,故假设不成立,即 ax 两两不同余。

综上,axaxax 通过模数 mmm 的缩系,证完。

特别说明:
根据定理“整数 a,b 对模数 m 同余的充分必要条件是 m|(a-b)”,可得:
ax1≡ax2(modm)ax_1 \equiv ax_2 \pmod{m}ax1ax2(modm) 的充分必要条件是 m∣a(x1−x2)m|a(x_1 - x_2)ma(x1x2)
又因 (a,m)=1(a,m)=1(a,m)=1,故 m 必整除 (x1−x2)(x_1 - x_2)(x1x2),即 x1≡x2(modm)x_1 \equiv x_2 \pmod{m}x1x2(modm),进一步验证结论成立。

1. 简单证明:(a,m)=1(a,m)=1(a,m)=1(x,m)=1(x,m)=1(x,m)=1,故 (ax,m)=1(ax,m)=1(ax,m)=1

① 当 m=0 时,a=±1(因 (a,0)=1 等价于 a=±1),结论成立;
② 当 a=0 时,m=±1(因 (0,m)=1 等价于 m=±1),结论成立;
③ 当 am≠0 时,由最大公约数性质:(a,m)=(a(x,m),m)=((ax,am),m)=(ax,m(a,1))=(ax,m)(a,m)=(a(x,m),m)=((ax,am),m)=(ax,m(a,1))=(ax,m)(a,m)=(a(x,m),m)=((ax,am),m)=(ax,m(a,1))=(ax,m)
(a,m)=1(a,m)=1(a,m)=1(x,m)=1(x,m)=1(x,m)=1,故 (ax,m)=1(ax,m)=1(ax,m)=1,结论成立。

证完。

定理 4:欧拉定理

m>1m > 1m>1(a,m)=1(a, m) = 1(a,m)=1,则 aφ(m)≡1(modm)a^{\varphi(m)} \equiv 1 \pmod{m}aφ(m)1(modm)

证明:

  1. r1,r2,…,rφ(m)r_1, r_2, \dots, r_{\varphi(m)}r1,r2,,rφ(m) 是模数 mmm 的一组缩系,由定理 3 可知,ar1,ar2,…,arφ(m)ar_1, ar_2, \dots, ar_{\varphi(m)}ar1,ar2,,arφ(m) 也是模数 mmm 的一组缩系。
  2. 两组缩系中元素对模 mmm 同余(仅顺序不同),故它们的乘积对模 mmm 同余:
    (ar1)(ar2)…(arφ(m))≡r1r2…rφ(m)(modm)(ar_1)(ar_2)\dots(ar_{\varphi(m)}) \equiv r_1 r_2 \dots r_{\varphi(m)} \pmod{m} (ar1)(ar2)(arφ(m))r1r2rφ(m)(modm)
  3. 左边整理得 aφ(m)×(r1r2…rφ(m))a^{\varphi(m)} \times (r_1 r_2 \dots r_{\varphi(m)})aφ(m)×(r1r2rφ(m)),因此:
    aφ(m)×(r1r2…rφ(m))≡r1r2…rφ(m)(modm)①a^{\varphi(m)} \times (r_1 r_2 \dots r_{\varphi(m)}) \equiv r_1 r_2 \dots r_{\varphi(m)} \pmod{m} \quad ① aφ(m)×(r1r2rφ(m))r1r2rφ(m)(modm)
  4. 由于每个 rir_irimmm 互素(缩系定义),故 r1r2…rφ(m)r_1 r_2 \dots r_{\varphi(m)}r1r2rφ(m)mmm 互素(即 (r1r2…rφ(m),m)=1(r_1 r_2 \dots r_{\varphi(m)}, m) = 1(r1r2rφ(m),m)=1) ②。
  5. 根据定理“若 ac≡bc(modm)ac \equiv bc \pmod{m}acbc(modm),且 (m,c)=d(m, c) = d(m,c)=d,则 a≡b(modm/d)a \equiv b \pmod{m/d}ab(modm/d)”,结合 ② 中 d=1d = 1d=1,由 ① 可得:
    aφ(m)≡1(modm)a^{\varphi(m)} \equiv 1 \pmod{m} aφ(m)1(modm)

证完。

1. 辅助定理:若 ac≡bc(modm)ac \equiv bc \pmod{m}acbc(modm),且 (m,c)=d(m,c)=d(m,c)=d,则 a≡b(modm/d)a \equiv b \pmod{m/d}ab(modm/d)

简单证明:
ac≡bc(modm)ac \equiv bc \pmod{m}acbc(modm)m∣c(a−b)m|c(a - b)mc(ab),即 md∣cd(a−b)\frac{m}{d}|\frac{c}{d}(a - b)dmdc(ab)
(m/d,c/d)=1(m/d, c/d)=1(m/d,c/d)=1(d 是 m 和 c 的最大公约数),故 md∣(a−b)\frac{m}{d}|(a - b)dm(ab),即 a≡b(modm/d)a \equiv b \pmod{m/d}ab(modm/d)

证完。

定理 5:费马小定理

若 p 是素数,则对于每个整数 a,有 ap≡a(modp)a^p \equiv a \pmod{p}apa(modp)

由定理 4(欧拉定理)立刻推得定理 5,它通常叫做费马小定理。

简单证明:
分两种情况讨论:
① 若 a 不是 p 的倍数:因 p 是素数,故 (a,p)=1(a,p)=1(a,p)=1。由欧拉定理,φ(p)=p−1\varphi(p)=p-1φ(p)=p1,故 ap−1≡1(modp)a^{p-1} \equiv 1 \pmod{p}ap11(modp)。两边乘以 a 得 ap≡a(modp)a^p \equiv a \pmod{p}apa(modp)
② 若 a 是 p 的倍数:则 a≡0(modp)a \equiv 0 \pmod{p}a0(modp),故 ap≡0(modp)a^p \equiv 0 \pmod{p}ap0(modp),即 ap≡a(modp)a^p \equiv a \pmod{p}apa(modp)

综上,定理成立,证完。

定理 6:缩系组合性质

m1>0m_1>0m10m2>0m_2>0m20(m1,m2)=1(m_1,m_2)=1(m1,m2)=1x1,x2x_1,x_2x1,x2 分别通过模数 m1,m2m_1,m_2m1,m2 的缩系,则 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2 通过模数 m1m2m_1m_2m1m2 的缩系。

证明:

第一步:证明 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2m1m2m_1m_2m1m2 互素

假设 (m2x1+m1x2,m1m2)>1(m_2x_1 + m_1x_2, m_1m_2)>1(m2x1+m1x2,m1m2)1,则存在素数 p 整除 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2m1m2m_1m_2m1m2

  • 若 p|m_1,则 p|m_2x_1(因 m2x1+m1x2≡0(modp)m_2x_1 + m_1x_2 \equiv 0 \pmod{p}m2x1+m1x20(modp))。又 p 是素数且 (m1,m2)=1(m_1,m_2)=1(m1,m2)=1,故 p∤m_2,因此 p|x_1。但 x1x_1x1m1m_1m1 缩系元素((x1,m1)=1(x_1,m_1)=1(x1,m1)=1),故 p∤x_1,矛盾。
  • 若 p|m_2,同理可推出 p|x_2,与 (x2,m2)=1(x_2,m_2)=1(x2,m2)=1 矛盾。

因此假设不成立,即 (m2x1+m1x2,m1m2)=1(m_2x_1 + m_1x_2, m_1m_2)=1(m2x1+m1x2,m1m2)=1

第二步:证明所有 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2 对模 m1m2m_1m_2m1m2 两两不同余

假设 m2x1′+m1x2′≡m2x1′′+m1x2′′(modm1m2)m_2x_1' + m_1x_2' \equiv m_2x_1'' + m_1x_2'' \pmod{m_1m_2}m2x1+m1x2m2x1′′+m1x2′′(modm1m2),则 m2(x1′−x1′′)≡m1(x2′′−x2′)(modm1)m_2(x_1' - x_1'') \equiv m_1(x_2'' - x_2') \pmod{m_1}m2(x1x1′′)m1(x2′′x2)(modm1)

左边 m2(x1′−x1′′)≡0(modm1)m_2(x_1' - x_1'') \equiv 0 \pmod{m_1}m2(x1x1′′)0(modm1)(因 (m1,m2)=1(m_1,m_2)=1(m1,m2)=1),故 m1∣m2(x1′−x1′′)m_1|m_2(x_1' - x_1'')m1m2(x1x1′′),即 m1∣(x1′−x1′′)m_1|(x_1' - x_1'')m1(x1x1′′),故 x1′≡x1′′(modm1)x_1' \equiv x_1'' \pmod{m_1}x1x1′′(modm1)

x1′、x1′′x_1'、x_1''x1x1′′m1m_1m1 缩系元素(两两不同余),故 x1′=x1′′x_1' = x_1''x1=x1′′。同理可得 x2′=x2′′x_2' = x_2''x2=x2′′,因此 m2x1′+m1x2′=m2x1′′+m1x2′′m_2x_1' + m_1x_2' = m_2x_1'' + m_1x_2''m2x1+m1x2=m2x1′′+m1x2′′

第三步:证明所有与 m1m2m_1m_2m1m2 互素的数均可表示为 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2 的形式

由完全剩余系定理“设 m1>0m_1>0m10m2>0m_2>0m20(m1,m2)=1(m_1,m_2)=1(m1,m2)=1x1,x2x_1,x_2x1,x2 分别通过 m1,m2m_1,m_2m1,m2 的完全剩余系,则 m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2 通过 m1m2m_1m_2m1m2 的完全剩余系”,可知任意与 m1m2m_1m_2m1m2 互素的数 a 可表示为 a≡m2x1+m1x2(modm1m2)a \equiv m_2x_1 + m_1x_2 \pmod{m_1m_2}am2x1+m1x2(modm1m2)

(x1,m1)>1(x_1,m_1)>1(x1,m1)1,则存在素数 q 整除 x1x_1x1m1m_1m1,进而 q 整除 a,与 (a,m1m2)=1(a,m_1m_2)=1(a,m1m2)=1 矛盾,故 (x1,m1)=1(x_1,m_1)=1(x1,m1)=1。同理 (x2,m2)=1(x_2,m_2)=1(x2,m2)=1

综上,m2x1+m1x2m_2x_1 + m_1x_2m2x1+m1x2 通过模数 m1m2m_1m_2m1m2 的缩系,证完。

由定理 6,立得推论:
推论:若 (m1,m2)=1(m_1,m_2)=1(m1,m2)=1,则 φ(m1m2)=φ(m1)φ(m2)\varphi(m_1m_2)=\varphi(m_1)\varphi(m_2)φ(m1m2)=φ(m1)φ(m2)

定理 7:欧拉函数的一般计算方法

对于一个正整数 n 的素数幂分解 n=P1q1P2q2…Pkqkn=P_1^{q_1}P_2^{q_2}\dots P_k^{q_k}n=P1q1P2q2Pkqk(其中 PiP_iPi 为素数,1≤i≤k1 \leq i \leq k1ik),则
φ(n)=n×(1−1P1)×(1−1P2)×⋯×(1−1Pk)\varphi(n)=n \times \left(1-\frac{1}{P_1}\right) \times \left(1-\frac{1}{P_2}\right) \times \dots \times \left(1-\frac{1}{P_k}\right)φ(n)=n×(1P11)×(1P21)××(1Pk1)

证明过程参考 四、(一)素数分解法 以及 定理 6 的推论(积性函数性质)。

(补充证明:由定理 6 推论,欧拉函数是积性函数,故 φ(n)=∏i=1kφ(Piqi)\varphi(n)=\prod_{i=1}^k \varphi(P_i^{q_i})φ(n)=i=1kφ(Piqi)。结合素数幂的欧拉函数公式 φ(Piqi)=Piqi−Piqi−1=Piqi×(1−1Pi)\varphi(P_i^{q_i})=P_i^{q_i} - P_i^{q_i-1}=P_i^{q_i} \times \left(1-\frac{1}{P_i}\right)φ(Piqi)=PiqiPiqi1=Piqi×(1Pi1),代入得 φ(n)=∏i=1kPiqi×(1−1Pi)=n×∏i=1k(1−1Pi)\varphi(n)=\prod_{i=1}^k P_i^{q_i} \times \left(1-\frac{1}{P_i}\right)=n \times \prod_{i=1}^k \left(1-\frac{1}{P_i}\right)φ(n)=i=1kPiqi×(1Pi1)=n×i=1k(1Pi1),证完。)

六、欧拉函数的应用

(一)应用一:证明相关题目

题目:设 n≥1n≥1n1,则有 ∑d∣n,d>0φ(d)=n\sum_{d|n, d>0} \varphi(d) = ndn,d0φ(d)=n(即 n 的所有正约数的欧拉函数值之和等于 n)。

证明:

  1. 对 n 进行素数幂分解:n=P1q1P2q2…Pkqkn=P_1^{q_1}P_2^{q_2}\dots P_k^{q_k}n=P1q1P2q2PkqkPiP_iPi 为素数,qi≥1q_i≥1qi1)。
  2. n 的所有正约数 d 可表示为 d=P1x1P2x2…Pkxkd=P_1^{x_1}P_2^{x_2}\dots P_k^{x_k}d=P1x1P2x2Pkxk(其中 0≤xi≤qi0 \leq x_i \leq q_i0xiqi1≤i≤k1 \leq i \leq k1ik)。
  3. 由欧拉函数的积性(定理 6 推论),φ(d)=φ(P1x1)φ(P2x2)…φ(Pkxk)\varphi(d)=\varphi(P_1^{x_1})\varphi(P_2^{x_2})\dots\varphi(P_k^{x_k})φ(d)=φ(P1x1)φ(P2x2)φ(Pkxk),因此:
    ∑d∣nφ(d)=∑x1=0q1∑x2=0q2⋯∑xk=0qk[φ(P1x1)φ(P2x2)…φ(Pkxk)]\sum_{d|n} \varphi(d) = \sum_{x_1=0}^{q_1} \sum_{x_2=0}^{q_2} \dots \sum_{x_k=0}^{q_k} \left[ \varphi(P_1^{x_1})\varphi(P_2^{x_2})\dots\varphi(P_k^{x_k}) \right]dnφ(d)=x1=0q1x2=0q2xk=0qk[φ(P1x1)φ(P2x2)φ(Pkxk)]
  4. 上述多重和可拆分为单重和的乘积(乘法分配律):
    ∑d∣nφ(d)=[∑x1=0q1φ(P1x1)]×[∑x2=0q2φ(P2x2)]×⋯×[∑xk=0qkφ(Pkxk)]\sum_{d|n} \varphi(d) = \left[ \sum_{x_1=0}^{q_1} \varphi(P_1^{x_1}) \right] \times \left[ \sum_{x_2=0}^{q_2} \varphi(P_2^{x_2}) \right] \times \dots \times \left[ \sum_{x_k=0}^{q_k} \varphi(P_k^{x_k}) \right]dnφ(d)=[x1=0q1φ(P1x1)]×[x2=0q2φ(P2x2)]××[xk=0qkφ(Pkxk)]
  5. 计算单个素数幂的欧拉函数和:
    • xi=0x_i=0xi=0 时,Pi0=1P_i^0=1Pi0=1φ(1)=1\varphi(1)=1φ(1)=1
    • xi≥1x_i≥1xi1 时,φ(Pixi)=Pixi−Pixi−1\varphi(P_i^{x_i})=P_i^{x_i} - P_i^{x_i-1}φ(Pixi)=PixiPixi1(素数幂欧拉函数公式)。
      因此:
      ∑xi=0qiφ(Pixi)=1+(Pi−1)+(Pi2−Pi)+⋯+(Piqi−Piqi−1)\sum_{x_i=0}^{q_i} \varphi(P_i^{x_i}) = 1 + (P_i - 1) + (P_i^2 - P_i) + \dots + (P_i^{q_i} - P_i^{q_i-1})xi=0qiφ(Pixi)=1+(Pi1)+(Pi2Pi)++(PiqiPiqi1)
      展开后中间项抵消,得 ∑xi=0qiφ(Pixi)=Piqi\sum_{x_i=0}^{q_i} \varphi(P_i^{x_i}) = P_i^{q_i}xi=0qiφ(Pixi)=Piqi
  6. 代入步骤 4 的乘积式,得:
    ∑d∣nφ(d)=P1q1×P2q2×⋯×Pkqk=n\sum_{d|n} \varphi(d) = P_1^{q_1} \times P_2^{q_2} \times \dots \times P_k^{q_k} = ndnφ(d)=P1q1×P2q2××Pkqk=n

证完。

(二)应用二:求原根个数以及全部原根

1. 原根个数

若模 m 有原根,则原根共有 φ(φ(m))\varphi(\varphi(m))φ(φ(m)) 个。

(原理:原根的定义是“使得 gφ(m)≡1(modm)g^{\varphi(m)} \equiv 1 \pmod{m}gφ(m)1(modm) 且最小正整数 k=φ(m) 的 g”,所有原根可表示为 gkg^kgk(其中 (k,φ(m))=1(k,φ(m))=1(k,φ(m))=1),这样的 k 共有 φ(φ(m)) 个,故原根个数为 φ(φ(m))。)

2. 全部原根

特别地,若 m=p 为素数,则模 p 共有 φ(p−1)\varphi(p-1)φ(p1) 个原根,并且若 g 为模 p 的一个原根,则模 p 的全部原根为 {gk∣1≤k≤p−1,(k,p−1)=1}\{g^k \mid 1 \leq k \leq p-1, (k, p-1)=1\}{gk1kp1,(k,p1)=1}

(因 p 是素数,φ§=p-1,故原根个数为 φ(φ§)=φ(p-1),且原根形式由原根定义推导可得。)

(三)应用三:RSA 算法

RSA 算法是一种非对称加密算法,其安全性基于“大整数分解困难”的数学问题,核心依赖欧拉函数的性质(尤其是 φ(pq)=(p−1)(q−1)\varphi(pq)=(p-1)(q-1)φ(pq)=(p1)(q1),其中 p,q 为素数)。

RSA 算法的具体描述如下:

  1. 密钥生成
    • 任意选取两个不同的大素数 p 和 q,计算乘积 n=pqn=pqn=pq,以及欧拉函数 φ(n)=(p−1)(q−1)\varphi(n)=(p-1)(q-1)φ(n)=(p1)(q1)
    • 选取一个大整数 e(加密密钥),满足 gcd⁡(e,φ(n))=1\gcd(e, \varphi(n))=1gcd(e,φ(n))=1(e 需与 φ(n) 互素,例如选取大于 p 和 q 的素数);
    • 计算解密密钥 d,满足 de≡1(modφ(n))de \equiv 1 \pmod{\varphi(n)}de1(modφ(n))(即 de=kφ(n)+1de = k\varphi(n) + 1de=kφ(n)+1,k≥1 为整数)。
  2. 密钥发布:公开整数 n 和 e(公钥),秘密保存 d(私钥)。
  3. 加密过程:将明文 m(m<n,且 m 为整数)加密为密文 c,加密算法为:
    c=E(m)=me(modn)c = E(m) = m^e \pmod{n}c=E(m)=me(modn)
  4. 解密过程:将密文 c 解密为明文 m,解密算法为:
    m=D(c)=cd(modn)m = D(c) = c^d \pmod{n}m=D(c)=cd(modn)

安全性说明:仅通过公钥 n 和 e 无法直接计算私钥 d,因为计算 d 需要 φ(n),而 φ(n) 的计算依赖 p 和 q 的分解——对于大整数 n(如 1024 位以上),目前尚无高效算法可分解其素因数,因此 RSA 算法具有较高安全性。

七、测试

(一)termcolor 库的使用

termcolor 是 Python 中用于终端输出彩色文本的库,支持文本颜色、背景色和文本属性(如加粗、闪烁)的设置。

1. 查看库的属性和方法
import termcolor
dir(termcolor)

输出结果:

['ATTRIBUTES','COLORS','HIGHLIGHTS','RESET','VERSION','__ALL__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__spec__','colored','cprint','os','print_function']
2. 查看库的帮助文档
help(termcolor)

输出结果(核心部分):

Help on module termcolor:NAMEtermcolor - ANSII Color formatting for output in terminal.FUNCTIONScolored(text, color=None, on_color=None, attrs=None)Colorize text.Available text colors:red, green, yellow, blue, magenta, cyan, white.Available text highlights:on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white.Available attributes:bold, dark, underline, blink, reverse, concealed.Example:colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink'])colored('Hello, World!', 'green')cprint(text, color=None, on_color=None, attrs=None, **kwargs)Print colorize text.It accepts arguments of print function.DATAATTRIBUTES = {'blink': 5, 'bold': 1, 'concealed': 8, 'dark': 2, 'reverse': 7, 'underline': 4}COLORS = {'blue': 34, 'cyan': 36, 'green': 32, 'grey': 30, 'magenta': 35, 'red': 31, 'white': 37, 'yellow': 33}HIGHLIGHTS = {'on_blue': 44, 'on_cyan': 46, 'on_green': 42, 'on_grey': 40, 'on_magenta': 45, 'on_red': 41, 'on_white': 47, 'on_yellow': 43}RESET = '\x1b[0m'VERSION = (1, 1, 0)__ALL__ = ['colored', 'cprint']print_function = _Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 65536)
3. 彩色文本输出示例
# 红色文本
print(termcolor.colored("error", "red"))

输出结果(终端中显示红色“error”):

[31merror[0m
# 错误示例:attrs 中不能包含颜色值(如 'red'),只能包含属性(如 'bold')
print(termcolor.colored("error", "red", 'on_red', ['red', 'bold']))

输出结果(报错,因 ‘red’ 不是合法的属性):

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-125-7c06270d31d5> in <module>
----> 1 print(termcolor.colored("error","red",'on_red',['red', 'bold']))c:\users\tianjie\test1\lib\site-packages\termcolor.py in colored(text, color, on_color, attrs)110         if attrs is not None:111             for attr in attrs:
--> 112                 text = fmt_str % (ATTRIBUTES[attr], text)113114         text += RESETKeyError: 'red'
# 正确示例:白色文本、红色背景、反向显示、加粗;绿色文本、红色背景
from termcolor import colored, cprinttext = colored('Hello, World!', 'white', 'on_red', attrs=['reverse', 'bold'])
print(text)
cprint('Hello, World!', 'green', 'on_red')

输出结果(终端中显示对应格式的文本):

[1m[7m[41m[37mHello, World![0m
[41m[32mHello, World![0m

(二)全局变量和局部变量

在 Python 中,全局变量是定义在函数外部的变量,局部变量是定义在函数内部的变量。若需在函数内部修改全局变量,需用 global 关键字声明(注意:声明和赋值不能同时进行)。

1. 示例 1:修改全局变量
a = 2
# print(a)
def sum(b):# print(a)  # 若未声明 global,直接访问全局变量 a 会报错(Python 3 中)# global a=3  # 错误:声明和赋值不能同时进行global a  # 声明 a 为全局变量a = 3  # 修改全局变量 a 的值print(a)print(a)  # 调用函数前,全局变量 a 的值为 2
sum(5)    # 调用函数,修改 a 为 3 并打印
sum(6)    # 再次调用函数,a 仍为 3 并打印

输出结果:

2
3
3
2. 示例 2:跟踪全局变量的变化
a = 2
print(a)  # 初始值:2
def sum(b):# print(a)  # 未声明 global 时,函数内无法直接修改全局变量global a  # 声明 a 为全局变量a = 3  # 修改为 3print(a)  # 函数内打印:3print(a)  # 调用函数前,a 仍为 2
sum(5)    # 调用函数,a 变为 3 并打印
print(a)  # 调用函数后,全局变量 a 已变为 3sum(6)    # 再次调用函数,a 保持 3 并打印

输出结果:

2
2
3
3
3

欧拉函数及其性质

shcoc于 2018-08-23 21:50:23 发布

一、定义

在数论中,对正整数 nnn,欧拉函数是小于或等于 nnn 的正整数中与 nnn 互质的数的数目(特别规定 φ(1)=1\varphi(1)=1φ(1)=1)。此函数以首名研究者欧拉命名(Euler’s totient function),又称为 Euler’s totient function、φ\varphiφ 函数、欧拉商数等。

二、函数式

对于正整数 xxx,若其质因数分解为 x=p1k1p2k2…pnknx = p_1^{k_1}p_2^{k_2}\dots p_n^{k_n}x=p1k1p2k2pnkn(其中 p1,p2,…,pnp_1,p_2,\dots,p_np1,p2,,pnxxx 的不同质因数),则欧拉函数的表达式为:
φ(x)=x×∏i=1n(1−1pi)\varphi(x) = x \times \prod_{i=1}^n \left(1 - \frac{1}{p_i}\right)φ(x)=x×i=1n(1pi1)

其中:

  • pip_ipixxx 的质因数(x>0x > 0x>0)。
  • φ(x)\varphi(x)φ(x) 表示从 1 到 xxx 中与 xxx 互质的数的个数。

三、性质

性质 1:质数的欧拉函数

对于任意一个质数 ppp,有 φ(p)=p−1\varphi(p) = p - 1φ(p)=p1

原理:质数 ppp 的正约数只有 1 和 ppp,因此 1 到 ppp 中与 ppp 互质的数为 1 到 p−1p-1p1,共 p−1p-1p1 个。

性质 2:积性函数特性

gcd⁡(n,m)=1\gcd(n,m) = 1gcd(n,m)=1(即 nnnmmm 互质)时,有 φ(nm)=φ(n)×φ(m)\varphi(nm) = \varphi(n) \times \varphi(m)φ(nm)=φ(n)×φ(m)

原理:欧拉函数是积性函数——积性函数指对于所有互质的整数 aaabbb,均满足 f(ab)=f(a)f(b)f(ab) = f(a)f(b)f(ab)=f(a)f(b) 的数论函数。

性质 3:素数幂的欧拉函数

n=pkn = p^kn=pk(其中 ppp 为质数,kkk 为正整数),则 φ(n)=pk−pk−1=(p−1)pk−1\varphi(n) = p^k - p^{k-1} = (p - 1)p^{k-1}φ(n)=pkpk1=(p1)pk1

原理:1 到 pkp^kpk 中,与 pkp^kpk 不互质的数是 ppp 的倍数(即 p,2p,3p,…,pk−1×pp,2p,3p,\dots,p^{k-1} \times pp,2p,3p,,pk1×p),共 pk−1p^{k-1}pk1 个。因此与 pkp^kpk 互质的数的个数为总个数 pkp^kpk 减去不互质的个数 pk−1p^{k-1}pk1,即 pk−pk−1p^k - p^{k-1}pkpk1

性质 4:任意正整数的欧拉函数(质因数分解形式)

nnn 的质因数分解为 n=p1k1p2k2…pmkmn = p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}n=p1k1p2k2pmkm(其中 p1,p2,…,pmp_1,p_2,\dots,p_mp1,p2,,pm 为不同质数,k1,k2,…,kmk_1,k_2,\dots,k_mk1,k2,,km 为各质因数的指数),则:
φ(n)=n×∏i=1m(1−1pi)\varphi(n) = n \times \prod_{i=1}^m \left(1 - \frac{1}{p_i}\right)φ(n)=n×i=1m(1pi1)

推导:结合性质 2(积性函数)和性质 3(素数幂的欧拉函数):

  1. p1k1,p2k2,…,pmkmp_1^{k_1},p_2^{k_2},\dots,p_m^{k_m}p1k1,p2k2,,pmkm 两两互质,故 φ(n)=∏i=1mφ(piki)\varphi(n) = \prod_{i=1}^m \varphi(p_i^{k_i})φ(n)=i=1mφ(piki)
  2. 由性质 3,φ(piki)=piki−piki−1=piki×(1−1pi)\varphi(p_i^{k_i}) = p_i^{k_i} - p_i^{k_i-1} = p_i^{k_i} \times \left(1 - \frac{1}{p_i}\right)φ(piki)=pikipiki1=piki×(1pi1)
  3. 代入得 φ(n)=∏i=1m[piki×(1−1pi)]=(∏i=1mpiki)×∏i=1m(1−1pi)=n×∏i=1m(1−1pi)\varphi(n) = \prod_{i=1}^m \left[ p_i^{k_i} \times \left(1 - \frac{1}{p_i}\right) \right] = \left( \prod_{i=1}^m p_i^{k_i} \right) \times \prod_{i=1}^m \left(1 - \frac{1}{p_i}\right) = n \times \prod_{i=1}^m \left(1 - \frac{1}{p_i}\right)φ(n)=i=1m[piki×(1pi1)]=(i=1mpiki)×i=1m(1pi1)=n×i=1m(1pi1)

性质 5:与 nnn 互质数的和

所有小于 nnn 且与 nnn 互质的数的和为 sum=n×φ(n)2\text{sum} = n \times \frac{\varphi(n)}{2}sum=n×2φ(n)

证明

  1. 先证:若 gcd⁡(n,i)=1\gcd(n,i) = 1gcd(n,i)=1,则 gcd⁡(n,n−i)=1\gcd(n,n-i) = 1gcd(n,ni)=1(反证法):
    假设 gcd⁡(n,i)=1\gcd(n,i) = 1gcd(n,i)=1gcd⁡(n,n−i)=k>1\gcd(n,n-i) = k > 1gcd(n,ni)=k>1,则 k∣nk \mid nknk∣(n−i)k \mid (n-i)k(ni)。由 k∣nk \mid nknk∣(n−i)k \mid (n-i)k(ni) 可得 k∣ik \mid iki,因此 gcd⁡(n,i)≥k>1\gcd(n,i) \geq k > 1gcd(n,i)k>1,与假设矛盾。故 gcd⁡(n,i)=1⟹gcd⁡(n,n−i)=1\gcd(n,i) = 1 \implies \gcd(n,n-i) = 1gcd(n,i)=1gcd(n,ni)=1

  2. 由上述结论,与 nnn 互质的数必成对出现iiin−in-ini),且每对的和为 i+(n−i)=ni + (n-i) = ni+(ni)=n

  3. nnn 互质的数共有 φ(n)\varphi(n)φ(n) 个,因此共有 φ(n)2\frac{\varphi(n)}{2}2φ(n) 对,总和为 n×φ(n)2n \times \frac{\varphi(n)}{2}n×2φ(n)

性质 6:欧拉函数与质数的乘积

ppp 为质数,对任意正整数 iii

  • imodp=0i \mod p = 0imodp=0(即 pppiii 的质因数),则 φ(i×p)=p×φ(i)\varphi(i \times p) = p \times \varphi(i)φ(i×p)=p×φ(i)
  • imodp≠0i \mod p \neq 0imodp=0(即 ppp 不是 iii 的质因数,gcd⁡(i,p)=1\gcd(i,p)=1gcd(i,p)=1),则 φ(i×p)=(p−1)×φ(i)\varphi(i \times p) = (p - 1) \times \varphi(i)φ(i×p)=(p1)×φ(i)

证明

  1. imodp=0i \mod p = 0imodp=0 时:
    i=pk×ti = p^k \times ti=pk×t(其中 gcd⁡(t,p)=1\gcd(t,p)=1gcd(t,p)=1),则 i×p=pk+1×ti \times p = p^{k+1} \times ti×p=pk+1×t。由性质 4,φ(i)=i×(1−1p)×∏q∣t(1−1q)\varphi(i) = i \times \left(1 - \frac{1}{p}\right) \times \prod_{q \mid t} \left(1 - \frac{1}{q}\right)φ(i)=i×(1p1)×qt(1q1)φ(i×p)=(i×p)×(1−1p)×∏q∣t(1−1q)=p×[i×(1−1p)×∏q∣t(1−1q)]=p×φ(i)\varphi(i \times p) = (i \times p) \times \left(1 - \frac{1}{p}\right) \times \prod_{q \mid t} \left(1 - \frac{1}{q}\right) = p \times \left[ i \times \left(1 - \frac{1}{p}\right) \times \prod_{q \mid t} \left(1 - \frac{1}{q}\right) \right] = p \times \varphi(i)φ(i×p)=(i×p)×(1p1)×qt(1q1)=p×[i×(1p1)×qt(1q1)]=p×φ(i)

  2. imodp≠0i \mod p \neq 0imodp=0 时:
    gcd⁡(i,p)=1\gcd(i,p)=1gcd(i,p)=1,由性质 2(积性函数),φ(i×p)=φ(i)×φ(p)=φ(i)×(p−1)\varphi(i \times p) = \varphi(i) \times \varphi(p) = \varphi(i) \times (p - 1)φ(i×p)=φ(i)×φ(p)=φ(i)×(p1)(性质 1 中 φ(p)=p−1\varphi(p)=p-1φ(p)=p1)。

性质 7:欧拉函数的和等于原数

对任意正整数 nnn,有 n=∑d∣nφ(d)n = \sum_{d \mid n} \varphi(d)n=dnφ(d)(其中 d∣nd \mid ndn 表示 dddnnn 的正约数)。

通俗证明
考虑分数集合 {1n,2n,3n,…,nn}\left\{ \frac{1}{n}, \frac{2}{n}, \frac{3}{n}, \dots, \frac{n}{n} \right\}{n1,n2,n3,,nn},共 nnn 个分数。将每个分数化简为最简形式 ad\frac{a}{d}da(其中 gcd⁡(a,d)=1\gcd(a,d)=1gcd(a,d)=1d∣nd \mid ndn):

  • 对每个约数 ddd,化简后分母为 ddd 的分数,其分子 aaa 必满足 1≤a≤d1 \leq a \leq d1adgcd⁡(a,d)=1\gcd(a,d)=1gcd(a,d)=1,这样的 aaa 共有 φ(d)\varphi(d)φ(d) 个;
  • 所有化简后的分数恰好覆盖原集合的 nnn 个分数,因此所有 φ(d)\varphi(d)φ(d) 的和等于 nnn

性质 8:欧拉定理

对于互质的整数 aaammm(即 gcd⁡(a,m)=1\gcd(a,m)=1gcd(a,m)=1),有 aφ(m)≡1(modm)a^{\varphi(m)} \equiv 1 \pmod{m}aφ(m)1(modm)

证明

  1. 设集合 Z={q1,q2,…,qφ(m)}Z = \{ q_1, q_2, \dots, q_{\varphi(m)} \}Z={q1,q2,,qφ(m)},其中 q1,q2,…,qφ(m)q_1,q_2,\dots,q_{\varphi(m)}q1,q2,,qφ(m) 是所有小于 mmm 且与 mmm 互质的数(即 ZZZmmm 的缩系),显然 ∣Z∣=φ(m)|Z| = \varphi(m)Z=φ(m)

  2. 构造集合 Y={(a×q1)modm,(a×q2)modm,…,(a×qφ(m))modm}Y = \{ (a \times q_1) \mod m, (a \times q_2) \mod m, \dots, (a \times q_{\varphi(m)}) \mod m \}Y={(a×q1)modm,(a×q2)modm,,(a×qφ(m))modm},需证明 Y=ZY = ZY=Z

    • 步骤 1:YYY 中元素均属于 ZZZ:因 gcd⁡(a,m)=1\gcd(a,m)=1gcd(a,m)=1gcd⁡(qi,m)=1\gcd(q_i,m)=1gcd(qi,m)=1,故 gcd⁡(a×qi,m)=1\gcd(a \times q_i, m)=1gcd(a×qi,m)=1,因此 (a×qi)modm(a \times q_i) \mod m(a×qi)modm 是小于 mmm 且与 mmm 互质的数,即属于 ZZZ
    • 步骤 2:YYY 中元素两两不同(反证法):假设 i≠ji \neq ji=j(a×qi)modm=(a×qj)modm(a \times q_i) \mod m = (a \times q_j) \mod m(a×qi)modm=(a×qj)modm,则 a×(qi−qj)≡0(modm)a \times (q_i - q_j) \equiv 0 \pmod{m}a×(qiqj)0(modm)。因 gcd⁡(a,m)=1\gcd(a,m)=1gcd(a,m)=1,故 qi−qj≡0(modm)q_i - q_j \equiv 0 \pmod{m}qiqj0(modm),即 qi=qjq_i = q_jqi=qj,与 i≠ji \neq ji=j 矛盾。
  3. Y=ZY = ZY=Z,两组集合的元素乘积对模 mmm 相等:
    (a×q1)×(a×q2)×⋯×(a×qφ(m))≡q1×q2×⋯×qφ(m)(modm)(a \times q_1) \times (a \times q_2) \times \dots \times (a \times q_{\varphi(m)}) \equiv q_1 \times q_2 \times \dots \times q_{\varphi(m)} \pmod{m}(a×q1)×(a×q2)××(a×qφ(m))q1×q2××qφ(m)(modm)
    左边整理为 aφ(m)×(q1×q2×⋯×qφ(m))a^{\varphi(m)} \times (q_1 \times q_2 \times \dots \times q_{\varphi(m)})aφ(m)×(q1×q2××qφ(m)),因此:
    aφ(m)×(q1×q2×⋯×qφ(m))≡q1×q2×⋯×qφ(m)(modm)a^{\varphi(m)} \times (q_1 \times q_2 \times \dots \times q_{\varphi(m)}) \equiv q_1 \times q_2 \times \dots \times q_{\varphi(m)} \pmod{m}aφ(m)×(q1×q2××qφ(m))q1×q2××qφ(m)(modm)

  4. q1,q2,…,qφ(m)q_1,q_2,\dots,q_{\varphi(m)}q1,q2,,qφ(m) 均与 mmm 互质,其乘积也与 mmm 互质,可两边同时除以该乘积,得:
    aφ(m)≡1(modm)a^{\varphi(m)} \equiv 1 \pmod{m}aφ(m)1(modm)

推论(费马小定理):若 ppp 为质数,且 gcd⁡(a,p)=1\gcd(a,p)=1gcd(a,p)=1,则 ap−1≡1(modp)a^{p-1} \equiv 1 \pmod{p}ap11(modp)
(因质数 ppp 的欧拉函数 φ(p)=p−1\varphi(p)=p-1φ(p)=p1,代入欧拉定理即可得。)

四、欧拉函数求法

1. 线性筛法(O(n),适合求 1 到 n 所有数的欧拉函数)

利用欧拉函数的性质 2、3、6,结合线性筛(埃氏筛的优化),可在 O(n)O(n)O(n) 时间内求出 1 到 nnn 所有数的欧拉函数值。

代码实现

#include <iostream>
#include <cstring>
using namespace std;const int maxn = 1e6 + 10;  // 根据需求调整最大值
int p[maxn];                // 存储质数
bool vis[maxn];             // 标记是否为合数
long long phi[maxn];        // 存储欧拉函数值
int cnt = 0;                // 质数的个数// 线性筛求 1~len 的欧拉函数
long long get_phi(int len = maxn) {memset(vis, false, sizeof(vis));phi[1] = 1;  // 特殊规定:φ(1)=1for (int i = 2; i < len; i++) {if (!vis[i]) {  // i 是质数p[cnt++] = i;phi[i] = i - 1;  // 性质 1:质数的欧拉函数为 i-1}// 遍历已找到的质数,更新 i*p[j] 的欧拉函数for (int j = 0; j < cnt; j++) {if (p[j] * i >= len) break;  // 超出范围,退出vis[p[j] * i] = true;        // 标记为合数if (i % p[j] == 0) {         // p[j] 是 i 的质因数(性质 6 前半部分)phi[i * p[j]] = p[j] * phi[i];break;} else {                     // p[j] 不是 i 的质因数(性质 6 后半部分)phi[i * p[j]] = phi[i] * (p[j] - 1);}}}
}int main() {get_phi(100);  // 求 1~100 的欧拉函数for (int i = 1; i <= 10; i++) {cout << "φ(" << i << ") = " << phi[i] << endl;}return 0;
}

2. 单点求法(O(√n),适合求单个正整数的欧拉函数)

对单个正整数 xxx,先进行质因数分解,再代入欧拉函数公式 φ(x)=x×∏p∣x(1−1p)\varphi(x) = x \times \prod_{p \mid x} \left(1 - \frac{1}{p}\right)φ(x)=x×px(1p1) 计算。

代码实现

#include <iostream>
using namespace std;typedef long long ll;// 求单个正整数 x 的欧拉函数
ll get_phi(ll x) {ll res = x;  // 初始值为 x// 质因数分解:遍历到 √xfor (int i = 2; (ll)i * i <= x; i++) {if (x % i == 0) {  // i 是 x 的质因数res = res - res / i;  // 等价于 res *= (1 - 1/i)while (x % i == 0) {  // 去除所有 i 的因子(避免重复计算)x /= i;}}}if (x != 1) {  // 若 x 剩余部分为质数(大于 √x 的质因数)res = res - res / x;}return res;
}int main() {ll x;cin >> x;cout << "φ(" << x << ") = " << get_phi(x) << endl;return 0;
}

五、欧拉函数的应用

1. 欧拉筛质数

线性筛法在求欧拉函数的同时,也会筛选出所有质数(存储在数组 ppp 中),因此可直接用于质数筛选。

2. 欧拉降幂

在计算大指数幂 AkmodmA^k \mod mAkmodm 时,利用欧拉函数可降低指数的规模,避免直接计算大指数导致的溢出或效率低下。

欧拉降幂公式

  • gcd⁡(A,m)=1\gcd(A,m) = 1gcd(A,m)=1,则 Ak≡Akmodφ(m)(modm)A^k \equiv A^{k \mod \varphi(m)} \pmod{m}AkAkmodφ(m)(modm)
  • gcd⁡(A,m)≠1\gcd(A,m) \neq 1gcd(A,m)=1k<φ(m)k < \varphi(m)k<φ(m),则 Ak≡Ak(modm)A^k \equiv A^k \pmod{m}AkAk(modm)(直接计算);
  • gcd⁡(A,m)≠1\gcd(A,m) \neq 1gcd(A,m)=1k≥φ(m)k \geq \varphi(m)kφ(m),则 Ak≡Akmodφ(m)+φ(m)(modm)A^k \equiv A^{k \mod \varphi(m) + \varphi(m)} \pmod{m}AkAkmodφ(m)+φ(m)(modm)

说明:公式的严格证明需结合数论中的“阶”和“缩系”概念,实际应用中可直接记忆公式使用。


via:

  • 欧拉函数最全总结-CSDN博客
    https://blog.csdn.net/weixin_41603028/article/details/107078050

  • 欧拉函数及其性质-CSDN博客
    https://blog.csdn.net/qq_37493070/article/details/81988725

    • 欧拉降幂公式解析-CSDN博客
      https://blog.csdn.net/weixin_38686780/article/details/81272848
  • 欧拉函数详解-CSDN博客
    https://blog.csdn.net/w144215160044/article/details/51158735

  • 欧拉函数的几个性质及证明 - henry_y - 博客园
    https://www.cnblogs.com/henry-1202/p/10246196.html

  • 欧拉函数 φ(n) 的计算及欧拉定理 - 知乎
    https://zhuanlan.zhihu.com/p/151756874


文章转载自:

http://c2ToeBhY.mjybt.cn
http://0szgVCxa.mjybt.cn
http://dosxgvL0.mjybt.cn
http://lXAZsRQa.mjybt.cn
http://buf8igRF.mjybt.cn
http://VoqEmu4L.mjybt.cn
http://yT9DODfF.mjybt.cn
http://Riwoi1Oq.mjybt.cn
http://bywhXhbS.mjybt.cn
http://s8V7Q3p6.mjybt.cn
http://VXSb3BVt.mjybt.cn
http://X2i0SlNh.mjybt.cn
http://UfWf2fyq.mjybt.cn
http://eigkpaJt.mjybt.cn
http://ninYKSw2.mjybt.cn
http://x3kwAPQ3.mjybt.cn
http://LSJzEnYM.mjybt.cn
http://l2PqqniY.mjybt.cn
http://v0fcQTVK.mjybt.cn
http://mkgUfapi.mjybt.cn
http://8MCW7heS.mjybt.cn
http://DK4XHVyU.mjybt.cn
http://J3YhaT5F.mjybt.cn
http://HrSY519m.mjybt.cn
http://ehItxGYt.mjybt.cn
http://AKXEsLsS.mjybt.cn
http://qR5qOMuA.mjybt.cn
http://lYAplcxS.mjybt.cn
http://jKORcZiy.mjybt.cn
http://sKHs4lfN.mjybt.cn
http://www.dtcms.com/a/381515.html

相关文章:

  • 【更新至2024年】1996-2024年各省农业总产值数据(无缺失)
  • 财报季观察|消费“分野”,燕之屋(1497.HK)们向上生长
  • 机械制造专属ERP:降本增效与数字转型的关键
  • 基于node.js+vue的医院陪诊系统的设计与实现(源码+论文+部署+安装)
  • 【大语言模型 59】监控与日志系统:训练过程全面监控
  • HIS架构智能化升级编程路径:从底层原理到临床实践的深度解析(下)
  • Node.js中package.json详解
  • 当AI遇上数据库:Text2Sql.Net如何让“说人话查数据“成为现实
  • 数据结构8——双向链表
  • 问卷系统自动化测试报告
  • Python 的函数柯里化(Currying)
  • 渗透测试信息收集详解
  • 【连载3】C# MVC 异常日志进阶:结构化日志与性能优化技巧
  • 冯诺依曼体系:现代计算机的基石与未来展望
  • 关于在阿里云DMS误操作后如何恢复数据的记录
  • 贪心算法应用:神经网络剪枝详解
  • 灵活学习PyTorch算法:从动态计算图到领域最佳实践
  • [code-review] 部署配置 | Docker+PM2 | AWS Lambda | Vercel+边缘函数
  • 递归,搜索与回溯算法
  • 31.网络基础概念(一)
  • 贪心算法应用:信用卡还款优化问题详解
  • Linux的多线程
  • 《链式二叉树常用操作全解析》
  • ——贪心算法——
  • IDEA使用Maven和MyBatis简化数据库连接(配置篇)
  • MLLM学习~M3-Agent如何处理视频:视频clip提取、音频提取、抽帧提取和人脸提取
  • video视频标签 响应式写法 pc 手机调用不同视频 亲测
  • CMD简单用法
  • 【iOS】AFNetworking
  • 【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)