现代计算机通常只能直接处理固定长度的整数(如32位或64位),但在密码学等领域,我们经常需要处理2048位甚至更大的整数。这就是多精度计算(Multiple Precision Arithmetic)的核心任务。
多精度数的本质是将一个大整数拆分为多个"小块"存储。以十进制为例,数字1234可以表示为:
1×10³ + 2×10² + 3×10¹ + 4×10⁰
类似地,在计算机中我们选择基数M(通常取2³²或2⁶⁴),将大整数表示为:
a = a₀ + a₁M + a₂M² + ... + aₙ₋₁Mⁿ⁻¹
其中每个aᵢ都满足0 ≤ aᵢ < M。例如当M=1000时,数字123456789可以表示为:
实际编程中,M的选择要考虑CPU架构。32位机器通常取M=2³²,64位机器取M=2⁶⁴,这样每个"小块"刚好对应一个寄存器大小。
python复制def multi_precision_add(a, b, M):
carry = 0
result = []
for i in range(max(len(a), len(b))):
ai = a[i] if i < len(a) else 0
bi = b[i] if i < len(b) else 0
sum_val = ai + bi + carry
result.append(sum_val % M)
carry = sum_val // M
if carry > 0:
result.append(carry)
return result
时间复杂度为O(n),其中n是数字的"块"数。
多精度乘法有多种优化方法:
计算gᵉ mod m的高效方法:
python复制def fast_pow(g, e, m):
result = 1
while e > 0:
if e % 2 == 1:
result = (result * g) % m
g = (g * g) % m
e = e // 2
return result
这个算法通过二进制分解指数,将时间复杂度从O(e)降低到O(log e)。例如计算3¹³ mod 100:
求gcd(a,b)的基本算法:
python复制def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
时间复杂度为O(log min(a,b))。例如gcd(48,18):
不仅能计算gcd,还能找到系数u,v使得au + bv = gcd(a,b):
python复制def extended_gcd(a, b):
old_r, r = a, b
old_s, s = 1, 0
old_t, t = 0, 1
while r != 0:
quotient = old_r // r
old_r, r = r, old_r - quotient * r
old_s, s = s, old_s - quotient * s
old_t, t = t, old_t - quotient * t
return old_r, old_s, old_t
应用示例:求7在模26下的逆元:
Legendre符号(a/p)定义:
计算Legendre符号的Euler准则:
(a/p) ≡ a^((p-1)/2) mod p
通用平方根算法步骤:
示例:求x²≡10 mod 13
最有效的特征多项式计算方法:
python复制def hessenberg_char_poly(A):
n = len(A)
# 转换为Hessenberg形式(省略实现)
p = [1] # p0 = 1
for k in range(1, n+1):
# 计算pk
pass
return p
时间复杂度O(n³),比直接计算行列式O(n!)高效得多。
在群G中,元素g的阶是最小的正整数k使得gᵏ=e。对于乘法群(Z/nZ)*,计算方法:
使用分割攻击策略:
示例:在(Z/19Z)*中求3的阶:
python复制# Python中使用GMP的示例
import gmpy2
a = gmpy2.mpz(123456789)
b = gmpy2.powmod(a, 1000, 12345) # 高效模幂运算
在实际密码实现中,要特别注意时序攻击防护。关键操作(如模幂)应采用恒定时间实现。