如果有人迟到,这里有一些更实际的算法(有错误...仔细阅读)
https://eprint.iacr.org/2014/755.pdf
实际上有两种主要的归约公式:Barett 和 Montgomery。来自 eprint 的论文在不同版本(算法 1-3)中重复,并在算法 4 中给出了“改进”版本。
概述
我现在给出4.算法的概述:
1.) 计算“A*B”并将整个乘积存储在“C”中,C 和模 $p$ 是该算法的输入。
2.) 计算 $p$ 的位长,例如:函数“Width(p)”返回的正是那个值。
3.) 将输入 $C$ 拆分为 N 个大小为“Width(p)”的“块”并将每个块存储在 G 中。从 G[0] = lsb(p) 开始,以 G[N-1 结束] = msb(p)。 (论文的描述确实有问题)
4.) 开始 while 循环:
设置 N=N-1(到达最后一个元素)
预计算 $b:=2^{Width(p)} \bmod p$
while N>0 do:
T = G[N]
for(i=0; i<Width(p); i++) do: //Note: that counter doesn't matter, it limits the loop)
T = T << 1 //leftshift by 1 bit
while is_set( bit( T, Width(p) ) ) do // (N+1)-th bit of T is 1
unset( bit( T, Width(p) ) ) // unset the (N+1)-th bit of T (==0)
T += b
endwhile
endfor
G[N-1] += T
while is_set( bit( G[N-1], Width(p) ) ) do
unset( bit( G[N-1], Width(p) ) )
G[N-1] += b
endwhile
N -= 1
endwhile
这确实很多。不是我们只需要递归地减少 G[0]:
while G[0] > p do
G[0] -= p
endwhile
return G[0]// = C mod p
其他三种算法定义明确,但这缺少一些信息或呈现出真正的错误。但它适用于任何尺寸;)