OCamlmod
のモジュロ関数は、pythonのモジュロ演算子と比較すると異なる結果を返します。
OCaml:
# -1 mod 4
- : int = -1
Python:
>>> -1 % 4
3
なぜ結果が違うのですか?.
OCamlで%
として動作する標準モジュール関数はありますか?.
Pythonは、2つの値のモジュロを実際に計算する%
演算子の使用法が少し異なりますが、他のプログラミング言語はremainder同じ演算子を使用します。たとえば、Schemeでは区別が明確です。
(modulo -1 4) ; modulo
=> 3
(remainder -1 4) ; remainder
=> -1
Pythonの場合:
-1 % 4 # modulo
=> 3
math.fmod(-1, 4) # remainder
=> -1
しかし、OCamlにはmod
(整数剰余を計算する)しかありません。これによると table と ドキュメント に記載されているように:
-1 mod 4 (* remainder *)
=> -1
もちろん、次のように、modulo
に関して独自のremainder
操作を実装できます。
let modulo x y =
let result = x mod y in
if result >= 0 then result
else result + y
モジュロのセマンティクスは、整数除算のセマンティクスとリンクしています(通常、Q
が整数除算a / b
の結果であり、R
がa mod b
の結果である場合、次にa = Q * b + R
は常にtrueである必要があります)。したがって、整数除算の結果を整数に丸めるさまざまな方法では、モジュロに対してさまざまな結果が生成されます。
ウィキペディアの記事 モジュロ演算 には、さまざまな言語がモジュロを処理する方法に関する非常に広範な表があります。一般的な方法はいくつかあります。
C、Java、OCamlなどの言語では、整数の除算は0に丸められます。これにより、モジュロの結果は常に被除数と同じ符号になります。この場合、被除数(-1)は負であるため、モジュロも負(-1)になります。
Python、Ruby、およびその他の多くの言語では、整数の除算は常に(負の無限大に向かって)切り捨てられます。これにより、モジュロの結果は常に除数と同じ符号になります。この場合、除数(4)は正であるため、モジュロも正(3)です。