2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

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

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему
 
 Алгоритмы вычисления обратного элемента в поле Zp
Сообщение25.04.2009, 20:28 
Аватара пользователя


27/10/08
222
Рассмотрим поле $\mathbb{Z}_p$. Какие существуют алгоритмы для вычисления обратного элемента к некоторому элементу $x \in \mathbb{Z}_p,\,x \ne 0$? Меня интересуют алгоритмы, которые можно легко реализовать на компьютере. Алгоритм Евклида мне кажется довольно неудобным. Но других алгоритмов я не знаю.

 Профиль  
                  
 
 Re: Алгоритмы вычисления обратного элемента в поле
Сообщение25.04.2009, 20:47 
Заслуженный участник


27/06/08
4058
Волгоград
AndreyXYZ писал(а):
Рассмотрим поле $\mathbb{Z}_p$. Какие существуют алгоритмы для вычисления обратного элемента к некоторому элементу $x \in \mathbb{Z}_p,\,x \ne 0$? Меня интересуют алгоритмы, которые можно легко реализовать на компьютере. Алгоритм Евклида мне кажется довольно неудобным. Но других алгоритмов я не знаю.

Возведение бинарным алгоритмом в степень $p-2$.

 Профиль  
                  
 
 
Сообщение26.04.2009, 06:22 
Заслуженный участник
Аватара пользователя


21/12/05
5908
Новосибирск
AndreyXYZ в сообщении #208153 писал(а):
Алгоритм Евклида мне кажется довольно неудобным.

А чем он неудобен? Фактически это то же самое, что раскладываем $p/x$ в цепную дробь. Тогда числитель предпоследней подходящей дроби с точностью до знака (определяемого чётностью/нечётностью номера) и есть обратный.

Бинарный алгоритм - это как я догадываюсь несколько возведений в квадрат (исходя из двоичного кода числа p-2) с последующим перемножением?

Можно просто тупо вычислять степени $x, x^2, x^3, ... $ по модулю p. Если в этой последовательности встретится $x^k\equiv 1$ при $k<p-1$, то $x^{k-1}$ обратный. В противном случае придётся дойти до $x^{p-2}$, хотя и в этом случае можно минимизировать процесс за счёт пропуска вычислений некоторых степеней, используя делимость $p-1$ на порядок элемента $x$ - но это скорее для хьюмена, чем для компьютера.

 Профиль  
                  
 
 
Сообщение26.04.2009, 08:08 
Заслуженный участник


27/06/08
4058
Волгоград
bot писал(а):
Бинарный алгоритм - это как я догадываюсь несколько возведений в квадрат (исходя из двоичного кода числа p-2) с последующим перемножением?
Угу.
Цитата:
Можно просто тупо вычислять степени $x, x^2, x^3, ... $ по модулю p. Если в этой последовательности встретится $x^k\equiv 1$ при $k<p-1$, то $x^{k-1}$ обратный.

Можно, конечно. Только тогда вместо $O(\log(n ))$ получим сложность $O(n )$. А это не есть хорошо. :)
Например для поиска обратного к $5$ по модулю $1000000007$ бинарным агоритмом потребуется 45 умножений, а тупым возведением - 1000000006.

 Профиль  
                  
 
 
Сообщение26.04.2009, 11:48 


24/03/07
321
Код:
int mod(int a, int m){
    a %= m;
    if (a < 0) a += m;
    return a;
}
int inverse(int a, int m){
    a = mod(a, m);
    if (a == 1) return 1;
    return mod((1 - m * inverse(m % a, a)) / a, m);
}   

 Профиль  
                  
 
 
Сообщение26.04.2009, 20:24 
Аватара пользователя


27/10/08
222
bot в сообщении #208233 писал(а):
Можно просто тупо вычислять степени $x, x^2, x^3, ... $ по модулю p. Если в этой последовательности встретится $x^k\equiv 1$ при $k<p-1$, то $x^{k-1}$ обратный. В противном случае придётся дойти до $x^{p-2}$, хотя и в этом случае можно минимизировать процесс за счёт пропуска вычислений некоторых степеней, используя делимость $p-1$ на порядок элемента $x$ - но это скорее для хьюмена, чем для компьютера.

Обратным элементом всегда будет являться $x^{p-1}$, т.к. $\mathbb{Z}_p\backslash\{0\}$ - циклическая группа порядка $p$, где $p$ - простое.

Добавлено спустя 2 минуты 22 секунды:

Dandan писал(а):
Код:
int mod(int a, int m){
    a %= m;
    if (a < 0) a += m;
    return a;
}
int inverse(int a, int m){
    a = mod(a, m);
    if (a == 1) return 1;
    return mod((1 - m * inverse(m % a, a)) / a, m);
}   


Можете пояснить работу второй функции?

 Профиль  
                  
 
 
Сообщение26.04.2009, 20:24 
Модератор


16/01/07
1567
Северодвинск
AndreyXYZ в сообщении #208452 писал(а):
$\mathbb{Z}_p\backslash\{0\}$ - циклическая группа порядка $p$, где $p$ - простое.


Порядка $p-1$, поэтому $x^{p-2}$.

 Профиль  
                  
 
 
Сообщение27.04.2009, 02:28 


24/03/07
321
AndreyXYZ писал(а):
Можете пояснить работу второй функции?

ну это по сути алгоритм Евклида

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group