1

最近,我一直在尝试了解二进制扩展欧几里得算法在处理器级别的工作原理。这个问题是关于在具有多项式基础的 GF(2^m) 中找到一个逆元素。

一般来说,我遇到了用于评估逆元素的扩展欧几里得算法,但事实是它涉及太多的加法和乘法运算。二进制 EEA 算法只需要位移操作(相当于除以 2——逻辑右移)。该算法在此链接中,第 8 页

在该算法的第 3 步和第 5 步中,每次迭代都会将参数向右移动 1 位,同时将 MSB 加零ub循环结束时u == 1并返回b。我的问题是处理器(例如 32 位处理器)在每次迭代的第 3 步或第 5 步中执行多少原始操作?

我遇到了桶式移位器,我对移位发生的速度感到非常困惑。我真的应该考虑这些原始操作,还是因为转移可能更快而忽略它们?

如果有人能展示大小u为 194 位的情况的原始操作,那真的会对我有很大帮助。


如果您可能想知道x算法第 3 步和第 5 步中的分母,它是多项式表示,x仅表示10二进制,参数u是 N 位二进制数。

4

2 回答 2

2

这个问题没有通用的答案:您可以使用可移植的代码来优化,或者使用高度机器特定的代码,在不破坏的情况下进行更复杂的优化。

如果你想要真正的性能,你必须在你能得到的最大宽度上使用 MMX/AVX 寄存器。英特尔在低级指令上提供轻量级包装器,如宏和内联函数。

始终使用无符号类型进行移位操作,以避免不必要的步骤。

于 2015-05-09T15:50:46.137 回答
0

通常有一个“右移”汇编操作码,它能够将寄存器右移给定位数。这样的操作需要一个周期。

但是,这假设您的值已经加载到寄存器中。

无论如何,最好的答案是:用低级语言(C、C++)实现这个算法,并查看编译器生成的汇编代码。

于 2015-05-09T15:11:19.327 回答