![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
![]()
Необходимо реализовать программу для шифрования и расшифрования сообщений криптосистемой RSA.
Что дано: Сообщение; ключ. Проблема: как вычислить a^d (mod n), если a, d и n - длинные числа (около 500 десятичных цифр). Нужен алгоритм, который вычисляет это за приемлемое время. При этом никакими библиотеками для работы с длинными числами пользоваться нельзя. Я писал раньше программу для работы с длинными числами, и вот что у меня имеется: умножение длинного на короткое, умножение длинного на длинное, деление с остатком длинного на короткое, деление с остатком длинного на длинное, сложение/вычитание длинных чисел. + знаю алгоритм быстрого возведения в степень для чисел базовых типов (напр. Int32). |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
![]()
Кто мешает реализовать быстрое возведение в степень с длинынми числами? Если брать кажый раз по модулю, то не будут получатся числа, больше n. Если 500 цифр, то двоичный логарифм d примерно 1500. Значит всего 1500 итераций. Если десятичных цифр 500, то можно хранить по 9 разрядов под 8байтовым типом - и получится менее 60 цифр. Даже если предположить очень кривую реализацию и 5 операций в каждой итерации (2 умножения, 2 модуля и 1 деление длинного на короткое), то имеем 15 тысяч условных операций в итерации. С учетом пооперанной реализации - примерно 50 тысяч. Если подумать над тем, будет ли польза при таких маленьких числах от Карацубы/Винограда/Штрассена/Фурье, то может даже еще быстрее получится (асимптотика там пониже, только весь выиграш константа перекроет).
В итоге - 75 миллионов операций. Надо быстрее? ![]() |
![]() |
![]() |
![]() |
#3 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
![]()
LeBron,
вот, к примеру, алгоритм для не длинных чисел: Код:
![]() |
![]() |
![]() |
![]() |
#4 | |
Форумчанин
Регистрация: 10.10.2009
Сообщений: 680
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
длинная арифметика | Dimarik | Общие вопросы C/C++ | 1 | 16.09.2009 12:02 |
Длинная арифметика на C#(деление) | Mr_Dark | Общие вопросы .NET | 1 | 21.06.2009 21:57 |
Длинная арифметика: деление | Vadik(R) | Помощь студентам | 1 | 27.03.2009 12:08 |
Длинная арифметика | DmT | Помощь студентам | 2 | 06.10.2007 22:43 |