Pythonのdivmod()関数とは?商と余りの取得から素数判定まで徹底解説
Pythonに標準で組み込まれているdivmod()関数は、2つの数値を引数として受け取り、その商と余りをタプルとして一度に返す便利な関数です。数値の整除性(割り切れるかどうか)の確認や素数判定など、さまざまな数学的な処理に活用できます。
構文
divmod(a, b) # a を b で割ったときの「商」と「余り」をタプルで返す # a, b には整数または浮動小数点数を指定可能
基本的な使用例
以下の例では、整数と浮動小数点数の両方のケースを確認できます。divmod()を適用すると結果はタプルとして返され、その要素にも整数や浮動小数点数が含まれます。
# 整数の場合
print("5 and 2 give:", divmod(5, 2))
print("25 and 5 give:", divmod(25, 5))
# 浮動小数点数の場合
print("5.6 and 2 give:", divmod(5.6, 2))
print("11.3 and 9.2 give:", divmod(11.3, 9.2))
実行結果
上記のコードを実行すると、次のような出力が得られます。
5 and 2 give: (2, 1) 25 and 5 give: (5, 0) 5.6 and 2 give: (2.0, 1.5999999999999996) 11.3 and 9.2 give: (1.0, 2.1000000000000014)
浮動小数点数の場合、「1.5999999999999996」のように一見不規則な値が表示されることがあります。これは浮動小数点数の内部表現に起因する誤差であり、Python特有の問題ではありません。
引数にゼロを指定した場合
第1引数が0の場合、結果は (0, 0) となります。一方、第2引数(除数)が0の場合は、予想どおり ZeroDivisionError(ゼロ除算エラー)が発生します。
# 第1引数がゼロの場合
print("0 and 8 give:", divmod(0, 8))
# 第2引数がゼロの場合
print("8 and 0 give:", divmod(8, 0))
実行結果
0 and 8 give: (0, 0)
Traceback (most recent call last):
File "xxx.py", line 6, in
print("8 and 0 give:", divmod(8, 0))
ZeroDivisionError: integer division or modulo by zero
整除性(割り切れるかどうか)の確認
divmod()の戻り値であるタプルの2番目の要素(余り)が0であれば、第1引数の数値は第2引数の数値で割り切れることを意味します。余りが0以外であれば割り切れません。以下の例で実際に確認してみましょう。
m = 12
n = 4
quotient, remainder = divmod(m, n)
print(quotient)
print(remainder)
if remainder == 0:
print(m, 'is divisible by', n)
else:
print(m, 'is not divisible by', n)
実行結果
3 0 12 is divisible by 4
素数判定への応用
divmod()を使えば、ある数値を自分自身から1まで順番に割っていき、そのたびに発生する余りを簡単に追跡できます。素数の場合、その数を完全に割り切れるのは「その数自身」と「1」だけなので、余りが0になる回数は2回になります。したがって、余りが0になる回数が2より多ければ、その数は素数ではないと判断できます。
num = 11
a = num
# 余りがゼロになる回数をカウント
count = 0
while a != 0:
q, r = divmod(num, a)
a -= 1
if r == 0:
count += 1
if count > 2:
print(num, 'is not Prime')
else:
print(num, 'is Prime')
実行結果
11 is Prime
このようにdivmod()を使うことで、商と余りを個別に計算する必要がなくなり、コードがシンプルかつ読みやすくなります。日常的な数値処理からアルゴリズムの実装まで、幅広い場面で活躍する関数なので、ぜひ使いこなしておきましょう。
-
Pythonでベクトルxを90度回転・加算してベクトルyに到達できるか判定するアルゴリズム
2次元平面上に3つのベクトル x、y、z があるとします。ベクトル x を起点として、「90度(時計回り)の回転」または「ベクトル z の加算」を必要な回数だけ繰り返すことで、ベクトル y に到達できるかどうかを判定するのがこの問題です。 たとえば、入力が x = (-4, -2)、y = (-1, 2)、z = (-2, -1) である場合、出力は True になります。x に対して z を加算する操作と 90 度の時計回り回転を組み合わせることで、y = (-1, 2) の位置に到達できるからです。 解法のアプローチ この問題は、次の手順に沿って解くことができます。 1. util()
-
Pythonで学ぶ相関と回帰分析の基礎|Seabornを使ったデータ分析入門
相関(Correlation)とは、2つのデータセット間に存在する依存関係を含む統計的な関係性を指します。一方、線形回帰(Linear Regression)は、従属変数と1つ以上の独立変数の間の関係を直線的なアプローチで捉える手法です。独立変数が1つの場合は「単回帰」、複数ある場合は「重回帰」と呼ばれます。相関とは何か依存現象の身近な例としては、親と子の身体的特徴(外見)の類似性や、商品の価格と供給量の関係などが挙げられます。価格が上がれば供給量が増える、といった具合に、変数同士が互いに影響し合う様子を統計的に表したものが相関です。本記事では、Pythonの可視化ライブラリ「Seaborn」