素数的定义
素数(Prime Number)是大于 1 的自然数,除了 1 和它本身外没有其他正因数。前几个素数是:2, 3, 5, 7, 11, 13, 17, 19, 23, ...
大于 1 的非素数自然数称为合数(Composite Number)。
素数的基本性质
- 算术基本定理:任何大于 1 的整数都可以唯一地分解为素数的乘积。如 60 = 2² × 3 × 5。
- 素数无穷多:欧几里得证明了素数有无穷多个。
- 素数定理:不超过 n 的素数个数 π(n) ≈ n / ln(n)。这意味着随机选一个 n 位数,它是素数的概率约为 1/ln(n)。
素数在密码学中的作用
素数是公钥密码学的基石:
- RSA:安全性基于大素数 p、q 的乘积 n = p × q 难以分解。实际使用中 p、q 通常为 1024 位或更大。
- Diffie-Hellman:使用大素数 p 和原根 g。
- 椭圆曲线:曲线定义在素数域 GF(p) 上。
素性测试
判断一个大数是否为素数是密码学的关键操作:
- 试除法:逐一试除到 √n,仅适用于小数。
- Fermat 测试:若 n 为素数,则对所有 1 < a < n,有 an-1 ≡ 1 (mod n)。不满足则必为合数,但满足不一定为素数(Carmichael 数)。
- Miller-Rabin 测试:Fermat 测试的改进,是目前最常用的概率性素性测试。重复 k 次可将错误概率降到 4-k。
- AKS 算法:2002 年提出的确定性多项式时间素性测试,但实际效率不如 Miller-Rabin。
最大公约数(GCD)
最大公约数 gcd(a, b) 是同时整除 a 和 b 的最大正整数。
若 gcd(a, b) = 1,则称 a 和 b 互素(Coprime)。
欧几里得算法
基于性质 gcd(a, b) = gcd(b, a mod b),递归计算直到 b = 0。
function gcd(a, b):
while b ≠ 0:
(a, b) = (b, a mod b)
return a
例如:gcd(48, 18) → gcd(18, 12) → gcd(12, 6) → gcd(6, 0) = 6。
扩展欧几里得算法
在计算 gcd(a, b) 的同时,求出整数 x, y 使得:
a × x + b × y = gcd(a, b)
密码学应用:当 gcd(a, b) = 1 时,求出的 x 就是 a 在模 b 下的模逆元。这是 RSA 中计算私钥 d = e-1 mod φ(n) 的关键算法。
function extended_gcd(a, b):
if b == 0: return (a, 1, 0)
(g, x1, y1) = extended_gcd(b, a mod b)
return (g, y1, x1 - (a // b) * y1)
Bézout 定理
对任意整数 a 和 b,存在整数 x 和 y 使得 ax + by = gcd(a, b)。扩展欧几里得算法就是构造性地证明并求出这组 (x, y)。