![]() |
|
![]() ![]() ![]() |
|
31416 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
Реализую алгоритм шифрования рабина, приходиться вычислять такую штуку:
(p-c^q) mod n проблема в том что c и q очень большие (порядка 10 знаков), а p маленькое (пару цифр). Пока посчитается выражение (p-c^q) проходит много времени... потом быстренько mod выполняеться и все ок. чувствую что как то можно ускорить это вычисление - убрав вычитание из скобок, т.е сведя это просто к (x^y) mod n но незнаю как сделать. кто что может подсказать по этому поводу? --------------------
Мой блог |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
(p-c^q) mod n = (p-(c mod n)^(q mod n)) mod n
Можно также ускорить за счет бинарного разложения (q mod n) и подсчета ((с mod n)^(2^k)) mod n Добавлено через 1 минуту и 37 секунд (a - b) mod n = ((a mod n) - (b mod n)) mod n только что тебе это даст? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
не совсем (c^q) mod n != (c^(q mod n)) mod n пример: (2^5) mod 3 = 32 mod 3 = 2 (2^(5 mod 3)) mod 3 = (2^2) mod 3 = 4 mod 3 = 1 если память меня не подводит, то в случае простого модуля можно брать показатель по модулю (n-1) (или даже, когда НОД(c,n)=1) -------------------- qqq |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
||||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
maxim1000, да, тут чего-то меня не туда занесло... в ночи плохо соображается.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
31416 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
Есть чуйка такая что выражение a^b mod n при больших a и b считается на порядок эффективнее чем (p-a^b) mod n т.к не нужно целиком сначала вычислять выражение в скобках...за счет того и экономия.. но могу ошибаться.... не углублялся.. )) --------------------
Мой блог |
|||
|
||||
31416 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
Заменил по формуле
(a - b) mod n = ((a mod n) - (b mod n)) mod n Собственно как и думал вычисляется теперь все очень быстро) пишу на java - там даже ф-я специфичная есть BigInteger.modPow - возводит в степень и вычисляет mod но это будет намного быстрее чем вычислять просто степень, при огромных числах. т.к a*a*a*...*a mod n = ((((a mod n)*a ) mod n)*a mod n)... т.е мы не даем разростись результату постоянно уменьшая его на каждом шаге операцией mod, это позволяет избежать возведения в огромную степень всего числа. --------------------
Мой блог |
|||
|
||||
AndreySUrSU |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 22.4.2007 Репутация: нет Всего: нет |
Это все очень не эффективно))))
Модуль разности равен разности модулей - это правильно... Но вот возведение в степень по модулю можно сделать очень быстро... Алгоритм примерно следующий.. возводит а в степень б по модулю... типы не важны..сделаешь для себя какой нужен.. int pow(int a, int b, int mod) { int res=1; while (b) { if (b%2) res=(res*a)%mod; b/=2; a=a*a; } return res; } Вот и все..считает очень быстро... Может это неправильный алгоритм, но идея такая)) Просто система возведения в степень - это произведение чисел, являющихся а возведенными в степени двойки... Скорость работы - логарифм числа б.... Позволяет возводить в очень большие степени...))) |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
AndreySUrSU,
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |