跳到主要内容

WTF zk教程第10讲:欧拉定理

欧拉定理是数论中的基本定理,表明在模运算中,对于任意整数与模数互质的情况下,该整数的欧拉函数次幂与模数同余于1,为RSA等加密算法提供了数学基础。这一讲,我们将介绍离散对数问题,单元阶,以及欧拉定理。

1. 离散对数问题

离散数学问题(Discrete Logarithm Problem)是数学和密码学中的一个经典难题,其实就是说模运算求对数非常难。

给定素数 pp,以及整数 g,hZng, h \in \mathbb{Z}_n^*,要求找到整数 xx,使得:

gxh(modp)g^x \equiv h \pmod{p}

举个例子,对于 (p,g,h)=(7,3,6)(p, g, h) = (7, 3, 6),求满足等式 3x6(mod7)3^x \equiv 6 \pmod{7}xx。我们尝试用穷举法来解决它:

313(mod7)3^1 \equiv 3 \pmod{7}
322(mod7)3^2 \equiv 2 \pmod{7}
336(mod7)3^3 \equiv 6 \pmod{7}

因此, x=3x = 3 满足条件。

但是对于更大的素数,计算离散对数非常难,比如 (p,g,h)=(104729,5,3375)(p, g, h) = (104729, 5, 3375) 就很难。而RSA加密算法和椭圆曲线密码系统的安全性就是由离散对数问题保障的,会选取更大更难计算的参数。

2. 单元阶

aZna \in \mathbb{Z}_n,能让 ak1(modn)a^k \equiv 1 \pmod{n} 的最小整数 kk 被称为单元 aa 的阶。

举个例子:

当模 n=5n = 5a=2a = 2 时,有:

21=2(mod5)2^1 = 2 \pmod{5}
22=4(mod5)2^2 = 4 \pmod{5}
23=8=3(mod5)2^3 = 8 = 3 \pmod{5}
24=16=1(mod5)2^4 = 16 = 1 \pmod{5}

因此 aa 的阶为 44。单元的阶很重要,因为它刻画了单元集的循环性质。我们可以看到 25=224=21=2(mod5)2^5 = 2 \cdot 2^4 = 2 \cdot 1 = 2 \pmod{5},落入了下一个 {2,4,3,1}\{2, 4, 3, 1\} 循环中。

2.1 阶的性质

在数论中,阶(order)是一个重要的概念,表示一个元素与模数之间的循环性质。以下是数论中阶的一些重要性质:

1. 如果 aa 的阶为 kk,那么 aj1(modn)a^j \equiv 1 \pmod{n} 当且仅当 kk 整除 jj

继续使用上面的例子, a=2,n=5a=2, n =5aa 的阶为 44,有 282561(mod5)2^8 \equiv 256 \equiv 1 \pmod{5}44 能整除 88

点我展开证明 👀

首先,我们先把 jjkk 表示。根据欧几里得除法,有

j=qk+rj = qk + r

其中 0r<k0 \le r < k。然后将它代入原式,有

aj=aqk+r=aqkar=(ak)qar1(modn)a^j = a^{qk+r} = a^{qk}a^r = (a^{k})^qa^r \equiv 1 \pmod{n}

又因为 ak1(modn)a^k \equiv 1 \pmod{n},所以 (ak)q1(modn)(a^{k})^q\equiv 1 \pmod{n},上式可以简化为

ar1(modn)a^r \equiv 1 \pmod{n}

根据阶的定义,kk 是能让 ak1(modn)a^k \equiv 1 \pmod{n} 的最小整数,又因为 0r<k0 \le r < k,所以 r=0r = 0,有:

j=qkj = qk

因此 kk 整除 jj,证毕。

2. 如果 aa 与模数 nn 互质,那么 aa 的阶 kk 能够整除 ϕ(n)\phi(n),其中 ϕ(n)\phi(n) 是欧拉函数。

点我展开证明 👀

这一性质涉及欧拉定理,我们会在下一节介绍。

根据欧拉定理,有 aϕ(n)1(modn)a^{\phi(n)} \equiv 1 \pmod{n}。根据第一个性质:如果 aa 的阶为 kk,那么 aj1(modn)a^j \equiv 1 \pmod{n} 当且仅当 kk 整除 jj。有 kk 整除ϕ(n)\phi(n)。证毕。

3. 欧拉定理

欧拉定理将欧拉函数和幂运算的循环性质联系起来。

定理: 如果整数 aa 和正整数 nn 互质(即 gcd(a,n)=1\gcd(a,n)=1),那么 aϕ(n)1(modn)a^{\phi(n)} \equiv 1 \pmod{n}

其中 ϕ(n)\phi(n) 是欧拉函数,也就是 [1,...,n1][1, ..., n-1] 中与 nn 互质的整数的个数。

继续使用上面的例子, a=2,n=5a=2, n =5,首先计算 ϕ(5)=51=4\phi(5)=5-1=4,有 24161(mod5)2^4 \equiv 16 \equiv 1 \pmod{5}, 符合欧拉定理。

