我最近一直在尝试实现一个模块化指数器。我正在用 VHDL 编写代码,但我正在寻找更具算法性质的建议。模指数器的主要组件是模乘法器,我也必须自己实现它。我对乘法算法没有任何问题——它只是加法和移位,我已经很好地弄清楚了所有变量的含义,这样我就可以在相当合理的时间内进行乘法运算。
我遇到的问题是在乘法器中实现模运算。我知道执行重复减法会起作用,但它也会很慢。我发现我可以移动模数以有效地减去模数的大倍数,但我认为可能还有更好的方法来做到这一点。我正在使用的算法是这样的(奇怪的伪代码如下):
result,modulus : integer (n bits) (previously defined)
shiftcount : integer (initialized to zero)
while( (modulus<result) and (modulus(n-1) != 1) ){
modulus = modulus << 1
shiftcount++
}
for(i=shiftcount;i>=0;i--){
if(modulus<result){result = result-modulus}
if(i!=0){modulus = modulus >> 1}
}
那么......这是一个好的算法,或者至少是一个好的起点?维基百科并没有真正讨论实现模运算的算法,每当我尝试在其他地方搜索时,我都会发现非常有趣但非常复杂(而且通常不相关)的研究论文和出版物。如果有一种我看不到的明显方法来实现这一点,我真的很感激一些反馈。