n(2+2*n)
如果所有中间单精度乘法操作数和结果都在寄存器中可用,那么多精度蒙哥马利乘法的周期数确实是这样。对于加密操作,这几乎是不可能的,因为m
通常是 1024 或更大。假设 32 位寄存器 (x y R^-1 mod m) 只需要 192 个寄存器来存储操作数 (3*(1024/32))。实际上,您需要考虑内存访问才能回答这个问题。
使用内存访问重写算法(假设乘法可以与加载/存储并行完成):
- 对于
i
从 0 到 n:a_i <- 0
- 对于
i
从 0 到 (n − 1),请执行以下操作:
- 拿来
a_0
- 拿来
y_0
- 拿来
x_i
- 计算
u_i <- (a_0 + x_i*y_0)m' mod b
。存储u_i
在寄存器中
c = 0
(计算A <- (A + x_i*y + u_i*m)/b
)
- 对于
j
从 0 到 (n-1):
- 拿来
a_j
- 拿来
y_j
- 计算
(cv) = a_j + x_i*y_j + c
,获取m_j
- 计算
(cv) = (cv) + u_i*m_j
,如果 j>0 存储a_{j-1} <- v
- 存储
a_n <- c
和a_{n-1} <- v
- 如果
A >= m
那么A <- A − m
.
- 返回(A)。
希望这可以帮助。