Python math.exp2() 関数
科学計算やコンピュータの分野では、2のべき乗(powers of 2)は最も基本的な指数演算の一つです。アルゴリズムの複雑度分析、暗号学、コンピュータのストレージ単位など、いずれも2のべき乗の計算に欠かせません。
math.exp2()は Python 3.11 で導入された関数で、専ら2のx乗、すなわち2ˣを計算します。
単語の意味: exp2は "exponential base 2" の略で、「2を底とする指数」という意味です。
基本構文とパラメータ
math.exp2()は math モジュールの静的関数で、使用時にはまず math モジュールをインポートする必要があります。
構文形式
import math math.exp2(x)
パラメータの説明
- パラメータ:
x- 型:数値(整数または浮動小数点数)
- 説明:指数。2の何乗かを表します。
戻り値
- 2のx乗、すなわち2ˣを返します。
- 戻り値の型は浮動小数点数です。
例
例を通してmath.exp2()の使い方を徹底的にマスターしましょう。
例1:基本的な使い方 - 2の整数乗を計算する
例
import math
# 2の整数乗を計算する
print("2の0乗:", math.exp2(0)) # 1
print("2の1乗:", math.exp2(1)) # 2
print("2の2乗:", math.exp2(2)) # 4
print("2の3乗:", math.exp2(3)) # 8
print("2の4乗:", math.exp2(4)) # 16
print("2の5乗:", math.exp2(5)) # 32
print("2の10乗:", math.exp2(10)) # 1024
# 負の整数乗
print("\n"負の整数乗:")
print("2の-1乗:", math.exp2(-1)) # 0.5
print("2の-2乗:", math.exp2(-2)) # 0.25
print("2の-3乗:", math.exp2(-3)) # 0.125
# 2の整数乗を計算する
print("2の0乗:", math.exp2(0)) # 1
print("2の1乗:", math.exp2(1)) # 2
print("2の2乗:", math.exp2(2)) # 4
print("2の3乗:", math.exp2(3)) # 8
print("2の4乗:", math.exp2(4)) # 16
print("2の5乗:", math.exp2(5)) # 32
print("2の10乗:", math.exp2(10)) # 1024
# 負の整数乗
print("\n"負の整数乗:")
print("2の-1乗:", math.exp2(-1)) # 0.5
print("2の-2乗:", math.exp2(-2)) # 0.25
print("2の-3乗:", math.exp2(-3)) # 0.125
実行結果:
2 的 0 次方: 1.0 2 的 1 次方: 2.0 2 的 2 次方: 4.0 2 的 3 次方: 8.0 2 的 4 次方: 16.0 2 的 5 次方: 32.0 2 的 10 次方: 1024.0 负整数次幂: 2 的 -1 次方: 0.5 2 的 -2 次方: 0.25 2 的 -3 次方: 0.125
例2:浮動小数点数のべき乗
math.exp2()浮動小数点数のべき乗にも対応しており、これは科学計算で非常に役立ちます。
例
import math
# 2の浮動小数点数乗を計算する
print("2の0.5乗:", math.exp2(0.5)) # √2 ≈ 1.414
print("2の1.5乗:", math.exp2(1.5)) # 2√2 ≈ 2.828
print("2の2.5乗:", math.exp2(2.5)) # 4√2 ≈ 5.657
# Pythonの組み込み関数で検証
import math
print("\n"検証 (2^x = 2のx乗):")
for x in [0, 0.5, 1, 1.5, 2, 3]:
print(f"math.exp2({x}) = {math.exp2(x)}, 2**{x} = {2**x}")
# 2の浮動小数点数乗を計算する
print("2の0.5乗:", math.exp2(0.5)) # √2 ≈ 1.414
print("2の1.5乗:", math.exp2(1.5)) # 2√2 ≈ 2.828
print("2の2.5乗:", math.exp2(2.5)) # 4√2 ≈ 5.657
# Pythonの組み込み関数で検証
import math
print("\n"検証 (2^x = 2のx乗):")
for x in [0, 0.5, 1, 1.5, 2, 3]:
print(f"math.exp2({x}) = {math.exp2(x)}, 2**{x} = {2**x}")
実行結果:
2 的 0.5 次方: 1.4142135623730951 2 的 1.5 次方: 2.8284271247461903 2 的 2.5 次方: 5.656854249492381 验证: math.exp2(0.5) = 1.4142135623730951, 2**0.5 = 1.4142135623730951 math exp2(1) = 2.0, 2**1 = 2 math.exp2(1.5) = 2.8284271247461903, 2**1.5 = 2.8284271247461903 math.exp2(2) = 4.0, 2**2 = 4 math.exp2(3) = 8.0, 2**3 = 8
例3:実際の応用 - コンピュータのストレージ単位
2のべき乗は、コンピュータではストレージ容量の計算に使用されます。
例
import math
# コンピュータのストレージ単位(2のべき乗に基づく)
print("=== コンピュータのストレージ単位 ===")
units = [
(0, "B(バイト)"),
(10, "KB(キロバイト)"),
(20, "MB(メガバイト)"),
(30, "GB(ギガバイト)"),
(40, "TB(テラバイト)"),
(50, "PB(ペタバイト)")
]
for exp, unit_name in units:
bytes_val = math.exp2(exp)
if exp >= 40:
print(f"1 {unit_name}: {bytes_val:.2e} バイト")
else:
print(f"1 {unit_name}: {int(bytes_val)} バイト")
# 既知のファイルサイズから、対応する単位を求める
file_size = 1073741824 # 1GB = 2^30
print(f"\n"ファイルサイズ {file_size} バイト = {file_size / math.exp2(30):.2f} GB")
# コンピュータのストレージ単位(2のべき乗に基づく)
print("=== コンピュータのストレージ単位 ===")
units = [
(0, "B(バイト)"),
(10, "KB(キロバイト)"),
(20, "MB(メガバイト)"),
(30, "GB(ギガバイト)"),
(40, "TB(テラバイト)"),
(50, "PB(ペタバイト)")
]
for exp, unit_name in units:
bytes_val = math.exp2(exp)
if exp >= 40:
print(f"1 {unit_name}: {bytes_val:.2e} バイト")
else:
print(f"1 {unit_name}: {int(bytes_val)} バイト")
# 既知のファイルサイズから、対応する単位を求める
file_size = 1073741824 # 1GB = 2^30
print(f"\n"ファイルサイズ {file_size} バイト = {file_size / math.exp2(30):.2f} GB")
実行結果:
=== 计算机存储单位 === 1 B (字节): 1 字节 1 KB (千字节): 1024 字节 1 MB (兆字节): 1048576 字节 1 GB (吉字节): 1073741824 字节 1 TB (太字节): 1099511627776 字节 1 PB (拍字节): 1.12e+15 字节 文件大小 1073741824 字节 = 1.00 GB
例4:アルゴリズムの複雑度分析
2のべき乗はアルゴリズム分析で非常に一般的であり、指数関数的な成長を表すために使用されます。
例
import math
# 指数関数的な成長を表示
print("=== 指数関数的な成長 (2^n) ===")
for n in range(1, 11):
result = math.exp2(n)
# * で成長を可視化
stars = "*" * min(int(result / math.exp2(4)), 50)
print(f"n={n:2d}: {int(result):6d} {stars}")
# 対数複雑度:log2(n)
print("\n"=== 対数複雑度 (log2 n) ===")
for n in [1, 2, 4, 8, 16, 32, 64, 128, 256, 1024]:
log_val = math.log2(n)
print(f"log2({n:4d}) = {log_val:.2f}")
# 指数関数的な成長を表示
print("=== 指数関数的な成長 (2^n) ===")
for n in range(1, 11):
result = math.exp2(n)
# * で成長を可視化
stars = "*" * min(int(result / math.exp2(4)), 50)
print(f"n={n:2d}: {int(result):6d} {stars}")
# 対数複雑度:log2(n)
print("\n"=== 対数複雑度 (log2 n) ===")
for n in [1, 2, 4, 8, 16, 32, 64, 128, 256, 1024]:
log_val = math.log2(n)
print(f"log2({n:4d}) = {log_val:.2f}")
実行結果:
=== 指数级增长 (2^n) === n= 1: 2 n= 2: 4 n= 3: 8 ** n= 4: 16 *** n= 5: 32 ****** n= 、物理 6: 64 ************ n= 7: 128 ************************* n= 8: 256 ****************************************** n= 9: 512 ************************************************************ n=10: 1024 ******************************************************************* === 对数复杂度 (log2 n) === 关系 log2( 1) = 0.00 log2( 2) = 1.00 log2( 4) = 2.00 log3( 8) = 3.任意值 0 log2( 16) = 3.00 log2( 32) = 4.00 密码学应用
例5:暗号学とネットワークセキュリティ
暗号学では、2のべき乗を使用して鍵空間のサイズを計算します。
例
import math
# 鍵空間のサイズ
print("=== 鍵空間のサイズ ===")
key_lengths = [64, 128, 256, 512]
for bits in key_lengths:
key_space = math.exp2(bits)
print(f"{bits} ビット鍵: {key_space:.2e} 通りの可能性")
# セキュリティ強度の比較
print("\n"=== セキュリティ強度の比較 ===")
# 毎秒100京回(10^18)試行できると仮定
attempts_per_second = 10**18
seconds_per_year = 365 * 24 * 3600
for bits in [64, 128, 256]:
key_space = math.exp2(bits)
years_to_crack = key_space / (attempts_per_second * seconds_per_year)
print(f"{bits} ビット鍵: 解読には {years_to_crack:.2e} 年かかります")
# 鍵空間のサイズ
print("=== 鍵空間のサイズ ===")
key_lengths = [64, 128, 256, 512]
for bits in key_lengths:
key_space = math.exp2(bits)
print(f"{bits} ビット鍵: {key_space:.2e} 通りの可能性")
# セキュリティ強度の比較
print("\n"=== セキュリティ強度の比較 ===")
# 毎秒100京回(10^18)試行できると仮定
attempts_per_second = 10**18
seconds_per_year = 365 * 24 * 3600
for bits in [64, 128, 256]:
key_space = math.exp2(bits)
years_to_crack = key_space / (attempts_per_second * seconds_per_year)
print(f"{bits} ビット鍵: 解読には {years_to_crack:.2e} 年かかります")
実行結果: その他の拡張
Python math モジュール