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

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


欧拉函数最全总结

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

一、欧拉函数的引入

首先引入互质关系:

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

其次引进缩系的概念:

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

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

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

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

二、欧拉函数的定义

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

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

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

函数表: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 = p 1 × p 2 n = p_1 \times p_2 n=p1×p2(其中 ( p 1 , p 2 ) = 1 (p_1,p_2)=1 (p1,p2)=1),则 φ ( n ) = φ ( p 1 p 2 ) = φ ( p 1 ) φ ( p 2 ) \varphi(n) = \varphi(p_1p_2) = \varphi(p_1)\varphi(p_2) φ(n)=φ(p1p2)=φ(p1)φ(p2)
    特别的,对于两个素数 p, q, φ ( p q ) = ( p − 1 ) ( q − 1 ) \varphi(pq)=(p-1)(q-1) φ(pq)=(p1)(q1)(RSA 算法应用核心性质)。
  3. n > 2 n>2 n2 时, φ ( n ) \varphi(n) φ(n) 都是偶数,也即 φ ( n ) ≡ 0 ( m o d 2 ) \varphi(n) \equiv 0 \pmod{2} φ(n)0(mod2)
    简单证明:若 n 是质数 p 的 k 次幂(即 n = p k n=p^k n=pk),则 φ ( n ) = p k − p k − 1 = ( p − 1 ) p k − 1 \varphi(n)=p^k - p^{k-1}=(p-1)p^{k-1} φ(n)=pkpk1=(p1)pk1
    • 当 p=2 时, p k − 1 p^{k-1} pk1 必为偶数(k≥2 时, 2 k − 1 2^{k-1} 2k1 是偶数);
    • 当 p>2 时,(p-1) 必为偶数(奇素数减 1 为偶数)。
      因此无论 p 是 2 还是大于 2 的素数, φ ( n ) \varphi(n) φ(n) 均为偶数。

四、欧拉函数的计算方法

(一)素数分解法

  1. 对于一个正整数 N 的素数幂分解 N = P 1 q 1 P 2 q 2 … P n q n N=P_1^{q_1}P_2^{q_2}\dots P_n^{q_n} N=P1q1P2q2Pnqn(其中 P i P_i Pi 为素数, 1 ≤ i ≤ n 1 \leq i \leq n 1in),根据欧拉函数的积性性质可得:
    φ ( N ) = φ ( P 1 q 1 ) φ ( P 2 q 2 ) … φ ( P n q n ) \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 = p k n=p^k n=pk),则 φ ( n ) = p k − p k − 1 = ( p − 1 ) p k − 1 \varphi(n)=p^k - p^{k-1}=(p-1)p^{k-1} φ(n)=pkpk1=(p1)pk1
    原理:除了 p 的倍数外,其他数都与 n 互质。

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

(二)编程思维

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

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

