まず、モジュロbはa-b *(a div b)と等しくなければならないことを繰り返します。言語がそれを提供しない場合、あなたはひどい数学的混乱に陥っています。その式a-b *(a div b)は、実際にはbを法としてaを計算する実装の数です。
いくつかの可能な根拠があります。1つ目は、最高速度が必要なことです。そのため、div bは、使用するプロセッサーが提供するものとして定義されます。プロセッサに「div」命令がある場合、div bはdiv命令が実行するものです(それがまったく正気ではない限り)。
2つ目は、特定の数学的な動作が必要なことです。最初にb> 0と仮定します。divbの結果をゼロに丸めるのはかなり合理的です。したがって、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)aには可能な値があり、a div bが同じ結果を出しますが、2b-1の値aが-b + 1からb-1まであり、a div bが0に等しい場合を除きます。また、aが負の場合、bを法とする剰余も負になることを意味します。モジュロbは常に0からb-1の範囲の数値である必要があります。
一方、aの連続する値を通過するときに、aを法とするaが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の場合、ほとんどの人は最初にa div bとaを法とするaがどうあるべきか頭をつかむことができないため、簡単な方法はdiv b =(-a)div(-b)とaモジュロb =(-a)b <0の場合はモジュロ(-b)、または正のbのコードを使用した自然な結果。