Pythonでべき乗とべき乗根を算術演算子とpowで計算する:組み込みのpowとmathパッケージのpowの違い
べき乗とは同じ数を何回もかけた数のことです。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 パッケージのほうはエラーを出しています。