Модуль
В вычислениях операция по модулю возвращает остаток или знаковый остаток от деления после того, как одно число делится на другое (называемое модулем операции).
два положительных числа и n , модуль n , ( часто сокращенно mod . n ) является остатком евклидова деления на a n a , где a — делимое а n — делитель Учитывая [1]
Например, выражение «5 по модулю 2» оценивается как 1, поскольку 5, разделенное на 2, имеет частное 2 и остаток 1, а выражение «9 по модулю 3» будет равно 0, поскольку 9, разделенное на 3, имеет частное 3 и остаток 0.
Хотя обычно a и n являются целыми числами , многие вычислительные системы теперь допускают другие типы числовых операндов. Диапазон значений для целочисленной операции по модулю n составляет от 0 до n - 1 ( модуль 1 всегда равен 0; мод 0 не определен, поскольку представляет собой деление на ноль ).
Когда ровно одно из a или n отрицательно, базовое определение нарушается, и языки программирования различаются в том, как определяются эти значения.
Варианты определения [ править ]
В математике результатом операции по модулю является класс эквивалентности , и любой член класса может быть выбран в качестве представителя ; однако обычным представителем является наименьший положительный остаток , наименьшее неотрицательное целое число, принадлежащее этому классу (т. е. остаток евклидова деления ). [2] Однако возможны и другие соглашения. Компьютеры и калькуляторы имеют различные способы хранения и представления чисел; таким образом, их определение операции по модулю зависит от языка программирования или базового оборудования .
Почти во всех вычислительных системах частное q и остаток r от деления на n удовлетворяют следующим условиям:
( 1 ) |
Это по-прежнему оставляет неоднозначность знака, если остаток не равен нулю: возможны два варианта выбора остатка: один отрицательный, а другой положительный; этот выбор определяет, какое из двух последовательных частных необходимо использовать для удовлетворения уравнения (1). В теории чисел всегда выбирается положительный остаток, но в вычислительной технике языки программирования выбирают в зависимости от языка и знаков a или n . [а] Стандартный Паскаль и АЛГОЛ 68 , например, дают положительный остаток (или 0) даже для отрицательных делителей, а некоторые языки программирования, такие как C90, оставляют его на усмотрение реализации, когда любое из n или a отрицательно (см. таблицу под § в языках программирования Подробности ). модуль 0 не определен в большинстве систем, хотя некоторые определяют его как .
Частное ( q ) и остаток ( r ) как функция делимого ( a ), используя усеченное деление Во многих реализациях используется усеченное деление , для которого частное определяется выражением
где — это целая часть функции ( округление в сторону нуля ), т.е. усечение до нуля значащих цифр. Таким образом, согласно уравнению ( 1 ), остаток имеет тот же знак, что и делимое a, поэтому может принимать значение 2| п | − 1 значение:
Частное и остаток с использованием напольного деления Дональд Кнут [3] способствует напольному делению , для которого частное определяется выражением
где ⌊⌋ — функция пола ( округление вниз ). Таким образом, согласно уравнению ( 1 ), остаток имеет тот же знак, что и делитель n :
Частное и остаток с использованием евклидова деления Раймонд Т. Бут [4] продвигает евклидово деление , для которого частное определяется выражением
где sn — знаковая функция , ⌊⌋ — функция пола ( округление вниз ), а ⌈⌉ — функция потолка ( округление вверх ). Таким образом, согласно уравнению ( 1 ), остаток неотрицательен :
Частное и остаток с использованием округленного деления Common Lisp и IEEE 754 используют округленное деление , для которого частное определяется выражением
где round — функция округления ( округление половины до четного ). Таким образом, согласно уравнению ( 1 ), остаток попадает между и , а его знак зависит от того, в какую сторону от нуля он попадает в эти границы:
Частное и остаток с использованием потолочного деления Common Lisp также использует потолочное деление , для которого частное определяется выражением
где ⌈⌉ — функция потолка ( округление в большую сторону ). Таким образом, согласно уравнению ( 1 ), остаток имеет знак, противоположный знаку делителя :
Если и делимое, и делитель положительны, то усеченное, минимальное и евклидово определения совпадают. Если делимое положительно, а делитель отрицателен, то усеченное и евклидово определения согласуются. Если делимое отрицательно, а делитель положителен, то определения пола и Евклида согласуются. Если и делимое, и делитель отрицательны, то усеченное и минимальное определения совпадают.
Как описывает Лейен,
Баут утверждает, что евклидово деление превосходит другие с точки зрения регулярности и полезных математических свойств, хотя напольное деление, предложенное Кнутом, также является хорошим определением. Несмотря на широкое использование, усеченное деление уступает другим определениям.
— Даан Лейен, «Деление и модуль для компьютерщиков» [5]
Однако усеченное деление удовлетворяет тождеству . [6]
Обозначения [ править ]
В некоторых калькуляторах есть функциональная кнопка mod() , и во многих языках программирования есть аналогичная функция, выраженная как mod( a , n ) , например, . Некоторые из них также поддерживают выражения, которые используют «%», «mod» или «Mod» в качестве оператора по модулю или остатку , например: a % n
или a mod n
.
Для сред, в которых отсутствует подобная функция, можно использовать любое из трех приведенных выше определений.
Распространенные ошибки [ править ]
Когда результат операции по модулю имеет знак делимого (усеченное определение), это может привести к неожиданным ошибкам.
Например, чтобы проверить, является ли целое число нечетным , можно проверить, равен ли остаток от 2 1:
bool is_odd(int n) {
return n % 2 == 1;
}
Но в языке, где по модулю есть знак делимого, это неверно, потому что, когда n (делимое) отрицательное и нечетное, n mod 2 возвращает −1, а функция возвращает false.
Одна правильная альтернатива — проверить, что остаток не равен 0 (поскольку остаток 0 один и тот же независимо от знаков):
bool is_odd(int n) {
return n % 2 != 0;
}
Другая альтернатива — использовать тот факт, что для любого нечетного числа остаток может быть либо 1, либо −1:
bool is_odd(int n) {
return n % 2 == 1 || n % 2 == -1;
}
Более простая альтернатива — рассматривать результат n % 2 как логическое значение, где любое ненулевое значение является истинным:
bool is_odd(int n) {
return n % 2;
}
Проблемы с производительностью [ править ]
Операции по модулю могут быть реализованы таким образом, чтобы каждый раз вычислялось деление с остатком. Для особых случаев на некотором оборудовании существуют более быстрые альтернативы. Например, модуль степени 2 можно альтернативно выразить как побитовую операцию И (при условии, что x является положительным целым числом или с использованием определения без усечения):
x % 2n == x & (2n - 1)
Примеры:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
В устройствах и программном обеспечении, которые реализуют побитовые операции более эффективно, чем по модулю, эти альтернативные формы могут привести к более быстрым вычислениям. [7]
Оптимизация компилятора может распознавать выражения вида expression % constant
где constant
является степенью двойки и автоматически реализует их как expression & (constant-1)
, что позволяет программисту писать более понятный код без ущерба для производительности. Эта простая оптимизация невозможна для языков, в которых результат операции по модулю имеет знак делимого (включая C ), если только делимое не имеет без знака целочисленного типа . Это связано с тем, что, если дивиденд отрицательный, модуль будет отрицательным, тогда как expression & (constant-1)
всегда будет положительным. Для этих языков эквивалентность x % 2n == x < 0 ? x | ~(2n - 1) : x & (2n - 1)
Вместо этого необходимо использовать, выраженное с помощью побитовых операций ИЛИ, НЕ и И.
Оптимизация для общих операций с постоянным модулем также существует путем сначала вычисления деления с использованием оптимизации постоянного делителя .
Свойства (личности) [ править ]
Некоторые операции по модулю можно факторизовать или расширять аналогично другим математическим операциям. Это может быть полезно при доказательствах криптографии , таких как обмен ключами Диффи-Хеллмана . Свойства, включающие умножение, деление и возведение в степень, обычно требуют, чтобы a и n были целыми числами.
- Личность:
- ( мод п ) п = мод п мод .
- н х mod n = 0 для всех положительных целых значений x .
- Если p — простое число не являющееся делителем b , , то ab р -1 mod p = a mod p по малой теореме Ферма .
- Обратный:
- [(− a mod n ) + ( a mod n )] mod n знак равно 0 .
- б −1 mod n обозначает модульную мультипликативную обратную величину , которая определяется тогда и только тогда, когда b и n , взаимно просты что имеет место, когда определена левая часть: [( b −1 mod n )( b mod n )] mod n знак равно 1 .
- Дистрибутив:
- ( a + b ) mod n = [( a mod n ) + ( b mod n )] mod n .
- ab mod n = [( a mod n )( b mod n )] mod n .
- Подразделение (определение): a / b mod n = [( a mod n )( b −1 mod n )] mod n , когда правая часть определена (то есть, когда b и n взаимно просты ), и неопределена в противном случае.
- Обратное умножение: [( ab mod n )( b −1 мод n )] n = мод n . mod
В языках программирования [ править ]
Язык | Оператор | Целое число | Плавающая точка | Определение |
---|---|---|---|---|
АБАП | MOD
|
Да | Да | евклидов |
ActionScript | %
|
Да | Нет | Усечено |
Есть | mod
|
Да | Нет | Напольный [8] |
rem
|
Да | Нет | Усечено [8] | |
АЛГОЛ 68 | ÷× , mod
|
Да | Нет | евклидов |
AMPL | mod
|
Да | Нет | Усечено |
АПЛ | | [б]
|
Да | Да | Напольный |
AppleScript | mod
|
Да | Нет | Усечено |
АвтоЛИСП | (rem d n)
|
Да | Нет | Усечено |
АВК | %
|
Да | Нет | Усечено |
бить | %
|
Да | Нет | Усечено |
БАЗОВЫЙ | Mod
|
Да | Нет | Зависит от реализации |
до нашей эры | %
|
Да | Нет | Усечено |
С С++ |
% , div
|
Да | Нет | Усечено [с] |
fmod (С) std::fmod (С++)
|
Нет | Да | Усечено [11] | |
remainder (С) std::remainder (С++)
|
Нет | Да | Закругленный | |
С# | %
|
Да | Да | Усечено |
Math.IEEERemainder
|
Нет | Да | Закругленный [12] | |
Кларион | %
|
Да | Нет | Усечено |
Чистый | rem
|
Да | Нет | Усечено |
Кложур | mod
|
Да | Нет | Напольный [13] |
rem
|
Да | Нет | Усечено [14] | |
КОБОЛ | FUNCTION MOD
|
Да | Нет | Напольный [15] |
FUNCTION REM
|
Да | Да | Усечено [15] | |
Кофескрипт | %
|
Да | Нет | Усечено |
%%
|
Да | Нет | Напольный [16] | |
КолдФьюжн | % , MOD
|
Да | Нет | Усечено |
Общий промежуточный язык | rem (подпись)
|
Да | Да | Усечено [17] |
rem.un (без подписи)
|
Да | Нет | — | |
Общий Лисп | mod
|
Да | Да | Напольный |
rem
|
Да | Да | Усечено | |
Кристалл | % , modulo
|
Да | Да | Напольный |
remainder
|
Да | Да | Усечено | |
Д | %
|
Да | Да | Усечено [18] |
Дарт | %
|
Да | Да | евклидов [19] |
remainder()
|
Да | Да | Усечено [20] | |
Эйфелева | \\
|
Да | Нет | Усечено |
Эликсир | rem/2
|
Да | Нет | Усечено [21] |
Integer.mod/2
|
Да | Нет | Напольный [22] | |
Вяз | modBy
|
Да | Нет | Напольный [23] |
remainderBy
|
Да | Нет | Усечено [24] | |
Эрланг | rem
|
Да | Нет | Усечено |
math:fmod/2
|
Нет | Да | Усеченный (так же, как C) [25] | |
Эйфория | mod
|
Да | Нет | Напольный |
remainder
|
Да | Нет | Усечено | |
Ф# | %
|
Да | Да | Усечено |
Math.IEEERemainder
|
Нет | Да | Закругленный [12] | |
Фактор | mod
|
Да | Нет | Усечено |
Файлмейкер | Mod
|
Да | Нет | Напольный |
Форт | mod
|
Да | Нет | Реализация определена |
fm/mod
|
Да | Нет | Напольный | |
sm/rem
|
Да | Нет | Усечено | |
Фортран | mod
|
Да | Да | Усечено |
modulo
|
Да | Да | Напольный | |
Фринк | mod
|
Да | Нет | Напольный |
Полный БЕЙСИК | MOD
|
Да | Да | Напольный [26] |
REMAINDER
|
Да | Да | Усечено [27] | |
ГЛСЛ | %
|
Да | Нет | Неопределенный [28] |
mod
|
Нет | Да | Напольный [29] | |
Студия GameMaker (GML) | mod , %
|
Да | Нет | Усечено |
GDScript (Годо) | %
|
Да | Нет | Усечено |
fmod
|
Нет | Да | Усечено | |
posmod
|
Да | Нет | евклидов | |
fposmod
|
Нет | Да | евклидов | |
Идти | %
|
Да | Нет | Усечено [30] |
math.Mod
|
Нет | Да | Усечено [31] | |
big.Int.Mod
|
Да | Нет | евклидов [32] | |
big.Int.Rem
|
Да | Нет | Усечено [33] | |
классный | %
|
Да | Нет | Усечено |
Хаскелл | mod
|
Да | Нет | Напольный [34] |
rem
|
Да | Нет | Усечено [34] | |
Data.Fixed.mod' ( ГХК )
|
Нет | Да | Напольный | |
Смешанный | %
|
Да | Нет | Усечено |
ХЛСЛ | %
|
Да | Да | Неопределенный [35] |
Дж | | [б]
|
Да | Нет | Напольный |
Ява | %
|
Да | Да | Усечено |
Math.floorMod
|
Да | Нет | Напольный | |
JavaScript Машинопись |
%
|
Да | Да | Усечено |
Юлия | mod
|
Да | Да | Напольный [36] |
% , rem
|
Да | Да | Усечено [37] | |
Котлин | % , rem
|
Да | Да | Усечено [38] |
mod
|
Да | Да | Напольный [39] | |
кш | %
|
Да | Нет | Усеченный (так же, как POSIX sh) |
fmod
|
Нет | Да | Усечено | |
ЛабВЬЮ | mod
|
Да | Да | Усечено |
LibreOffice | =MOD()
|
Да | Нет | Напольный |
Логотип | MODULO
|
Да | Нет | Напольный |
REMAINDER
|
Да | Нет | Усечено | |
Второй 5 | %
|
Да | Да | Напольный |
Второй 4 | mod(x,y)
|
Да | Да | Усечено |
Свобода БЕЙСИК | MOD
|
Да | Нет | Усечено |
Маткад | mod(x,y)
|
Да | Нет | Напольный |
Клен | e mod m (по умолчанию), modp(e, m)
|
Да | Нет | евклидов |
mods(e, m)
|
Да | Нет | Закругленный | |
frem(e, m)
|
Да | Да | Закругленный | |
Математика | Mod[a, b]
|
Да | Нет | Напольный |
МАТЛАБ | mod
|
Да | Нет | Напольный |
rem
|
Да | Нет | Усечено | |
Максима | mod
|
Да | Нет | Напольный |
remainder
|
Да | Нет | Усечено | |
Встроенный язык Maya | %
|
Да | Нет | Усечено |
Майкрософт Эксель | =MOD()
|
Да | Да | Напольный |
Минитаб | MOD
|
Да | Нет | Напольный |
Модуль-2 | MOD
|
Да | Нет | Напольный |
REM
|
Да | Нет | Усечено | |
Свинка | #
|
Да | Нет | Напольный |
Сетевой ассемблер ( NASM , NASMX ) | % , div (без подписи)
|
Да | Нет | — |
%% (подпись)
|
Да | Нет | Определяется реализацией [40] | |
Nim | mod
|
Да | Нет | Усечено |
Оберон | MOD
|
Да | Нет | Напольный [д] |
Цель-C | %
|
Да | Нет | Усеченный (то же, что и C99) |
Объект Паскаль , Делфи | mod
|
Да | Нет | Усечено |
OCaml | mod
|
Да | Нет | Усечено [41] |
mod_float
|
Нет | Да | Усечено [42] | |
Оккам | \
|
Да | Нет | Усечено |
Паскаль (ISO-7185 и -10206) | mod
|
Да | Нет | евклидовоподобный [и] |
Перл | %
|
Да | Нет | Напольный [ф] |
POSIX::fmod
|
Нет | Да | Усечено | |
Фикс | mod
|
Да | Нет | Напольный |
remainder
|
Да | Нет | Усечено | |
PHP | %
|
Да | Нет | Усечено [44] |
fmod
|
Нет | Да | Усечено [45] | |
ПИК БЕЙСИК Про | \\
|
Да | Нет | Усечено |
ПЛ/Я | mod
|
Да | Нет | Напольный (ANSI PL/I) |
PowerShell | %
|
Да | Нет | Усечено |
Код программирования ( КНР ) | MATH.OP - 'MOD; (\)'
|
Да | Нет | Неопределенный |
Прогресс | modulo
|
Да | Нет | Усечено |
Пролог ( ISO 1995 ) | mod
|
Да | Нет | Напольный |
rem
|
Да | Нет | Усечено | |
PureBasic | % , Mod(x,y)
|
Да | Нет | Усечено |
Чистый скрипт | `mod`
|
Да | Нет | евклидов [46] |
Чистые данные | %
|
Да | Нет | Усеченный (так же, как C) |
mod
|
Да | Нет | Напольный | |
Питон | %
|
Да | Да | Напольный |
math.fmod
|
Нет | Да | Усечено | |
Вопрос# | %
|
Да | Нет | Усечено [47] |
Р | %%
|
Да | Да | Напольный [48] |
Ракетка | modulo
|
Да | Нет | Напольный |
remainder
|
Да | Нет | Усечено | |
Раку | %
|
Нет | Да | Напольный |
RealBasic | MOD
|
Да | Нет | Усечено |
Причина | mod
|
Да | Нет | Усечено |
Рекс | //
|
Да | Да | Усечено |
РПГ | %REM
|
Да | Нет | Усечено |
Руби | % , modulo()
|
Да | Да | Напольный |
remainder()
|
Да | Да | Усечено | |
Ржавчина | %
|
Да | Да | Усечено |
rem_euclid()
|
Да | Да | евклидов [49] | |
САС | MOD
|
Да | Нет | Усечено |
Скала | %
|
Да | Да | Усечено |
Схема | modulo
|
Да | Нет | Напольный |
remainder
|
Да | Нет | Усечено | |
Схема Р 6 РС | mod
|
Да | Нет | евклидов [50] |
mod0
|
Да | Нет | Закругленный [50] | |
flmod
|
Нет | Да | евклидов | |
flmod0
|
Нет | Да | Закругленный | |
Царапать | mod
|
Да | Да | Напольный |
Сид7 | mod
|
Да | Да | Напольный |
rem
|
Да | Да | Усечено | |
SenseTalk | modulo
|
Да | Нет | Напольный |
rem
|
Да | Нет | Усечено | |
sh (POSIX) (включая bash , mksh и т. д.)
|
%
|
Да | Нет | Усеченный (так же, как C) [51] |
Смолток | \\
|
Да | Нет | Напольный |
rem:
|
Да | Нет | Усечено | |
Щелчок! | mod
|
Да | Нет | Напольный |
Вращаться | //
|
Да | Нет | Напольный |
Солидность | %
|
Да | Нет | Напольный |
SQL ( SQL:1999 ) | mod(x,y)
|
Да | Нет | Усечено |
SQL ( SQL:2011 ) | %
|
Да | Нет | Усечено |
Стандартный ML | mod
|
Да | Нет | Напольный |
Int.rem
|
Да | Нет | Усечено | |
Real.rem
|
Нет | Да | Усечено | |
Был | mod(x,y)
|
Да | Нет | евклидов |
Быстрый | %
|
Да | Нет | Усечено [52] |
remainder(dividingBy:)
|
Нет | Да | Закругленный [53] | |
truncatingRemainder(dividingBy:)
|
Нет | Да | Усечено [54] | |
Ткл | %
|
Да | Нет | Напольный |
fmod()
|
Нет | Да | Усечено (как C) | |
ткш | %
|
Да | Нет | Усечено |
Крутящий момент | %
|
Да | Нет | Усечено |
Тьюринг | mod
|
Да | Нет | Напольный |
Верилог (2001) | %
|
Да | Нет | Усечено |
VHDL | mod
|
Да | Нет | Напольный |
rem
|
Да | Нет | Усечено | |
ВимЛ | %
|
Да | Нет | Усечено |
Визуальный Бейсик | Mod
|
Да | Нет | Усечено |
Веб-сборка | i32.rem_u , i64.rem_u (без подписи)
|
Да | Нет | — [55] |
i32.rem_s , i64.rem_s (подпись)
|
Да | Нет | Усечено [55] | |
сборка х86 | IDIV
|
Да | Нет | Усечено |
XBase++ | %
|
Да | Да | Усечено |
Mod()
|
Да | Да | Напольный | |
Зиг | % ,
|
Да | Да | Усечено [56] |
Теорема Z3 обеспечивает | div , mod
|
Да | Нет | евклидов |
Кроме того, многие компьютерные системы предоставляют divmod
функциональность, которая производит частное и остаток одновременно. Примеры включают архитектуру x86 . IDIV
инструкция, язык программирования C div()
функция Python и divmod()
функция.
Обобщения [ править ]
По модулю со смещением [ править ]
Иногда полезно, чтобы результат по n модулю находился не между 0 и n − 1 , а между некоторым числом d и d + n − 1 . В этом случае d называется смещением , и d = 1 встречается особенно часто.
для этой операции не существует стандартной записи, поэтому давайте условно воспользуемся модом Кажется , d n . Таким образом, мы имеем следующее определение: [57] x = a mod d n только в том случае, если d ≤ x ≤ d + n - 1 и x mod n = a mod n . Очевидно, что обычная операция по модулю соответствует смещению нуля: a mod n = a mod 0 n .
Операция по модулю со смещением связана с функцией пола следующим образом:
Чтобы увидеть это, позвольте . Сначала мы покажем, x mod n = mod что n . В общем случае верно, что ( a + bn ) mod n = a mod n для всех целых чисел b ; таким образом, это верно и в том частном случае, когда ; но это значит, что , что мы и хотели доказать. Осталось показать, что d ≤ x ≤ d + n − 1 . Пусть k и r — целые числа такие, что a − d = kn + r , где 0 ≤ r ≤ n − 1 (см. евклидово деление ). Затем , таким образом . Теперь возьмем 0 ≤ r ≤ n − 1 и прибавим d к обеим частям, получив d ≤ d + r ≤ d + n − 1 . Но мы видели, что x = d + r , так что мы закончили.
Модуль со смещением a mod d n реализован в системе Mathematica как Mod[a, n, d]
. [57]
Реализация других определений по модулю с использованием усечения [ править ]
Несмотря на математическую элегантность напольного деления Кнута и евклидова деления, в языках программирования гораздо чаще можно встретить усеченное деление по модулю, основанное на делении. Лейен предоставляет следующие алгоритмы для вычисления двух делений с учетом усеченного целочисленного деления: [5]
/* Euclidean and Floored divmod, in the style of C's ldiv() */
typedef struct {
/* This structure is part of the C stdlib.h, but is reproduced here for clarity */
long int quot;
long int rem;
} ldiv_t;
/* Euclidean division */
inline ldiv_t ldivE(long numer, long denom) {
/* The C99 and C++11 languages define both of these as truncating. */
long q = numer / denom;
long r = numer % denom;
if (r < 0) {
if (denom > 0) {
q = q - 1;
r = r + denom;
} else {
q = q + 1;
r = r - denom;
}
}
return (ldiv_t){.quot = q, .rem = r};
}
/* Floored division */
inline ldiv_t ldivF(long numer, long denom) {
long q = numer / denom;
long r = numer % denom;
if ((r > 0 && denom < 0) || (r < 0 && denom > 0)) {
q = q - 1;
r = r + denom;
}
return (ldiv_t){.quot = q, .rem = r};
}
В обоих случаях остаток можно вычислить независимо от частного, но не наоборот. Здесь операции объединены для экономии места на экране, поскольку логические ветви одинаковы.
См. также [ править ]
- Модуль (значения) – множество вариантов использования слова по модулю , все из которых возникли из Карлом Ф. Гауссом введения модульной арифметики в 1801 году.
- По модулю (математика) , общее использование термина в математике.
- Модульное возведение в степень
- Поворот (угол)
Примечания [ править ]
- ^ Математически эти два варианта — всего лишь два из бесконечного числа вариантов, доступных для неравенства, удовлетворяемого остатком .
- ^ Jump up to: Перейти обратно: а б Порядок аргументов меняется на обратный, т.е.
α|ω
вычисляет , остаток при деленииω
кα
. - ^ C99 и C++11 определяют поведение
%
быть усеченным. [9] Стандарты до этого оставляют поведение определяемым реализацией. [10] - ^ Делитель должен быть положительным, иначе не определен.
- ^ Как обсуждал Буте, определения ISO Pascal
div
иmod
не подчиняются тождеству деления D = d · ( D / d ) + D % d и, таким образом, фундаментально нарушены. - ^ Perl обычно использует арифметический оператор по модулю, который не зависит от машины. Примеры и исключения см. в документации Perl по мультипликативным операторам. [43]
Ссылки [ править ]
- ^ Вайсштейн, Эрик В. «Конгруэнтность» . Вольфрам Математический мир . Проверено 27 августа 2020 г.
- ^ Колдуэлл, Крис. «осадок» . Главный глоссарий . Проверено 27 августа 2020 г.
- ^ Кнут, Дональд. Э. (1972). Искусство компьютерного программирования . Аддисон-Уэсли.
- ^ Бут, Раймонд Т. (апрель 1992 г.). «Евклидово определение функций div и mod» . Транзакции ACM в языках и системах программирования . 14 (2). ACM Press (Нью-Йорк, штат Нью-Йорк, США): 127–144. дои : 10.1145/128861.128862 . hdl : 1854/LU-314490 . S2CID 8321674 .
- ^ Jump up to: Перейти обратно: а б Лейен, Даан (3 декабря 2001 г.). «Деление и модуль для компьютерщиков» (PDF) . Проверено 25 декабря 2014 г.
- ^ Петерсон, доктор (5 июля 2001 г.). «Функция Mod и отрицательные числа» . Математический форум — спросите доктора Математика . Архивировано из оригинала 22 октября 2019 г. Проверено 22 октября 2019 г.
- ^ Хорват, Адам (5 июля 2012 г.). «Быстрое деление и операция по модулю — сила двух» .
- ^ Jump up to: Перейти обратно: а б ISO/IEC 8652:2012 — Информационные технологии. Языки программирования. Ада . ИСО , МЭК . 2012. сек. 4.5.5 Операторы умножения.
- ^ «Спецификация C99 (ISO/IEC 9899:TC2)» (PDF) . 06 мая 2005 г. сек. 6.5.5 Мультипликативные операторы . Проверено 16 августа 2018 г.
- ^ ISO/IEC 14882:2003: Языки программирования – C++ . Международная организация по стандартизации (ISO), Международная электротехническая комиссия (IEC). 2003. сек. 5.6.4.
бинарный оператор % возвращает остаток от деления первого выражения на второе. .... Если оба операнда неотрицательны, то остаток неотрицательен; если нет, то знак остатка определяется реализацией
- ^ ISO/IEC 9899:1990: Языки программирования – C. ИСО , МЭК . 1990. сек. 7.5.6.4.
Функция fmod возвращает значение x - i * y для некоторого целого числа i, такого, что, если y не равно нулю, результат имеет тот же знак, что и x , и величину меньше, чем величина y .
- ^ Jump up to: Перейти обратно: а б дотнет-бот. «Метод Math.IEEERemainder(Double, Double) (Система)» . Microsoft Learn . Проверено 4 октября 2022 г.
- ^ «clojure.core — Документация по API Clojure v1.10.3» . Clojure.github.io . Проверено 16 марта 2022 г.
- ^ «clojure.core — Документация по API Clojure v1.10.3» . Clojure.github.io . Проверено 16 марта 2022 г.
- ^ Jump up to: Перейти обратно: а б ISO/IEC JTC 1/SC 22/WG 4 (январь 2023 г.). ISO/IEC 1989:2023 – Язык программирования COBOL . ИСО .
{{cite book}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Операторы CoffeeScript
- ^ ISO/IEC JTC 1/SC 22 (февраль 2012 г.). ISO/IEC 23271:2012 — Информационные технологии. Общеязыковая инфраструктура (CLI) . ИСО . §§ III.3.55–56.
{{cite book}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ «Выражения — язык программирования D» . dlang.org . Проверено 1 июня 2021 г.
- ^ «метод оператора % — номер класса — dart:core Library — Dart API» . api.dart.dev . Проверено 1 июня 2021 г.
- ^ «метод остатка — номер класса — библиотека dart:core — API Dart» . api.dart.dev . Проверено 1 июня 2021 г.
- ^ «Ядро — Эликсир v1.11.3» . hexdocs.pm . Проверено 28 января 2021 г.
- ^ «Целое число — Эликсир v1.11.3» . hexdocs.pm . Проверено 28 января 2021 г.
- ^ «Основы — ядро 1.0.5» . package.elm-lang.org . Проверено 16 марта 2022 г.
- ^ «Основы — ядро 1.0.5» . package.elm-lang.org . Проверено 16 марта 2022 г.
- ^ «Эрланг — математика» . erlang.org . Проверено 1 июня 2021 г.
- ^ АНСИ (28 января 1987 г.). Языки программирования — Полный БЕЙСИК . Нью-Йорк: Американский национальный институт стандартов. § 5.4.4.
X по модулю Y, т.е. XY*INT(X/Y).
- ^ АНСИ (28 января 1987 г.). Языки программирования — Полный БЕЙСИК . Нью-Йорк: Американский национальный институт стандартов. § 5.4.4.
Функция остатка, т.е. XY*IP(X/Y).
- ^ «Спецификация языка GLSL, версия 4.50.7» (PDF) . раздел 5.9 Выражения.
Если оба операнда неотрицательны, то остаток неотрицательен. Результаты не определены, если один или оба операнда отрицательны.
- ^ «Спецификация языка GLSL, версия 4.50.7» (PDF) . раздел 8.3 Общие функции.
- ^ «Спецификация языка программирования Go — Язык программирования Go» . go.dev . Проверено 28 февраля 2022 г.
- ^ «математический пакет — math — pkg.go.dev» . pkg.go.dev . Проверено 28 февраля 2022 г.
- ^ «большой пакет — math/big — pkg.go.dev» . pkg.go.dev . Проверено 28 февраля 2022 г.
- ^ «большой пакет — math/big — pkg.go.dev» . pkg.go.dev . Проверено 12 апреля 2024 г.
- ^ Jump up to: Перейти обратно: а б «6 предопределенных типов и классов» . www.haskell.org . Проверено 22 мая 2022 г.
- ^ «Операторы» . Майкрософт . Проверено 19 июля 2021 г.
Оператор % определяется только в тех случаях, когда либо обе стороны положительны, либо обе стороны отрицательны. В отличие от C, он также работает с типами данных с плавающей запятой, а также с целыми числами.
- ^ «Математика · Язык Джулии» . docs.julialang.org . Проверено 20 ноября 2021 г.
- ^ «Математика · Язык Джулии» . docs.julialang.org . Проверено 20 ноября 2021 г.
- ^ «rem — язык программирования Kotlin» . Котлин . Проверено 5 мая 2021 г.
- ^ «мод — язык программирования Котлин» . Котлин . Проверено 5 мая 2021 г.
- ^ «Глава 3: Язык NASM» . NASM — Netwide Assembler версии 2.15.05 .
- ^ «Библиотека OCaml: Stdlib» . ocaml.org . Проверено 19 февраля 2022 г.
- ^ «Библиотека OCaml: Stdlib» . ocaml.org . Проверено 19 февраля 2022 г.
- ^ Документация Perl
- ^ «PHP: Арифметические операторы — Руководство» . www.php.net . Проверено 20 ноября 2021 г.
- ^ «PHP: fmod — Руководство» . www.php.net . Проверено 20 ноября 2021 г.
- ^ «Евклидово кольцо» .
- ^ КвантумПисатель. «Выражения» . docs.microsoft.com . Проверено 11 июля 2018 г.
- ^ «R: Арифметические операторы» . search.r-project.org . Проверено 24 декабря 2022 г.
- ^ «F32 — Ржавчина» .
- ^ Jump up to: Перейти обратно: а б r6rs.org
- ^ «Язык команд оболочки» . pubs.opengroup.org . Проверено 5 февраля 2021 г.
- ^ «Документация разработчика Apple» . разработчик.apple.com . Проверено 20 ноября 2021 г.
- ^ «Документация разработчика Apple» . разработчик.apple.com . Проверено 20 ноября 2021 г.
- ^ «Документация разработчика Apple» . разработчик.apple.com . Проверено 20 ноября 2021 г.
- ^ Jump up to: Перейти обратно: а б Россберг, Андреас, изд. (19 апреля 2022 г.). «Основная спецификация WebAssembly: версия 2.0» . Консорциум Всемирной паутины . § 4.3.2 Целочисленные операции.
- ^ «Зиг-документация» . Язык программирования Zig . Проверено 18 декабря 2022 г.
- ^ Jump up to: Перейти обратно: а б «Мод» . Центр документации по языкам и системам Wolfram . Вольфрам Исследования . 2020 . Проверено 8 апреля 2020 г.
Внешние ссылки [ править ]
- Различные виды целочисленного деления
- Модулорама , анимация циклического представления таблицы умножения (объяснение на французском языке)