示例:

  • φ ( 10 ) = 10 × ( 1 − 1 2 ) × ( 1 − 1 5 ) = 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 − 1 2 ) × ( 1 − 1 3 ) × ( 1 − 1 5 ) = 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 − 1 7 ) = 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 l
    l = []
    for x in range(n):
        # 判断如果 x 是素数,则加入列表,否则跳过
        if x < 2:
            continue
        for i in range(2, x):
            if x % i == 0:
                break
        else:
            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 = n
    for 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     9

    0?

    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 * 10
    print("\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      9

      0?      0      1      1      2      2      4      2      6      4      6

      1?      4     10      4     12      6      8      8     16      6     18

      2?      8     12     10     22      8     20     12     18     12     28

      3?      8     30     16     20     16     24     12     36     18     24

      4?     16     40     12     42     20     24     22     46     16     42

      5?     20     32     24     52     18     40     24     36     28     58

      6?     16     60     30     36     32     48     20     66     32     44

      7?     24     70     24     72     36     40     36     60     24     78

      8?     32     54     40     82     24     64     42     56     40     88

      9?     24     72     44     60     46     72     32     96     42     60

                                 φ(100)=40

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

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

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

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

定理 2:缩系的充要条件

a 1 , a 2 , … , a φ ( m ) a_1,a_2,\dots,a_{\varphi(m)} a1a2aφ(m) 是 φ(m) 个与 m 互素的整数,则 a 1 , a 2 , … , 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,根据互素性质可知 ( a x , m ) = 1 (ax,m)=1 (ax,m)=1(即 ax 与 m 互素)。
  3. 假设 a x 1 ≡ a x 2 ( m o d m ) ax_1 \equiv ax_2 \pmod{m} ax1ax2(modm),两边同时乘以 a 的逆元(因 (a,m)=1,a 的逆元存在),可得 x 1 ≡ x 2 ( m o d m ) x_1 \equiv x_2 \pmod{m} x1x2(modm)。但 x 是通过缩系的元素,两两不同余,故假设不成立,即 ax 两两不同余。

综上, a x ax ax 通过模数 m m m 的缩系,证完。

特别说明:
根据定理“整数 a,b 对模数 m 同余的充分必要条件是 m|(a-b)”,可得:
a x 1 ≡ a x 2 ( m o d m ) ax_1 \equiv ax_2 \pmod{m} ax1ax2(modm) 的充分必要条件是 m ∣ a ( x 1 − x 2 ) m|a(x_1 - x_2) ma(x1x2)
又因 ( a , m ) = 1 (a,m)=1 (a,m)=1,故 m 必整除 ( x 1 − x 2 ) (x_1 - x_2) (x1x2),即 x 1 ≡ x 2 ( m o d m ) 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,故 ( a x , 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 ) = ( ( a x , a m ) , m ) = ( a x , m ( a , 1 ) ) = ( a x , 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,故 ( a x , m ) = 1 (ax,m)=1 (ax,m)=1,结论成立。

证完。

定理 4:欧拉定理

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

证明:

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

证完。

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

简单证明:
a c ≡ b c ( m o d m ) ac \equiv bc \pmod{m} acbc(modm) m ∣ c ( a − b ) m|c(a - b) mc(ab),即 m d ∣ c d ( 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 的最大公约数),故 m d ∣ ( a − b ) \frac{m}{d}|(a - b) dm(ab),即 a ≡ b ( m o d m / d ) a \equiv b \pmod{m/d} ab(modm/d)

证完。

定理 5:费马小定理

若 p 是素数,则对于每个整数 a,有 a p ≡ a ( m o d p ) 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,故 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap11(modp)。两边乘以 a 得 a p ≡ a ( m o d p ) a^p \equiv a \pmod{p} apa(modp)
② 若 a 是 p 的倍数:则 a ≡ 0 ( m o d p ) a \equiv 0 \pmod{p} a0(modp),故 a p ≡ 0 ( m o d p ) a^p \equiv 0 \pmod{p} ap0(modp),即 a p ≡ a ( m o d p ) a^p \equiv a \pmod{p} apa(modp)

综上,定理成立,证完。

定理 6:缩系组合性质

m 1 > 0 m_1>0 m10 m 2 > 0 m_2>0 m20 ( m 1 , m 2 ) = 1 (m_1,m_2)=1 (m1,m2)=1 x 1 , x 2 x_1,x_2 x1,x2 分别通过模数 m 1 , m 2 m_1,m_2 m1,m2 的缩系,则 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 通过模数 m 1 m 2 m_1m_2 m1m2 的缩系。

证明:

第一步:证明 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 m 1 m 2 m_1m_2 m1m2 互素

假设 ( m 2 x 1 + m 1 x 2 , m 1 m 2 ) > 1 (m_2x_1 + m_1x_2, m_1m_2)>1 (m2x1+m1x2,m1m2)1,则存在素数 p 整除 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 m 1 m 2 m_1m_2 m1m2

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

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

第二步:证明所有 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 对模 m 1 m 2 m_1m_2 m1m2 两两不同余

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

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

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

第三步:证明所有与 m 1 m 2 m_1m_2 m1m2 互素的数均可表示为 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 的形式

由完全剩余系定理“设 m 1 > 0 m_1>0 m10 m 2 > 0 m_2>0 m20 ( m 1 , m 2 ) = 1 (m_1,m_2)=1 (m1,m2)=1 x 1 , x 2 x_1,x_2 x1,x2 分别通过 m 1 , m 2 m_1,m_2 m1,m2 的完全剩余系,则 m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 通过 m 1 m 2 m_1m_2 m1m2 的完全剩余系”,可知任意与 m 1 m 2 m_1m_2 m1m2 互素的数 a 可表示为 a ≡ m 2 x 1 + m 1 x 2 ( m o d m 1 m 2 ) a \equiv m_2x_1 + m_1x_2 \pmod{m_1m_2} am2x1+m1x2(modm1m2)

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

综上, m 2 x 1 + m 1 x 2 m_2x_1 + m_1x_2 m2x1+m1x2 通过模数 m 1 m 2 m_1m_2 m1m2 的缩系,证完。

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

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

对于一个正整数 n 的素数幂分解 n = P 1 q 1 P 2 q 2 … P k q k n=P_1^{q_1}P_2^{q_2}\dots P_k^{q_k} n=P1q1P2q2Pkqk(其中 P i P_i Pi 为素数, 1 ≤ i ≤ k 1 \leq i \leq k 1ik),则
φ ( n ) = n × ( 1 − 1 P 1 ) × ( 1 − 1 P 2 ) × ⋯ × ( 1 − 1 P k ) \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 = 1 k φ ( P i q i ) \varphi(n)=\prod_{i=1}^k \varphi(P_i^{q_i}) φ(n)=i=1kφ(Piqi)。结合素数幂的欧拉函数公式 φ ( P i q i ) = P i q i − P i q i − 1 = P i q i × ( 1 − 1 P i ) \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 = 1 k P i q i × ( 1 − 1 P i ) = n × ∏ i = 1 k ( 1 − 1 P i ) \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 ≥ 1 n≥1 n1,则有 ∑ d ∣ n , d > 0 φ ( d ) = n \sum_{d|n, d>0} \varphi(d) = n dn,d0φ(d)=n(即 n 的所有正约数的欧拉函数值之和等于 n)。

证明:

  1. 对 n 进行素数幂分解: n = P 1 q 1 P 2 q 2 … P k q k n=P_1^{q_1}P_2^{q_2}\dots P_k^{q_k} n=P1q1P2q2Pkqk P i P_i Pi 为素数, q i ≥ 1 q_i≥1 qi1)。
  2. n 的所有正约数 d 可表示为 d = P 1 x 1 P 2 x 2 … P k x k d=P_1^{x_1}P_2^{x_2}\dots P_k^{x_k} d=P1x1P2x2Pkxk(其中 0 ≤ x i ≤ q i 0 \leq x_i \leq q_i 0xiqi 1 ≤ i ≤ k 1 \leq i \leq k 1ik)。
  3. 由欧拉函数的积性(定理 6 推论), φ ( d ) = φ ( P 1 x 1 ) φ ( P 2 x 2 ) … φ ( P k x k ) \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 ) = ∑ x 1 = 0 q 1 ∑ x 2 = 0 q 2 ⋯ ∑ x k = 0 q k [ φ ( P 1 x 1 ) φ ( P 2 x 2 ) … φ ( P k x k ) ] \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 ) = [ ∑ x 1 = 0 q 1 φ ( P 1 x 1 ) ] × [ ∑ x 2 = 0 q 2 φ ( P 2 x 2 ) ] × ⋯ × [ ∑ x k = 0 q k φ ( P k x k ) ] \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. 计算单个素数幂的欧拉函数和:
    • x i = 0 x_i=0 xi=0 时, P i 0 = 1 P_i^0=1 Pi0=1 φ ( 1 ) = 1 \varphi(1)=1 φ(1)=1
    • x i ≥ 1 x_i≥1 xi1 时, φ ( P i x i ) = P i x i − P i x i − 1 \varphi(P_i^{x_i})=P_i^{x_i} - P_i^{x_i-1} φ(Pixi)=PixiPixi1(素数幂欧拉函数公式)。
      因此:
      ∑ x i = 0 q i φ ( P i x i ) = 1 + ( P i − 1 ) + ( P i 2 − P i ) + ⋯ + ( P i q i − P i q i − 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)
      展开后中间项抵消,得 ∑ x i = 0 q i φ ( P i x i ) = P i q i \sum_{x_i=0}^{q_i} \varphi(P_i^{x_i}) = P_i^{q_i} xi=0qiφ(Pixi)=Piqi
  6. 代入步骤 4 的乘积式,得:
    ∑ d ∣ n φ ( d ) = P 1 q 1 × P 2 q 2 × ⋯ × P k q k = n \sum_{d|n} \varphi(d) = P_1^{q_1} \times P_2^{q_2} \times \dots \times P_k^{q_k} = n dnφ(d)=P1q1×P2q2××Pkqk=n

