Выполнение евклидова деления a = b*q + r
похоже на округление дроби a/b
до целого отношения q
, а затем вычисление остатка r
.
Различные результаты, которые вы видите, зависят от соглашения, используемого для округления фактора ...
Если вы округлите до нуля (усечь), вы получите симметрию около нуля, как в C:
truncate(7/3) = 2
7 = 3*2 + 1
truncate(-7/3) = -2
-7 = 3* -2 - 1
truncate(7/-3) = -2
7 = -3* -2 + 1
Если вы округлите в сторону отрицательной бесконечности (этажа), вы получите остаток, как в Python:
floor(7/3) = 2
7 = 3*2 + 1
floor(-7/3) = -3
-7 = 3* -3 + 2
floor(7/-3) = -3
7 = -3* -3 - 2
Если вы округлите до ближайшего целого (привязать к тому, что вы хотите, к четному или от нуля), вы получите центрированное по модулю:
round(7/3) = 2
7 = 3*2 + 1
round(8/3) = 3
8 = 3*3 - 1
round(-7/3) = -2
-7 = 3* -2 - 1
round(7/-3) = -2
7 = -3* -2 + 1
Вы могли бы попытаться реализовать свой собственный модуль с округлением до положительной бесконечности (ceil), и вы бы изобрели довольно нетрадиционный модуль, но это все равно было бы по модулю ...