Алгоритм умножения Монтгомери на Python

Я пытаюсь Алгоритм умножения Монтгомери на Python 3.x. Этот алгоритм псевдокода приведен ниже:

Input: Modulus N(n bit), gcd(n, 2) = 1, Multipler: A (n bit), Multiplicant: B (n bit)
Output: R = (A x B x 2 ^ (-n)) mod N

R = 0

for (i = 0; i < n; i++)
{
    q = (R + A(i) * B) mod 2
    R = (R + A(i) * B + q * N) / 2
}

print(R)

Код Python 3.x, который был написан, приведен ниже:

#!/usr/bin/python3

N = 41

A = 13

B = 17

n = N.bit_length()

R = 0

for i in range(0, n):
    q = int(R + (A & (1 << i) != 0) * B) % 2
    R = int((R + (A & (1 << i) != 0) * B + q * N) / 2)

print("Result:", R % N)

Но код не дает правильного результата. В чем проблема?

Спасибо за ответы.

1 ответ

Когда я запускаю ваш (модифицированный) код, я получаю 31, и 31 кажется правильным ответом.

Согласно вашему псевдокоду, R должно быть

R = (A x B x 2 ^ (-n)) mod N

В вашем случае это

R = (13*17*2^(-6))%41

Интерпретация 2^(-6) когда вы работаете с модом 41, нужно поднять мультипликативное обратное значение мод 41 от 2 до степени 6, а затем взять результат мод 41. Другими словами, 2^-6 = (2^-1)^6,

Поскольку 2*21 = 42 = 1 (мод 41), 2^(-1) = 21 (мод 41). Таким образом:

R = (13*17*2^-6) (mod 41)
  = (13*17*(2^-1)^6) (mod 41)
  = (13*14*21^6) (mod 41) 
  = 18954312741 (mod 41)
  = 31

который показывает, что результатом является 31, число, возвращаемое вашим кодом. Таким образом, ваш код правильный. Если между результатом и ожиданием есть конфликт, возможно, в этом случае проблема заключается в ожидании.

Другие вопросы по тегам