Недавно я пытался реализовать модульный показатель степени. Я пишу код на 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}
}
Итак... это хороший алгоритм или, по крайней мере, хорошее место для начала? Википедия на самом деле не обсуждает алгоритмы реализации операции по модулю, и всякий раз, когда я пытаюсь искать в другом месте, я нахожу действительно интересные, но невероятно сложные (и часто не связанные) исследовательские работы и публикации. Если есть очевидный способ реализовать это, которого я не вижу, я был бы очень признателен за отзыв.