環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonでべき乗とべき乗根を算術演算子とpowで計算する:組み込みのpowとmathパッケージのpowの違い

最終更新日 2023.02.18

べき乗とは同じ数を何回もかけた数のことです。Python のべき乗は ** で計算します。算術演算子の一つで、底、指数の順に書きます。

a = 2 ** 3
b = 2 ** 4
c = 2 ** 5
d = 2 ** 6

print(a)  # 8
print(b)  # 16
print(c)  # 32
print(d)  # 64

指数は実数に拡張できます。

a = 2 ** 0.5
b = 2 ** 3.0
c = 2 ** 0
d = 2 ** -1
e = (1 + 2j) ** 3

print(a)  # 1.4142135623730951
print(b)  # 8.0
print(c)  # 1
print(d)  # 0.5
print(e)  # (-11-2j)

0.5 乗は平方根を意味します。3 乗は 8 ですが、3.0 乗は 8.0 となっていることに注意しましょう。複素数のべき乗も対応しています。Python では複素数を a+bj と書きます。i でなく j です。

0 の 0 乗を計算する

科学計算でやっかいな問題は 0 の 0 乗です。

a = 0 ** 0
b = 0 ** 0.0
c = 0.0 ** 0
d = 0.0 ** 0.0

print(a)  # 1
print(b)  # 1.0
print(c)  # 1.0
print(d)  # 1.0

底と指数が 0 または 0.0 のとき、Python は 1 または 1.0 を返します。底と指数のどちらかが小数なら小数になります。

複素数のバージョンはこちら。

a = 0j ** 0
b = 0j ** 0.0
c = 0.0j ** 0

print(a)  # (1+0j)
print(b)  # (1+0j)
print(c)  # (1+0j)

すべて (1+0j) となりました。

算術演算子以外のべき乗関数

これから算術演算子以外の関数をいくつか紹介しますが、pow は Python のビルト・イン関数と math パッケージの関数の 2 つがあります。これらはふるまいが微妙に異なるため、科学計算に携わる人は注意しましょう。ビルト・イン関数は「Python の pow」と呼びます。

Python の pow でべき乗を計算する

pow の第一引数に底、第二引数に指数を指定します。

m = 3

n0 = pow(m, 0)
n1 = pow(m, 1)
n2 = pow(m, 2)
n3 = pow(m, 3)
n4 = pow(m, 4)

print(n0)  # 1
print(n1)  # 3
print(n2)  # 9
print(n3)  # 27
print(n4)  # 81

0 乗は 1 です。

Python の pow でべき乗の剰余を計算する

算術演算子があるのに、どうして pow が用意されているのでしょう?実は pow はべき乗の剰余も計算できます。

a = pow(2, 4)

print(a)  # 16

b = pow(2, 4, 3)

print(b)  # 1

pow(2, 4, 3) は 2 の 4 乗を 3 で割った値です。いろいろな値で割ってみましょう。

x = pow(2, 4)

print(x)  # 16

a = pow(2, 4, 1)
b = pow(2, 4, 2)
c = pow(2, 4, 3)
d = pow(2, 4, 4)
e = pow(2, 4, 5)
f = pow(2, 4, 6)

print(a)  # 0
print(b)  # 0
print(c)  # 1
print(d)  # 0
print(e)  # 1
print(f)  # 4

Python の pow は小数点をどう扱っているか?

底または指数が小数の場合、小数が返ります。

print(pow(2, 3))  # 8
print(pow(2.0, 3))  # 8.0
print(pow(2, 3.0))  # 8.0
print(pow(2.0, 3.0))  # 8.0

print(pow(1 + 1j, 2))  # 2j
print(pow(1 + 1j, 2.0))  # 2j

print(pow(1.5 + 1j, 2))  # (1.25+3j)
print(pow(1.5 + 1j, 2.0))  # (1.25+3j)
print(pow(1.5 + 1j, 2.1))  # (1.1365872517656868+3.2545294381084036j)

math パッケージの pow でべき乗を計算する

math パッケージの pow もビルト・インとほぼ同じです。底、指数の順に書きます。

import math

a = math.pow(2, 3)
b = math.pow(2.0, 3)
c = math.pow(2, 3.0)
d = math.pow(2.0, 3.0)

print(a)  # 8.0
print(b)  # 8.0
print(c)  # 8.0
print(d)  # 8.0

Python の pow と異なる点は、底と指数が整数であっても返り値が小数になることです。

Python の pow と math の pow はどう違うか?

下のコードが違いを端的に示しています。

import math

a = pow(-2, 0.5)
b = math.pow(-2, 0.5)

print(a)  # (8.659560562354934e-17+1.4142135623730951j)
print(b)  # ValueError: math domain error

マイナスのべき乗で違いがでます。0.5 乗の定義域は 0 以上の実数なので、pow(-2, 0.5) はそもそも実数の関数として定義できません。

しかしビルト・イン関数はなんとなく計算しています。math パッケージのほうはエラーを出しています。