Деление с остатком

Материал из testwiki
Перейти к навигации Перейти к поиску

Деление c остатком — арифметическая операция, играющая большую роль в арифметике, теории чисел, алгебре и криптографии. Чаще всего эта операция определяется для целых или натуральных чисел следующим образом[1]. Пусть a и b — целые числа, причём b0. Деление с остатком a («делимого») на b («делитель») означает нахождение таких целых чисел q и r, что выполняется равенство:

a=bq+r

Таким образом, результатами деления с остатком являются два целых числа: q называется неполным частным от деления, а r — остатком от деления. На остаток налагается дополнительное условие: 0r<|b|, то есть остаток от деления должен быть неотрицательным числом и по абсолютной величине меньше делителя. Это условие обеспечивает однозначность результатов деления с остатком для всех целых чисел, то есть существует единственное решение уравнения a=bq+r при заданных выше условиях. Если остаток равен нулю, говорят, что a нацело делится на b.

Нахождение неполного частного также называют целочисленным делением, а нахождение остатка от деления называют взятием остатка или, неформально, делением по модулю (однако последнего термина стоит избегать, так как он может привести к путанице с делением в кольце или группе вычетов по аналогии со сложением или умножением по модулю).

Примеры
  • При делении с остатком положительного числа a=78 на b=33 получаем неполное частное q=2 и остаток r=12.
Проверка: 78=332+12.
  • При делении с остатком отрицательного числа a=78 на b=33 получаем неполное частное q=3 и остаток r=21.
Проверка: 78=33(3)+21.
  • При делении с остатком отрицательного числа a=9 на b=13 получаем неполное частное q=1 и остаток r=4.
Проверка: 9=(13)1+4.
  • При делении с остатком положительного числа a=9 на b=90 получаем неполное частное q=0 и остаток r=9.
Проверка: 9=900+9.
  • При делении с остатком числа a=78 на b=26 получаем неполное частное q=3 и остаток r=0, то есть деление выполняется нацело.

Операция деления с остатком может быть определена не только для целых чисел, но и для других математических объектов (например, для многочленов), см. ниже.

Определение

Оставаясь строго в рамках натуральных чисел, приходится различать деление с остатком и деление нацело, поскольку нулевой остаток не является натуральным числом; кроме того, неполное частное при делении меньшего числа на большее должно равняться нулю, что тоже выводит за рамки натуральных чисел. Все эти искусственные ограничения неоправданно усложняют формулировки, поэтому в источниках обычно либо рассматривается расширенный натуральный ряд, включающий ноль[2], либо теория сразу формулируется для целых чисел, как указано выше[1].

Для вычисления неполного частного от деления a на положительное число b следует разделить (в обычном смысле) a на b и округлить результат до ближайшего целого в меньшую сторону:

q=ab, когда b>0.

где полускобки обозначают взятие целой части. Значение неполного частного q позволяет вычислить значение остатка r по формуле:

r=abq.

Для отрицательного делителя нужно округлять частное в большую сторону:

q=ab, когда b<0.

Операция «mod» и связь со сравнениями

Шаблон:Anchor Величина остатка может быть получена бинарной операцией «взятия остатка» от деления a на b, обозначаемой Шаблон:Math:

r=amodb.

Не следует путать это обозначение с обозначением сравнения по модулю b. Формула для r влечёт выполнение сравнения:

ra(modb),

однако обратная импликация, вообще говоря, неверна. А именно, это сравнение не подразумевает выполнения неравенства 0r<|b|, необходимого для того, чтобы r было остатком.

В программировании

Операция вычисления неполного частного и остатка в различных языках программирования
Язык Неполное
частное
Остаток Знак остатка
ActionScript % Делимое
Ada mod Делитель
rem Делимое
Бейсик \ MOD Не определено
Си (ISO 1990) / % Не определено
Си (ISO 1999) / % Делимое[3]
C++ (ISO 2003) / % Не определено[4]
C++ (ISO 2011) / % Делимое[5]
C# / % Делимое
ColdFusion MOD Делимое
Common Lisp mod Делитель
rem Делимое
D / % Делимое[6]
Delphi div mod Делимое
Eiffel // \\ Делимое
Erlang div rem Делимое
Euphoria remainder Делимое
Microsoft Excel (англ.) Шаблон:Nobr MOD() Делитель
Microsoft Excel (рус.) ЧАСТНОЕ() ОСТАТ()
FileMaker Div() Mod() Делитель
Fortran mod Делимое
modulo Делитель
GML (Game Maker) div mod Делимое
Go / % Делимое
Haskell div mod Делитель
quot rem Делимое
J |~ Делитель
Java / % Делимое[7]
Math.floorDiv Math.floorMod Делитель (1.8+)
JavaScript .toFixed(0) % Делимое
Lua % Делитель
Mathematica Quotient Mod Делитель
MATLAB idivide(?, ?, 'floor') mod Делитель
idivide rem Делимое
MySQL DIV MOD
%
Делимое
Oberon DIV MOD +
Objective Caml mod Не определено
Pascal div mod Делимое[8]
Perl Нет % Делитель
PHP Нет[9] % Делимое
PL/I mod Делитель (ANSI PL/I)
Prolog (ISO 1995) mod Делитель
PureBasic / Mod
%
Делимое
Python // % Делитель
QBasic \ MOD Делимое
R %/% %% Делитель
RPG %REM Делимое
Ruby / % Делитель
Scheme modulo Делитель
SenseTalk modulo Делитель
rem Делимое
Tcl % Делитель
Verilog (2001) % Делимое
VHDL mod Делитель
rem Делимое
Visual Basic \ Mod Делимое

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

