Мне нужно было дать более полный ответ.
Как вы говорите, математически имеет смысл (хотя вам не нужно быть математиком, чтобы понять это), но позвольте мне кое-что прояснить.Когда я сказал, что вы заинтересованы в остатке, что правда, можно ошибочно думать, что остатки для положительных (a mod n
) или отрицательных (-a mod n
) чисел совпадают, потому что можно наивно сбросить знак и нестина деление в отрицательном случае.Конечно, теперь вы знаете, что это не правильно.Вы можете думать об этом следующим образом: при вычислении a mod n
сначала вы узнаете, какое число n*x
(где x - целое число) ближе всего к a
, не превышая a
.После этого вы посчитаете, сколько чисел существует между n*x
и a
.Здесь может помочь пример:
Предположим, вы хотите -282 mod 10
, тогда 10 * -29 = -290 будет ближайшим к -282, не переходя его.И тогда вы просто посчитаете, сколько чисел находится между n*x
и a
(то есть между 290 и 282).Всего 8 цифр, и это ваш ответ, который правильный .С другой стороны, для положительных чисел (282 mod 10) ближайшее число к 282 будет 10 * 28 = 280 (помните, что мы не хотим переходить через 282).Следовательно, между ними есть 2 числа (также правильно ).
Что касается приложений, я не уверен, что одно приложение полагается, в частности, на вычисление по модулю отрицательных чисел, но в целомПоле Модульная арифметика предоставляет множество приложений.Посмотрите ссылку на Википедию выше, чтобы немного узнать о них.Если бы не математическая согласованность наличия операций по модулю отрицательных чисел, возможно, мы бы получили менее общие теоремы, что, в свою очередь, означает менее мощные приложения.
Относительно вашего программирования woes:
Когда a или n отрицательны, это наивное определение не работает, и языки программирования различаются по тому, как эти значения определены.Хотя обычно они выполняются с целыми числами a и n, многие вычислительные системы допускают другие типы числовых операндов.
См. Также this .