ユーニックス総合研究所

  • home
  • archives
  • python-pow

Pythonでべき乗する方法(**演算子とpow関数)

  • 作成日: 2022-04-29
  • 更新日: 2023-12-25
  • カテゴリ: Python

Pythonでべき乗する方法

結論から言うとPythonでべき乗するには**演算子かpow()関数を使います。
つまり↓のどちらかです。

result = 2 ** 8  
print(result)  # 256  

result = pow(2, 8)  
print(result)  # 256  

この記事ではPythonで行うべき乗について詳しく解説します。

そもそもべき乗ってなに?

べき乗」とは数学で出てくる概念です。
これは掛け算と似ています。

たとえば「2の8乗」というべき乗は↓のように書きます。

2^8  

「2の8乗」は「2を8回かけた数」になります。
つまり「2の8乗」では↓の式を計算することと同じになります。

258 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2  

↑のように掛け算を使ってべき乗を表現してもいいのですが、めんどくさいですよね。
そのため「2^8」という短い表記が使われています。

ちなみに「2^8」というのはべき乗の特殊な表記で間違いではないのですが、数学の正確な表記はちがっています。
実際の数学では「2」の右上に小さく「8」と書いて表現します。

べき乗に似ているものに累乗というのもありますが、これは右上の小さい数字が整数に限定されています。
べき乗の場合は分数や実数も可能です。

べき乗の面白い性質として右上の小さい数字が0のときは、結果は1になります。

Pythonのべき乗を計算する演算子

Pythonには組み込みの演算子として、べき乗を計算する演算子が用意されています。
その名も「**」です。

これは日本語にすると何が適当なのでしょうか?
べき乗演算子でしょうか?
ここではべき乗演算子で統一します。

べき乗演算子の左側に数値を書き、演算子の右側にその数値を何回掛けるか書きます。
つまり「2の8乗」を表現したい場合は↓のように書きます。

2 ** 8  

2 ** 8の結果は256になります。
これは先ほども書きましたが、2 ** 8が↓の計算式と同じ結果になるからです。

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2  

ためしに↓のようなif文を書いてみます。

if 256 == 2 ** 8:  
    print('256です')  

結果は「256です」と出力されます。

**は演算子ですので、複数書いてつなげることも可能です。

result = 2 ** 2 ** 2  
print(result)  # 16  

↑の場合、結果は16になります。
まず左側の2 ** 2が計算されます。
「2の2乗」は「2 * 2」になって「4」になります。

そして残りの4 ** 2という演算が行われます。
「4の2乗」の結果は「4 * 4」になって「16」になります。

**演算子を連ねて書くと簡単に大きな値を作ることができます。
パソコンの性能によっては計算が終わらずフリーズしたような状態になることもあります。
じっさい筆者は「2 ** 8 ** 8」という演算を実行しましたが、計算が終わらずにCtrl + Cを押しました。

それから演算子の右側に0を付けた場合は結果は1になります。
これは数学の場合と同じですね。

result = 2 ** 0  
print(result)  # 1  

べき乗を計算するpow関数

**演算子のほかにはPythonには組み込みのpow関数というのもあります。
この関数を使ってべき乗を計算できます。

result = pow(2, 8)  
print(result)  # 256  

pow関数は第3引数があります。
この第3引数には「べき乗の結果に割りたい値」を指定します。
第3引数が指定されている場合は、そのべき乗の結果に「第3引数を割ったあまりの数」が求まります。
つまりpow(2, 4, 3)というのを掛け算などで表現すると↓のようになります。

result = (2 * 2 * 2 * 2) % 3  
print(result)  # 1  

実際に「2の4乗に3を割る」という計算をpow()でやってみます。

result = pow(2, 4, 3)  
print(result)  # 1  

結果は同じになりました。
この第3引数が用意されているということは、このような演算がよく行われるということになります。
じっさいにどういうケースでこういった演算が行われるかは不明ですが。

🦝 < というかpow自体あまり使わないんだけど

🐭 < 文系やね

演算子と関数、どっちが早いか?

**演算子とpow関数のどちらのほうが早いか計測してみます。
予想としては関数は関数呼び出しがあるのでその分遅くなるんじゃないかと思われます。

検証用のコードは↓になります。

import time  

a = 2  
b = 500000000  # 5千万  

start = time.time()  

a ** b  

goal = time.time() - start  

print(f'{a} ** {b}:', goal)  
# 2 ** 500000000: 1.8433279991149902  


start = time.time()  

pow(a, b)  

goal = time.time() - start  

print(f'pow({a}, {b}):', goal)  
# pow(2, 500000000): 1.865696907043457  

「2の5千万乗」で計測してみました。
結果はわずかに**演算子のほうが早かったです。

この計測結果はWindowsのWSL2環境によるものです。
環境によっては結果が大きく異なることもありますので注意してください。

おわりに

今回はPythonのべき乗について詳しく見てみました。
べき乗を使うと簡単に大きな数を表現できるので便利ですよね。

🦝 < べき乗で大きな数を表現しよう

🐭 < ビッグナンバー