2014 dxdy logo

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

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


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


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

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

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

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

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



Начать новую тему Ответить на тему
 
 mod для отрицательного числа
Сообщение08.03.2010, 12:12 


08/03/10
2
День добрый. Подскажите, как правильно считать подобные примеры:
-1284 mod 17
Если верить примеру из учебника (Элементы абстрактной и компьютерной алгебры), то ответ будет 8, а если калькулятору Windows в режиме программиста, то ответ -9

-50 mod 11 = 5 (учебник)
-50 mod 11 = -6 (калькулятор)

P.S.: Если имеет значение, то мне это нужно для освоения алгоритма перемножения 2-х чисел

-- Пн мар 08, 2010 14:32:59 --

Кажется нашел нужный мне алгоритм :)
Если надо найти zz mod pp , где zz<0 и zz mod pp <>0, то идем по такому алгоритму
Код:
pp - (ABS(zz) - pp * (ABS(zz) div pp)) mod pp

 Профиль  
                  
 
 Re: mod для отрицательного числа
Сообщение08.03.2010, 12:47 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Kylibin в сообщении #295820 писал(а):
День добрый. Подскажите, как правильно считать подобные примеры:
-1284 mod 17
Если верить примеру из учебника (Элементы абстрактной и компьютерной алгебры), то ответ будет 8, а если калькулятору Windows в режиме программиста, то ответ -9

-50 mod 11 = 5 (учебник)
-50 mod 11 = -6 (калькулятор)

Это, в общем-то, одно и то же. Просто нужно договориться, какому множеству должен принадлежать остаток.
В математике чаще всего $m\pmod{n}$ берётся из множества $\{0,1,2,\ldots,n-1\}$, но могут быть варианты (например, часто используется наименьший по модулю остаток).
Процессор компьютера при целочисленном делении, как правило, даёт неотрицательный остаток при неотрицательном $m$ и неположительный - при неположительном.

Kylibin в сообщении #295820 писал(а):
Кажется нашел нужный мне алгоритм :)
Если надо найти zz mod pp , где zz<0 и zz mod pp <>0, то идем по такому алгоритму
Код:
pp - (ABS(zz) - pp * (ABS(zz) div pp)) mod pp

Сложно. Мне кажется, будет быстрее, если вычислить zz Mod pp, и если получится отрицательная величина, прибавить pp. Впрочем, надо смотреть, что там компилятор сделает из этого алгоритма.

 Профиль  
                  
 
 Re: mod для отрицательного числа
Сообщение08.03.2010, 13:01 


08/03/10
2
Someone в сообщении #295825 писал(а):
Сложно. Мне кажется, будет быстрее, если вычислить zz Mod pp, и если получится отрицательная величина, прибавить pp. Впрочем, надо смотреть, что там компилятор сделает из этого алгоритма.

Проверил zz mod pp + pp . Ответ устраивает :)

за пояснение выше отдельное спасибо!

 Профиль  
                  
 
 Re: mod для отрицательного числа
Сообщение08.03.2010, 13:55 


02/07/08
322
И будьте осторожны: в некоторых языках программирования, включая C и C++, взятие остатка отрицательного числа по модулю неверно реализовано: (-n) mod k = -(n mod k), что неправильно. В таких случаях нужно самостоятельно разбирать случаи.

 Профиль  
                  
 
 Re: mod для отрицательного числа
Сообщение08.03.2010, 14:22 
Заслуженный участник


11/05/08
32166
Cave в сообщении #295847 писал(а):
И будьте осторожны: в некоторых языках программирования, включая C и C++, взятие остатка отрицательного числа по модулю неверно реализовано: (-n) mod k = -(n mod k), что неправильно.

Остаток -- это остаток от деления "нацело", т.е.: $r=m\mod n\quad\Leftrightarrow\quad m=n\cdot z+r$, где $z$ -- это округлённое значение ${m\over n}$ и $|r|<n$. Вопрос только в том, что понимать под округлением; тут, в принципе, возможны самые разные варианты. Чтобы получить правильную арифметику вычетов на всём множестве целых чисел (с только неотрицательными остатками), округлять надо всегда влево. Ну а в трансляторах (а может, даже и в самом процессоре -- не помню) зашито другое правило округления -- в сторону нуля, вот и всё.

------------------------------------------
Во, проверил. Действительно, такое правило зашито в сам процессор. Тестовый пример:

Используется синтаксис Pascal
  j:=-17;
  k:=6;
 
  asm
    mov  dx,$FFFF
    mov  ax,j
    idiv k
    mov  n,ax
    mov  m,dx
  end;

  writeln(i:5, k:5, n:7, m:5);

Выдаёт в качестве остатка от деления (-17) на 6 число (-5).

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

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



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

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


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

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