Pythonの切り捨て除算演算と剰余演算

POINT

  • x//yはfloor(x/y)と思えばOK.
  • x%yはmod yで,yと同符号になる.

ドキュメント

6. 式 (expression) — Python 3.12.1 ドキュメント
  • //(切り捨て除算: floor division):floor関数と同じ.
    • 整数の切り捨て除算結果は整数.
  • %(剰余: modulo):第一引数を第二引数で除算したときの剰余.
    • 剰余演算子は常に第二引数と同じ符号 (またはゼロ).
    • 剰余演算の結果の絶対値は、常に第二引数の絶対値よりも小さい.
  • 切り捨て除算演算と剰余演算は、恒等式: x == (x//y)*y + (x%y) の関係にある.

負の数に対する演算

切り捨て除算演算について,

print(-5//2)    # -3
print(5//(-2))  # -3

となる.これは

\begin{aligned}
\biggl\lfloor -\frac{5}{2} \biggr\rfloor
= -3
\end{aligned}
に対応している.

つぎに,剰余演算について

print(-5%2)    # 1
print(5%(-2))  # -1

となる.これは

\begin{aligned}
& -5 \equiv 1 \pmod{2} \\
& -5 \equiv -1 \pmod{-2}
\end{aligned}
に対応していて,結果を第2引数の符号に合わせたものになっている.

また,

print(-5 == (-5//2)*2 + (-5%2))        # True
print(5 == (5//(-2))*(-2) + (5%(-2)))  # True

となる.


参考文献/記事

  • 記事を書いたきっかけ:B - Christmas Trees.数直線上の原点を基準に距離$M$おきにクリスマスツリーが置かれるとき,座標$x$以下の地点にあるツリーの座標の最大値は$\lfloor x/M \rfloor$と表せる($x$の符号によらない).