最近、モジュラー指数関数を実装しようとしています。私は 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}
}
それで...これは良いアルゴリズムですか、それとも少なくとも始めるのに良い場所ですか? ウィキペディアではモジュロ演算を実装するためのアルゴリズムについてはあまり議論されていません。他の場所を検索しようとすると、非常に興味深いが信じられないほど複雑な (そして多くの場合無関係な) 研究論文や出版物を見つけることができます。私が見ていないこれを実装する明白な方法がある場合は、フィードバックをいただければ幸いです。