科学技術計算や幾何学的な計算(面積や体積など)において、ある数値を2乗、3乗、あるいはN乗したい場面は頻繁に訪れます。
Pythonには、べき乗を計算するための標準的な手段として、** 演算子と、組み込み関数の pow() が用意されています。これらは似たような結果を返しますが、機能面でいくつかの違いがあります。
この記事では、それぞれの基本的な使い方と、pow() 関数独自の機能である「剰余の計算」について解説します。
1. ** 演算子による計算
Pythonでは、^ ではなく ** を使ってべき乗を表現します(^ はビット排他的論理和を意味するため注意が必要です)。
直感的で記述が短いため、通常の計算ではこちらが最もよく使われます。
具体的な使用例:正方形の面積と立方体の体積
一辺の長さから、面積(2乗)と体積(3乗)を計算する例です。
# 一辺の長さ
side_length = 5
# 面積 = 辺の2乗
area = side_length ** 2
# 体積 = 辺の3乗
volume = side_length ** 3
print(f"一辺: {side_length}")
print(f"面積: {area}")
print(f"体積: {volume}")
実行結果:
一辺: 5
面積: 25
体積: 125
応用:平方根(ルート)の計算
べき乗の指数に 0.5(1/2)を指定することで、平方根を計算することも可能です。
# 100 の平方根を求める
number = 100
square_root = number ** 0.5
print(f"{number} の平方根: {square_root}")
実行結果:
100 の平方根: 10.0
2. pow() 関数による計算
組み込み関数の pow(底, 指数) を使用しても、同様の計算が可能です。
構文:
result = pow(base, exp)
具体的な使用例
3の4乗($3 \times 3 \times 3 \times 3$)を計算します。
base_val = 3
exponent = 4
# 3 の 4乗
result_pow = pow(base_val, exponent)
print(f"{base_val} の {exponent}乗: {result_pow}")
実行結果:
3 の 4乗: 81
単純な計算であれば ** と pow() に大きな違いはありません。
3. pow() 独自の機能:剰余計算(第3引数)
pow() 関数には、** 演算子にはない強力な機能があります。それは、第3引数を指定することで**「べき乗した結果を、ある数で割った余り(剰余)」**を高速に計算できる点です。
構文:
result = pow(base, exp, mod)
# (base ** exp) % mod と同じ結果になるが、はるかに高速
これは、暗号技術(RSA暗号など)や競技プログラミングにおいて、巨大な数値を扱う際によく利用されます。
具体的な使用例
非常に大きな計算結果の余りを求める例です。
x = 123456
y = 789012
z = 1000000007 # 割る数
# pow() を使って高速に計算
# 123456 の 789012乗 を計算し、その余りを求める
result_mod = pow(x, y, z)
print(f"巨大な数の剰余: {result_mod}")
実行結果:
巨大な数の剰余: 238711463
もしこれを (x ** y) % z と書くと、Pythonは一度とてつもなく巨大な数(x ** y)をメモリ上に展開しようとするため、処理時間がかかったり、メモリ不足になったりする可能性があります。pow(x, y, z) は途中で巨大な数を作らずに計算するため、非常に効率的です。
まとめ
- x ** y:通常のべき乗計算に使用します。記述が簡潔で、数式として読みやすいのが特徴です。平方根(0.5乗)も計算できます。
- pow(x, y):関数形式でべき乗を計算します。
- pow(x, y, z):(x ** y) % z と同じ意味ですが、巨大な数を扱う場合はこちらの方が圧倒的に高速でメモリ効率が良いです。
日常的な計算には ** を、剰余が必要な特殊な計算には pow() の第3引数を使用する、という使い分けが推奨されます。
