Я пытаюсь реализовать некоторый математический код Монтгомери для назначения шифрования; У меня большая часть работает, за исключением шага, на котором мне нужно сравнить каждый отдельный бит в BigInteger с One.
Математический алгоритм, который я использовал, начиная с шага 4,
for i = k - 1 down to 0 do
xBar = MonPro(xBar, xBar)
if e[i] = 1 then xBar = MonPro(MBar, xBar)
i — это просто индекс, k — количество битов в BIgInteger, а b — показатель степени. Моя попытка:
for(int i = n.bitLength() - 1; i > 0 ; i--) {
xBar = monPro(xBar, xBar, r, nPrime, n);
if (n.testBit(i) == true)
xBar = monPro(mBar, xBar, r, nPrime, n);
}
return monPro(xBar, BigINteger.ONE, r, nPrime, n);
monPro — это вспомогательная функция, которая определенно работает. Точно так же шаги, пропущенные перед этим фрагментом кода, определенно работают. Итак, главный вопрос заключается в том, как мне побитово перебирать BigInteger? Если я не ошибаюсь насчет e[i], см. ниже.
За последнее время я много читал об этом, и ресурсов мало, что касается реальных реализаций. Некоторые математические статьи, опубликованные на эту тему, носят чисто загадочный характер.
Я также не уверен, что это e [i] выше. В книге это e с маленькой буквой i под ней, точно так же, как Log2 обычно имеет 2, написанную как небольшое число под ней. Кто-нибудь может прояснить?
Я попытался привести BigInteger к строке с основанием 2, создать массив символов и выполнить сравнение с 1 на нем. Я также попробовал просто BigInteger.toString(2), чтобы создать строку с основанием 2 и прокрутить ее, используя charAt[i] == 1.
Я уверен, что все шаги выше e[i] верны, потому что я проверил их с большим количеством различных значений.
Если я не в курсе аспекта E [i], может ли кто-нибудь объяснить, что это на самом деле означает? И если нет, может ли кто-нибудь указать на какие-либо ошибки или небольшое направление?
Это домашнее задание, поэтому не указывайте код, кроме фрагментов.
Любое направление или совет будут очень признательны.
for
. Может быть, потому что он был сделан для этой цели. 02.11.2012for (i=N; i-->0;)
очень распространенная идиома в C и Java, но, судя по комментариям, многие люди не знакомы с ней. Так что поменяю на>=
версию. 02.11.2012