Python で、負の数を使った剰余算について


Pythonコード

[code]

    print(-7 % 2)  # 1
    print(-7 % 3)  # 2
    print(7 % -2)  # -1
    print(-7 % 3)  # 2
    print(7 % -3)  # -2
    
[/code]

となるのですが、理由が分かりません？




まず演算子の結合順序について、Python では `%` より単項のマイナス `-`
の方が[優先度が高い](https://docs.python.org/3/reference/expressions.html#operator-
precedence)ので、たとえば `-7 % 2` は `(-7) % 2` と解釈されます。`-(7 % 2)` ではないです。

そして Python の余り演算子 `%`
はふたつ目の引数と[同じ符号の余りを返します](https://docs.python.org/3/reference/expressions.html#binary-
arithmetic-operations)。このため `(-7) % 2` は `1` を返しますが、`7 % (-2)` は `-1` を返します。

この「結合の優先順序」「負の数が絡んだ場合の余り」はプログラミング言語によって[仕様が異なる](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97)ため、まずはドキュメントを確認してみてください。

* * *

※補足：`-7 % 3` が `2` になる理由

これは Python 以前に数学の話ですが、-7 = 3 * (-3) + 2 と書くと余りは 2 になります。  
また -7 = 3 * (-2) - 1 と捉えて余りを -1 とすることもでき、ここに選択の余地があります。  
同様に `7 % -3` や `-7 % -3` も統一的に扱えるようにするやり方がいくつかあり、言語によってやり方が異なっています。