Обозначения операции взятия остатка в различных языках программирования представлены в таблице справа. Например, в Паскале операция mod вычисляет остаток от деления, а операция div осуществляет целочисленное деление, при котором остаток от деления отбрасывается:

78 mod 33 = 12
78 div 33 = 2

Знак остатка

Операция взятия остатка в языках программирования может возвращать отрицательный результат (для отрицательного делимого или делителя). Тут есть два варианта:

  • Знак остатка совпадает со знаком делимого: неполное частное округляет к нулю.
  • Знак остатка совпадает со знаком делителя: неполное частное округляет к .

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

  • Есть сумма n копеек, положительная или отрицательная. Перевести её в рубли и копейки: n div 100 и n mod 100. Знак остатка совпадает со знаком делимого.
  • Есть бесконечное клеточное поле, каждая клетка 16×16 пикселей. В какую клетку попадает точка (x, y), и каковы координаты относительно верхнего левого угла клетки? Ответ: x div 16, y div 16 и (x mod 16, y mod 16) соответственно. Знак остатка совпадает со знаком делителя.

Операция div в x86/x64 делит регистровую пару rdx:rax на любой другой регистр или число из памяти[10]. Неполное частное и остаток выходят по первому варианту — округляют к нулю.

Как запрограммировать, если такой операции нет?

Неполное частное можно вычислить через деление и взятие целой части: q=[ab], где [x], в зависимости от задачи, может быть «полом» или усечением. Однако деление здесь получается дробное, которое намного медленнее целого. Такой алгоритм используется в языках, в которых нет целых типов (отдельные электронные таблицы, программируемые калькуляторы и математические программы), а также в скриптовых языках, в которых издержки интерпретации намного превышают издержки дробной арифметики (Perl, PHP).

При отсутствии команды mod остаток программируется как aqb.

Если b положительно, а знак r совпадает со знаком делимого, не определён или неизвестен, для нахождения минимального неотрицательного остатка можно воспользоваться формулой r=(b+(amodb))modb.

Неполное частное и неотрицательный остаток от деления на степень двойки 2n — это битовый сдвиг an (для чисел со знаком — арифметический) и a&(2n1).

Обобщения

Вещественные числа

Если два числа a и b (отличное от нуля) относятся к множеству вещественных чисел, a может быть поделено на b без остатка, и при этом частное также является вещественным числом. Если же частное по условию должно быть целым числом, в этом случае остаток будет вещественным числом, то есть может оказаться дробным.

Формально:

если a,b,b0, то a=bq+r, где 0r<|b|.
Пример

Деление 7,9 на 2,1 с остатком даёт:

7,92,1=3 (неполное частное);
7,932,1=1,6 (остаток).

Гауссовы целые числа

Гауссово число — это комплексное число вида a+bi, где a,b — целые числа. Для них можно определить деление с остатком: любое гауссово число u можно разделить с остатком на любое ненулевое гауссово число v, то есть представить в виде:

u=vq+r,

где частное q и остаток r — гауссовы числа, причём |r|<|v|. Однако, в отличие от целых чисел, остаток от деления определяется неоднозначно. Например, 7+2i можно разделить на 3i тремя способами:

7+2i=(3i)(2+i)+i=(3i)(1+i)+3=(3i)(2+2i)+(12i).

Многочлены

При делении с остатком двух многочленов f(x) и g(x) для однозначности результата вводится условие: степень многочлена-остатка должна быть строго меньше степени делителя:

f(x)=q(x)g(x)+r(x), причём deg(r)<deg(g).
Пример
2x2+4x+5x+1=2x+2 (остаток 3), так как: 2x2+4x+5=(x+1)(2x+2)+3.

См. также

Примечания

Шаблон:Примечания

  1. 1,0 1,1 Шаблон:Книга
  2. Потапов М. К., Александров В. В., Пасиченко П. И. Алгебра и анализ элементарных функций. М.: Наука, 1981, 560 с., С. 9.
  3. ISO/IEC 9899:TC2: When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded. [This is often called «truncation toward zero».]; в списке изменений 1999→TC1 и TC1→TC2 данное изменение не числится.
  4. Шаблон:Citation. «the binary % operator yields the remainder from the division of the first expression by the second. …. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined».
  5. N3242=11-0012 (Working draft), текст совпадает с C99
  6. Шаблон:Cite web
  7. Шаблон:Книга
  8. Стандарт 1973 года: div — division with truncation.
  9. Шаблон:Cite web
  10. Шаблон:Cite web