证完。

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

1. 原根个数

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

(原理:原根的定义是“使得 g φ ( m ) ≡ 1 ( m o d m ) g^{\varphi(m)} \equiv 1 \pmod{m} gφ(m)1(modm) 且最小正整数 k=φ(m) 的 g”,所有原根可表示为 g k g^k gk(其中 ( 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 的全部原根为 { g k ∣ 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 算法是一种非对称加密算法,其安全性基于“大整数分解困难”的数学问题,核心依赖欧拉函数的性质(尤其是 φ ( p q ) = ( p − 1 ) ( q − 1 ) \varphi(pq)=(p-1)(q-1) φ(pq)=(p1)(q1),其中 p,q 为素数)。

RSA 算法的具体描述如下:

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

NAME
    termcolor - ANSII Color formatting for output in terminal.

FUNCTIONS
    colored(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.

DATA
    ATTRIBUTES = {'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)
    113
    114         text += RESET

KeyError: 'red'
# 正确示例:白色文本、红色背景、反向显示、加粗;绿色文本、红色背景
from termcolor import colored, cprint

text = 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  # 修改为 3
    print(a)  # 函数内打印:3

print(a)  # 调用函数前,a 仍为 2
sum(5)    # 调用函数,a 变为 3 并打印
print(a)  # 调用函数后,全局变量 a 已变为 3

sum(6)    # 再次调用函数,a 保持 3 并打印

输出结果:

2
2
3
3
3

欧拉函数及其性质

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

一、定义

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

二、函数式

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

其中:

  • p i p_i pi x x x 的质因数( x > 0 x > 0 x>0)。
  • φ ( x ) \varphi(x) φ(x) 表示从 1 到 x x x 中与 x x x 互质的数的个数。

三、性质

性质 1:质数的欧拉函数

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

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

性质 2:积性函数特性

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

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

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

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

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

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

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

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

  1. p 1 k 1 , p 2 k 2 , … , p m k m p_1^{k_1},p_2^{k_2},\dots,p_m^{k_m} p1k1,p2k2,,pmkm 两两互质,故 φ ( n ) = ∏ i = 1 m φ ( p i k i ) \varphi(n) = \prod_{i=1}^m \varphi(p_i^{k_i}) φ(n)=i=1mφ(piki)
  2. 由性质 3, φ ( p i k i ) = p i k i − p i k i − 1 = p i k i × ( 1 − 1 p i ) \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 = 1 m [ p i k i × ( 1 − 1 p i ) ] = ( ∏ i = 1 m p i k i ) × ∏ i = 1 m ( 1 − 1 p i ) = n × ∏ i = 1 m ( 1 − 1 p i ) \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:与 n n n 互质数的和

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

证明

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

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

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

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

p p p 为质数,对任意正整数 i i i

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

证明

  1. i m o d    p = 0 i \mod p = 0 imodp=0 时:
    i = p k × t i = p^k \times t i=pk×t(其中 gcd ⁡ ( t , p ) = 1 \gcd(t,p)=1 gcd(t,p)=1),则 i × p = p k + 1 × t i \times p = p^{k+1} \times t i×p=pk+1×t。由性质 4, φ ( i ) = i × ( 1 − 1 p ) × ∏ q ∣ t ( 1 − 1 q ) \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 − 1 p ) × ∏ q ∣ t ( 1 − 1 q ) = p × [ i × ( 1 − 1 p ) × ∏ q ∣ t ( 1 − 1 q ) ] = 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. i m o d    p ≠ 0 i \mod p \neq 0 imodp=0 时:
    gcd ⁡ ( i , p ) = 1 \gcd(i,p)=1 gcd(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:欧拉函数的和等于原数

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

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

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

性质 8:欧拉定理

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

证明

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

  2. 构造集合 Y = { ( a × q 1 ) m o d    m , ( a × q 2 ) m o d    m , … , ( a × q φ ( m ) ) m o d    m } 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 = Z Y = Z Y=Z

    • 步骤 1: Y Y Y 中元素均属于 Z Z Z:因 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1 gcd ⁡ ( q i , m ) = 1 \gcd(q_i,m)=1 gcd(qi,m)=1,故 gcd ⁡ ( a × q i , m ) = 1 \gcd(a \times q_i, m)=1 gcd(a×qi,m)=1,因此 ( a × q i ) m o d    m (a \times q_i) \mod m (a×qi)modm 是小于 m m m 且与 m m m 互质的数,即属于 Z Z Z
    • 步骤 2: Y Y Y 中元素两两不同(反证法):假设 i ≠ j i \neq j i=j ( a × q i ) m o d    m = ( a × q j ) m o d    m (a \times q_i) \mod m = (a \times q_j) \mod m (a×qi)modm=(a×qj)modm,则 a × ( q i − q j ) ≡ 0 ( m o d m ) a \times (q_i - q_j) \equiv 0 \pmod{m} a×(qiqj)0(modm)。因 gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1,故 q i − q j ≡ 0 ( m o d m ) q_i - q_j \equiv 0 \pmod{m} qiqj0(modm),即 q i = q j q_i = q_j qi=qj,与 i ≠ j i \neq j i=j 矛盾。
  3. Y = Z Y = Z Y=Z,两组集合的元素乘积对模 m m m 相等:
    ( a × q 1 ) × ( a × q 2 ) × ⋯ × ( a × q φ ( m ) ) ≡ q 1 × q 2 × ⋯ × q φ ( m ) ( m o d m ) (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 ) × ( q 1 × q 2 × ⋯ × 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 ) × ( q 1 × q 2 × ⋯ × q φ ( m ) ) ≡ q 1 × q 2 × ⋯ × q φ ( m ) ( m o d m ) 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. q 1 , q 2 , … , q φ ( m ) q_1,q_2,\dots,q_{\varphi(m)} q1,q2,,qφ(m) 均与 m m m 互质,其乘积也与 m m m 互质,可两边同时除以该乘积,得:
    a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)} \equiv 1 \pmod{m} aφ(m)1(modm)

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

四、欧拉函数求法

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

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

代码实现

#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)=1
    for (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),适合求单个正整数的欧拉函数)

对单个正整数 x x x,先进行质因数分解,再代入欧拉函数公式 φ ( x ) = x × ∏ p ∣ x ( 1 − 1 p ) \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
    // 质因数分解:遍历到 √x
    for (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. 欧拉筛质数

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

2. 欧拉降幂

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

欧拉降幂公式

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

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


via:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值