Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как ускорить такое вычисление? (p-c^q)mod n - если с и q очень большие 
:(
    Опции темы
31416
Дата 16.4.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



Реализую алгоритм шифрования рабина, приходиться вычислять такую штуку:

(p-c^q) mod n

проблема в том что c и q очень большие (порядка 10 знаков), а p маленькое (пару цифр).
Пока посчитается выражение  (p-c^q)  проходит много времени...
потом быстренько mod выполняеться и все ок.

чувствую что как то можно ускорить это вычисление - убрав вычитание из скобок, т.е сведя это просто к (x^y) mod n
но незнаю как сделать. кто что может подсказать по этому поводу?
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
Akina
Дата 16.4.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 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 секунд
Цитата(31416 @  16.4.2007,  23:44 Найти цитируемый пост)
убрав вычитание из скобок, т.е сведя это просто к (x^y) mod n

(a - b) mod n = ((a mod n) - (b mod n)) mod n
только что тебе это даст? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 16.4.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Akina @  16.4.2007,  22:50 Найти цитируемый пост)
(p-c^q) mod n = (p-(c  mod n)^(q mod n)) mod n

не совсем
(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
PM WWW   Вверх
sergejzr
Дата 16.4.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akina
Дата 17.4.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



maxim1000, да, тут чего-то меня не туда занесло... в ночи плохо соображается.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
31416
Дата 17.4.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



Цитата(Akina @  16.4.2007,  22:50 Найти цитируемый пост)

(a - b) mod n = ((a mod n) - (b mod n)) mod n
только что тебе это даст?  


Есть чуйка такая что выражение a^b mod n
при больших a и b считается на порядок эффективнее чем (p-a^b) mod n
т.к не нужно целиком сначала вычислять выражение в скобках...за счет того и экономия..
но могу ошибаться.... не углублялся.. ))

--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
31416
Дата 18.4.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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, это позволяет избежать возведения в огромную степень всего числа.
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
AndreySUrSU
Дата 22.4.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

Вот и все..считает очень быстро...
Может это неправильный алгоритм, но идея такая))
Просто система возведения в степень - это произведение чисел, являющихся а возведенными в степени двойки...
Скорость работы - логарифм числа б....
Позволяет возводить в очень большие степени...)))
PM MAIL   Вверх
sergejzr
Дата 22.4.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



AndreySUrSU
Цитата(sergejzr @  16.4.2007,  22:57 Найти цитируемый пост)
http://en.wikipedia.org/wiki/Square-and-multiply_algorithm 




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1053 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.