再举个例子, a=3,n=7a = 3, n = 7,首先计算 ϕ(7)=71=6\phi(7) = 7-1 =6,然后应用欧拉定理得到 361(mod7)3^6 \equiv 1 \pmod{7}。检查一下 36=7293^6 = 729,除 77 的余数为 11,欧拉定理正确。

点我展开证明 👀

考虑集合 S=Zn={1xngcd(x,n)=1}S = Z_n^* = \{1 \le x \le n | \gcd(x,n) = 1\}。我们知道 SS 共有 ϕ(n)\phi(n) 个元素,把它们记为 {x1,x2,...,xϕ(n)}\{x_1, x_2, ..., x_{\phi(n)}\}

再考虑另一个集合 SS',它的元素是 SS 中的元素乘以 aa,可以表示为:

S=aS={ax1,ax2,...,axϕ(n)}S' = aS = \{ax_1, ax_2, ..., ax_{\phi(n)}\}

引理1: gcd(axi,n)=1\gcd(ax_i,n) = 1

证明:因为 gcd(a,n)=1\gcd(a, n) = 1gcd(xi,n)=1\gcd(x_i,n) = 1,因此 gcd(axi,n)=1\gcd(ax_i,n) = 1

引理2: 从集合 SS' 任取两个元素,它们不在模 nn 下同余。

证明:假设 SS' 中存在两个元素 axiax_iaxjax_j 同余,有 axiaxj(modn)ax_i \equiv ax_j \pmod{n},那么有 a(xixj)0(modn)a(x_i- x_j) \equiv 0 \pmod{n},也就意味着 nn 整除 a(xixj)a(x_i- x_j),即 na(xixj)n|a(x_i- x_j)。又因为 gcd(a,n)=1\gcd(a, n) = 1,那么 n(xixj)n|(x_i- x_j),也就是 xixj=knx_i- x_j = kn。又因为 1xi,xjn1 \le x_i, x_j \le n,因此 xixj=0x_i - x_j = 0,也就是 xi=xjx_i = x_j,因此当且仅当 i=ji=j 时, xix_i 才和 xjx_j 同余。证毕。

根据引理1和2,我们知道 SS'ϕ(n)\phi(n) 个与 nn 互质的元素组成,且它们两两不同余。也就是说 S=ZnS' = Z_n^*,和 SS 中包含的元素相同(但是顺序可能改变)。

接下来,我们分别将 SSSS' 所有元素相乘,它们应该同余,也就是:

(ax1)(ax2)...(axϕ(n))x1x2...xϕ(n)(modn)(ax_1)(ax_2)...(ax_{\phi(n)}) \equiv x_1x_2...x_{\phi(n)} \pmod{n}

把所有的 aa 提出来,一共 ϕ(n)\phi(n) 个,有:

aϕ(n)x1x2...xϕ(n)x1x2...xϕ(n)(modn)a^{\phi(n)} x_1x_2...x_{\phi(n)} \equiv x_1x_2...x_{\phi(n)} \pmod{n}

X=x1x2...xϕ(n)X = x_1x_2...x_{\phi(n)},有 gcd(X,n)=1\gcd(X,n) = 1,因此原式可以简化成:

aϕ(n)XX(modn)a^{\phi(n)} X \equiv X \pmod{n}

因为 X1X^{-1} 存在,我们在两边同时乘以 X1X^{-1} 并简化,可以得到:

aϕ(n)1(modn)a^{\phi(n)} \equiv 1 \pmod{n}

证毕!

3.1 与费马小定理的关系

我们可以很轻松的利用欧拉定理证明费马小定理。

根据欧拉定理:如果整数 aa 和正整数 nn 互质(即 gcd(a,n)=1\gcd(a,n)=1),那么 aϕ(n)1(modn)a^{\phi(n)} \equiv 1 \pmod{n}

nn 为质数时, ϕ(n)=n1\phi(n)=n-1,代入原式,有 an11(modn)a^{n-1} \equiv 1 \pmod{n}, 等价于 ana(modn)a^{n} \equiv a \pmod{n}。这样,我们就证明了费马小定理,它可以被认为是欧拉定理 nn 为质数时的特殊情况。

3.2 代码实现

你可以在python中验证欧拉定理:

def gcd(a, b):
while b:
a, b = b, a % b
return a

def euler_phi(n):
count = 0
for i in range(1, n + 1):
if gcd(n, i) == 1:
count += 1
return count

def euler_theorem(a, n):
if gcd(a, n) != 1:
raise ValueError("a and n must be coprime for Euler's theorem.")

result = pow(a, euler_phi(n), n)
return result

# 示例
n = 15
print(f"欧拉函数 phi({n}): {euler_phi(n)}")
# 欧拉函数 phi(15): 8

a = 7
result = euler_theorem(a, n)
print(f"欧拉定理: {a}^phi({n}) mod {n} = {result}")
# 欧拉定理: 7^phi(15) mod 15 = 1

4. 总结

这一讲,我们介绍了欧拉定理,以及它和费马小定理的关系。欧拉定理是RSA加密算法的数学基础,非常重要,大家要好好掌握。