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