Pythonのべき乗を計算する
データ量の増大や、ビジネス拡大などの予測する際には、データ分析が欠かせません。指数的にデータ量が増加する、あるいは処理能力が必要になるなどの場合は、べき乗の計算を行います。
ここでは、Pythonを用いたべき乗計算を、サンプルコードを使いながら解説します。
べき乗とは
べき乗とは、ある数xをn回掛けた場合の計算を求める解法です。このxを底や基数と呼び、nを指数と呼びます。この計算は、10進数や2進数の桁の繰り上げや繰り下げにも用いることができるため、プログラミングでよく使用します。
そのため、それぞれのプログラミング言語では、言語仕様に基づいて計算方法を定めたり、関数を提供したりしています。Pythonも、言語仕様に基づく計算方法と関数の双方を提供しています。
Pythonのべき乗の計算方法
Pythonの言語は、仕様が定められておりその中にべき乗の扱いが記されています。合わせて組み込み関数や、外部関数なども定義されており、使い勝手の良いプログラミング言語です。ここでは、べき乗計算に関する手法を、サンプルコードを使いながら解説します。
演算子を用いた言語仕様に基づく計算方法
Pythonでは、四則演算の演算子(「+」、「-」、「*」、「/」)のほか、べき乗の演算子を定義しています。べき乗演算子は、「 ** 」で表し、べき乗の計算は、「基数」 ** 「指数」のように記述します。
次の例は、基数を2として、指数を-5〜5までfor文で繰り返す、サンプルコードです。
# coding: utf-8
base=2
for expo in range(-5,6,1):
print(base,"(",expo,"):",base**expo)
実行結果は、次の通りです。
2 ( -5 ): 0.03125
2 ( -4 ): 0.0625
2 ( -3 ): 0.125
2 ( -2 ): 0.25
2 ( -1 ): 0.5
2 ( 0 ): 1
2 ( 1 ): 2
2 ( 2 ): 4
2 ( 3 ): 8
2 ( 4 ): 16
2 ( 5 ): 32
指数部がマイナス(負)の場合は、1/2、1/4のように減っていき、プラス(正)の場合は、2、4のように基数に指数回だけ乗算されていることがわかります。
次に、基数を示すbase変数を10に置き換えてみましょう。
# coding: utf-8
base=10
for expo in range(-5,6,1):
print(base,"(",expo,"):",base**expo)
実行結果は、次の通りです。
10 ( -5 ): 1e-05
10 ( -4 ): 0.0001
10 ( -3 ): 0.001
10 ( -2 ): 0.01
10 ( -1 ): 0.1
10 ( 0 ): 1
10 ( 1 ): 10
10 ( 2 ): 100
10 ( 3 ): 1000
10 ( 4 ): 10000
10 ( 5 ): 100000
実行結果を見ると、基数である10を指数で示す回数の乗算がされていることがわかります。これらの処理は、Pythonにおいても2進数や10進数の桁の繰り上げや繰り下げに利用できます。2のべき乗判定のように、計算せずに2進判定できる方法もありますが、基本知識として覚えておくと良いでしょう。
【参考】:Python: Python 言語リファレンス 演算子 【参考】:Python: Python 言語リファレンス べき乗演算
べき乗演算子の計算順序
べき乗演算子は、数式の記述方法により右から左に計算されます。例えば「A**B**C」は、「A**(B**C)」のように計算されます。
他の演算子は、「*」や「/」のように優先順位が高い演算子もありますが、すべて左から右に計算されます。計算誤りを防ぐためには、カッコを活用すると良いでしょう。
【参考】:Python: Python 言語リファレンス べき乗演算
組み込み関数を用いた計算方法
Pythonでは、組み込み関数にべき乗計算のpow()を用意しています。使い方は、べき乗演算子に近いもので、基数と指数を引数に渡します。先ほど紹介したべき乗演算子のサンプルコードを1か所修正し、以下のように変更するだけでpow()関数が利用できます。
# coding: utf-8
base=2
for expo in range(-5,6,1):
print(base,"(",expo,"):",pow(base,expo))
実行結果はべき乗演算子と変わらないため割愛します。
【参考】:Python: Python 言語リファレンス 関数 pow
組み込み関数をさらに使い込む
先に紹介したべき乗計算のpow()関数には、第3引数があります。第3引数がNoneでなければ、第3引数の余り(剰余)を返します。べき乗演算子で表すと、"base**expo%mod"と同義です。この余りの計算は、pow()関数の方がべき乗演算子よりも高速で、よく使われています。
先ほどのサンプルコードで、第3引数にmod=7を代入してみます。
# coding: utf-8
base=2
mod=7
for expo in range(-5,6,1):
print(base,"(",expo,"):",pow(base,expo),pow(base,expo,mod))
base=10
for expo in range(-5,6,1):
print(base,"(",expo,"):",pow(base,expo),pow(base,expo,mod))
実行結果は、次の通りです。
2 ( -5 ): 0.03125 2
2 ( -4 ): 0.0625 4
2 ( -3 ): 0.125 1
2 ( -2 ): 0.25 2
2 ( -1 ): 0.5 4
2 ( 0 ): 1 1
2 ( 1 ): 2 2
2 ( 2 ): 4 4
2 ( 3 ): 8 1
2 ( 4 ): 16 2
2 ( 5 ): 32 4
10 ( -5 ): 1e-05 3
10 ( -4 ): 0.0001 2
10 ( -3 ): 0.001 6
10 ( -2 ): 0.01 4
10 ( -1 ): 0.1 5
10 ( 0 ): 1 1
10 ( 1 ): 10 3
10 ( 2 ): 100 2
10 ( 3 ): 1000 6
10 ( 4 ): 10000 4
10 ( 5 ): 100000 5
指数部がマイナス(負)の場合は、余り(剰余)としてモジュラ逆数が戻ります。上記例を見ると、基数が10、指数が-2、7の余り(剰余)の場合は、4が戻っています。この場合は、”4*10**2%7==1”が成立するので4が返っているのがわかります。
【参考】:Python: Python 言語リファレンス 関数 pow
mathライブラリを使用する
Pythonのmathライブラリにも、べき乗関数math.pow()が用意されています。用法は、pow()と同じですが、例外処理がIEEE 754標準にしたがいます。先ほどのサンプルコードは、mathライブラリをimportし、pow()をmath.pow()に置き換えるだけです。
# coding: utf-8
import math
base=2
for expo in range(-5,6,1):
print(base,"(",expo,"):",math.pow(base,expo))
base=10
for expo in range(-5,6,1):
print(base,"(",expo,"):",math.pow(base,expo))
演算では、引数をfloat型に置き換えるため、オーバーフローや桁落ちが発生しやすいものです。通常はべき乗演算子あるいはpow()関数を使用します。試しに、基数7、指数77のべき乗の結果を見てみます。
# coding: utf-8
import math
base=7
expo=77
print("math.pow",base,"(",expo,"):",math.pow(base,expo))
print("pow 関数",base,"(",expo,"):",pow(base,expo))
print("べき乗演算子",base,"(",expo,"):",base**expo)
実行結果は、次の通りです。
math.pow 7 ( 77 ): 1.1818138658059589e+65
pow 関数 7 ( 77 ): 118181386580595879976868414312001964434038548836769923458287039207
べき乗演算子 7 ( 77 ): 118181386580595879976868414312001964434038548836769923458287039207
math.pow()は、”1.1818138658059589e+65”となっており、単精度のfloat型のため、有効桁が少ないことがわかります。ここで示す”e+65”は、10のべき乗表示を意味します。
第2引数の指数を77から777など大きい値を引数で渡すと、pow()関数やべき乗演算子は計算結果が得られますが、math.pow()関数ではオーバーフローが発生します。
【参考】:Python: Python 言語リファレンス math関数 math.pow 【参考】:Python: Python 言語リファレンス データモデル
Pythonライブラリを活用する
より専門的な計算を行うには、Numpyのべき乗関数を利用するなど、さらなる活用も可能です。また、作図などでべき乗表示をする場合は、matplotlibで行うこともできます。
Pythonは、豊富なライブラリ活用がメリットですので、自身の必要なライブラリを入手し、より使いやすい環境を整えましょう。
Pythonはべき乗計算も手軽にできる
Pythonは人気の汎用プログラミング言語であり、データサイエンス向けによく利用されます。デバッグがしやすいため、演算子や関数の評価が手軽にできます。べき乗計算も演算子と関数それぞれが利用できますので、用途に応じて使い分けすることも可能です。
コードは手軽に作成できるため、共通ライブラリ化を進めるとより使い勝手が良くなるでしょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから