먼저, 모듈로 b가 a-b * (a div b)와 같아야한다는 것을 반복하고 언어가이를 제공하지 않으면 수학적 혼란에 빠지게됩니다. 이 표현 a-b * (a div b)는 실제로 모듈로 b를 계산하는 구현 횟수입니다.
몇 가지 가능한 근거가 있습니다. 첫 번째는 최대 속도를 원한다는 것입니다. 따라서 div b는 사용 된 프로세서가 제공하는 것으로 정의됩니다. 프로세서에 "div"명령어가있는 경우 div b는 div 명령어가 수행하는 모든 것입니다 (전적으로 미치 않은 것이 아닌 한).
두 번째는 특정한 수학적 행동을 원한다는 것입니다. 먼저 b> 0으로 가정하겠습니다. div b의 결과를 0으로 반올림하는 것이 매우 합리적입니다. 따라서 4 div 5 = 0, 9 div 5 = 1, -4 div 5 = -0 = 0, -9 div 5 = -1입니다. 이것은 (-a) div b =-(a div b) 및 (-a) modulo b =-(a modulo b)를 제공합니다.
이것은 상당히 합리적이지만 완벽하지는 않습니다. 예를 들어 (a + b) div b = (a div b) + 1은 유지되지 않습니다. 예를 들어 a = -1이면 말입니다. 고정 된 b> 0 인 경우, 일반적으로 (b) 가능한 값은 div b가 0 인 2b-1 값 a -b + 1에서 b-1을 제외하고는 div b가 동일한 결과를 제공 할 수 있습니다. 또한 a가 음수이면 모듈로 b가 음수임을 의미합니다. 모듈로 b는 항상 0에서 b-1 사이의 숫자가 되길 원합니다.
반면에 a의 연속적인 값을 통과 할 때 모듈로 b는 0에서 b-1까지의 값을 통과 한 다음 0으로 다시 시작하도록 요청하는 것이 매우 합리적입니다. 그리고 (a + b) div b는 (a div b) + 1이어야합니다.이를 위해서는 div b의 결과를-무한으로 반올림하여 -1 div b = -1이되도록합니다. 다시 한 번 단점이 있습니다. (-a) div b =-(a div b)는 유지되지 않습니다. 반복해서 2 또는 임의의 숫자 b> 1로 나누면 결과는 0이되지 않습니다.
갈등이 있기 때문에 언어는 어떤 장점이 그들에게 더 중요한지를 결정하고 그에 따라 결정해야합니다.
음수 b의 경우 대부분의 사람들은 div b와 modulo b가 처음에 있어야 할 것에 대해 머리를 맞출 수 없으므로 간단한 방법은 div b = (-a) div (-b) 및 b <0 인 경우 a 또는 b = (-a) 모듈로 (-b)