Канонический ответ на этот вопрос - «использовать расширенный алгоритм евклидова», однако он использует операции деления и умножения, которые являются болью для реализации очень больших чисел на ПЛИС. Я хотел бы использовать его в генерации ключей RSA.Как найти модульный мультипликативный инверсный номер без использования деления для fpga?
ответ
Я рекомендую binary euclidean algorithm
заменяет деление арифметических сдвигов, сравнение и вычитание
Удлиненных двоичный НОД, аналогично расширенным алгоритм Евклида, задается Кнутом вместе с указателями на другой версии.
Я нашел реализацию Python бинарного расширенный алгоритм Евклида here:
def strip_powers_of_two(c, p, q, gamma, delta):
c = c/2
if (p % 2 == 0) and (q % 2 == 0):
p, q = p//2, q//2
else:
p, q = (p + delta)//2, (q - gamma)//2
return c, p, q
def ext_bin_gcd(a,b):
u, v, s, t, r = 1, 0, 0, 1, 0
while (a % 2 == 0) and (b % 2 == 0):
a, b, r = a//2, b//2, r+1
alpha, beta = a, b
while (a % 2 == 0):
a, u, v = strip_powers_of_two(a, u, v, alpha, beta)
while a != b:
if (b % 2 == 0):
b, s, t = strip_powers_of_two(b, s, t, alpha, beta)
elif b < a:
a, b, u, v, s, t = b, a, s, t, u, v
else:
b, s, t = b - a, s - u, t - v
return (2 ** r) * a, s, t
Предоставлено n
, пусть Φ(n)
будет числом целых чисел менее n
и относительно простым с ним.
От https://en.wikipedia.org/wiki/Euler%27s_theorem, если m
взаимно простое с n
то m^(Φ(n)-1)
мультипликативная инверсия m
. Это можно вычислить с помощью умножения O(log(n))
.
Существует одна проблема с этим решением. Он требует вычисления 'm^(phi (n) -1)' modulo MOD, так что он включает в себя поиск остатка и использование деления. – kraskevich
Хороший ответ для прецедента - обычно применяется только для постоянных модулей, где вы можете прекомпопировать Φ (n), но поскольку это для генерации ключей RSA, Φ (n) можно легко вычислить из коэффициентов n, которые являются известен. –
@kraskevich Вы правы. – btilly
- 1. мультипликативный инверсный?
- 2. найти модульный мультипликативный обратный
- 3. Модульный инверсный в Haskell
- 4. Как рассчитать модульный мультипликативный обратный номер в контексте шифрования RSA?
- 5. Мультипликативный обратный рациональный номер
- 6. Модульный инверсный с C# не работает как ожидалось
- 7. Как сделать модульный сайт без использования php?
- 8. реляционная алгебра, без использования оператора деления
- 9. Целочисленного деления без использования/или * оператора
- 10. Схват цифр числа без использования деления или модуля
- 11. как написать функцию для реализации алгоритма целочисленного деления без использования оператора деления в php
- 12. Как отправить номер фиксированной точки FPGA
- 13. Как разделить два целых числа без использования оператора деления?
- 14. Начало elisp Как написать раздел без фактического использования деления знак
- 15. System.identityHashCode инверсный?
- 16. найти номер в другом номере без использования Array
- 17. Быстрая средняя без деления
- 18. Как рассчитать наклон линии, знающей две точки без использования деления?
- 19. номер Разделить без оператора деления с использованием рубина
- 20. Java: Как найти, если Integer является кратным 2 без использования деления или по модулю оператора
- 21. Инверсный двоичный формат индекса
- 22. Поиск простых чисел без использования модуля, деления или умножения
- 23. Умножение без использования времени или символа деления в python
- 24. Обобщенный инверсный в R
- 25. деление числа без использования оператора деления в c
- 26. fpga: выбор C++ для программирования fpga
- 27. Как сгенерировать мультипликативный вектор пространства в Matlab?
- 28. Число цифр без использования строк или деления на 10
- 29. FPGA: Предупреждение о часах без пользователя
- 30. Разделите на 9 без использования оператора деления или умножения
Вы уверены, что там _is_ менее болезненным способом? Ожидается, что генерация ключа RSA будет дорогостоящей. – duskwuff
Вы также можете изучить модульное умножение Монтгомери. –
Я думаю, я не могу использовать его, поскольку модуль должен быть нечетным и. –