【完全版】Pythonのmathモジュール使い方ガイド|数学計算が簡単になる関数と定数を総まとめ

python

Pythonで数学の計算をする時、電卓を使ったり、複雑な式を自分で書いたりしていませんか?

実は、Pythonには「mathモジュール」という便利な機能があり、これを使うと数学計算がとても簡単になります。

平方根、三角関数、対数計算など、中学・高校で習う数学から、大学レベルの高度な計算まで、mathモジュールがあれば簡単にできてしまいます。

プログラミング初心者でも、数学が苦手な人でも、このモジュールを使えば複雑な計算が一行で済みます。

この記事では、mathモジュールに含まれる関数と定数を、具体例と一緒にわかりやすく紹介します。

スポンサーリンク

mathモジュールってなに?

数学計算専用の便利な道具箱

mathモジュールは、Pythonに最初から入っている「数学計算専用の関数と定数の集まり」です。

普通なら複雑な計算式を書かないといけない数学の処理が、たった一行で済むようになります。

例えば、16の平方根を計算したい時:

  • 手計算:「16の平方根は…4だ!」
  • 電卓:「√16を押して…4」
  • Python(mathモジュール):math.sqrt(16) → 4.0

このように、プログラムの中で簡単に数学計算ができるようになります。

mathモジュールを使う準備

mathモジュールを使う前に、必ず最初に「インポート」という作業が必要です。

基本的な使い方

import math

# これで、math.関数名() の形で使えるようになります
print(math.sqrt(16))  # 4.0(16の平方根)
print(math.pi)        # 3.141592653589793(円周率)

よく使う関数だけインポートする方法

from math import sqrt, pi

# math.を付けなくても使えます
print(sqrt(16))  # 4.0
print(pi)        # 3.141592653589793

どちらの方法でも使えますが、最初はimport mathの方法がわかりやすくておすすめです。

では、mathモジュールにどんな便利な機能があるか、詳しく見ていきましょう。

数値を整える関数(数値操作関数)

小数を整数にする関数

プログラムで計算していると、「小数を整数にしたい」という場面がよくあります。mathモジュールには、いろいろな方法で小数を整数に変換する関数があります。

ceil(x):切り上げ

import math

print(math.ceil(3.1))   # 4(3.1以上の最小の整数)
print(math.ceil(3.9))   # 4
print(math.ceil(-2.1))  # -2(負の数は0に近い方向)

# 実用例:必要なページ数を計算
total_items = 23
items_per_page = 10
pages_needed = math.ceil(total_items / items_per_page)
print(f"必要なページ数: {pages_needed}")  # 3ページ

floor(x):切り捨て

print(math.floor(3.1))   # 3(3.1以下の最大の整数)
print(math.floor(3.9))   # 3
print(math.floor(-2.1))  # -3(負の数は0から遠い方向)

# 実用例:年齢を計算
days_lived = 7500
age = math.floor(days_lived / 365)
print(f"年齢: 約{age}歳")  # 約20歳

trunc(x):整数部分だけ取り出し

print(math.trunc(3.9))   # 3(小数点以下を切り捨て)
print(math.trunc(-3.9))  # -3(符号はそのまま)

# 実用例:時間と分を分ける
total_minutes = 90.5
hours = math.trunc(total_minutes / 60)
minutes = total_minutes % 60
print(f"{hours}時間{minutes}分")  # 1時間30.5分

絶対値と符号の操作

fabs(x):絶対値

print(math.fabs(-5.7))   # 5.7
print(math.fabs(3.2))    # 3.2

# 実用例:温度の差を計算
temp1 = 25.5
temp2 = 18.3
difference = math.fabs(temp1 - temp2)
print(f"温度差: {difference}度")  # 7.2度

copysign(x, y):符号をコピー

print(math.copysign(5, -1))    # -5.0(5の絶対値に-1の符号)
print(math.copysign(-3, 2))    # 3.0(3の絶対値に2の符号)

# 実用例:プレイヤーの向きを設定
speed = 5
direction = -1  # 左向き
velocity = math.copysign(speed, direction)
print(f"速度: {velocity}")  # -5.0

便利な数学計算

factorial(x):階乗

print(math.factorial(5))   # 120(5! = 5×4×3×2×1)
print(math.factorial(0))   # 1(0! = 1)

# 実用例:組み合わせの計算で使用
# 5人の中から3人を選ぶ場合の数
# C(5,3) = 5! / (3! × 2!)
n = 5
k = 3
combinations = math.factorial(n) // (math.factorial(k) * math.factorial(n-k))
print(f"組み合わせの数: {combinations}")  # 10

gcd(x, y):最大公約数

print(math.gcd(12, 18))    # 6
print(math.gcd(15, 25))    # 5

# 実用例:分数を約分
numerator = 12
denominator = 18
common_divisor = math.gcd(numerator, denominator)
simplified_num = numerator // common_divisor
simplified_den = denominator // common_divisor
print(f"{numerator}/{denominator} = {simplified_num}/{simplified_den}")  # 12/18 = 2/3

数値を整える関数は、日常的なプログラムでよく使います。次は、もう少し高度な数学計算を見てみましょう。

指数・対数関数で高度な計算

指数関数(べき乗の計算)

指数関数は、「ある数を何回かけるか」という計算です。複利計算や人口増加の予測などでよく使われます。

exp(x):ネイピア数のx乗

print(math.exp(1))     # 2.718281828459045(e^1 = e)
print(math.exp(0))     # 1.0(e^0 = 1)
print(math.exp(2))     # 7.38905609893065(e^2)

# 実用例:複利計算の基礎
principal = 100000  # 元本10万円
rate = 0.05        # 年利5%
time = 3           # 3年
# 連続複利の場合
amount = principal * math.exp(rate * time)
print(f"3年後の金額: {amount:.0f}円")  # 約116,183円

pow(x, y):xのy乗

print(math.pow(2, 3))    # 8.0(2の3乗)
print(math.pow(4, 0.5))  # 2.0(4の0.5乗 = 平方根)

# 実用例:面積から一辺の長さを計算
area = 25  # 正方形の面積
side = math.pow(area, 0.5)  # 平方根
print(f"一辺の長さ: {side}cm")  # 5.0cm

sqrt(x):平方根

print(math.sqrt(16))     # 4.0
print(math.sqrt(2))      # 1.4142135623730951

# 実用例:ピタゴラスの定理
a = 3  # 直角三角形の一辺
b = 4  # もう一辺
c = math.sqrt(a**2 + b**2)  # 斜辺
print(f"斜辺の長さ: {c}")  # 5.0

対数関数(指数の逆計算)

対数は「何乗すれば、その数になるか」を求める計算です。データ分析や音楽、地震の計算などで使われます。

log(x, base):対数計算

print(math.log(8, 2))     # 3.0(2の何乗が8か → 2^3 = 8)
print(math.log(100, 10))  # 2.0(10の何乗が100か → 10^2 = 100)
print(math.log(math.e))   # 1.0(自然対数:eの何乗がeか → e^1 = e)

# 実用例:音の大きさ(デシベル)計算
power1 = 1    # 基準の音の強さ
power2 = 100  # 比較する音の強さ
decibels = 10 * math.log(power2 / power1, 10)
print(f"音の大きさ: {decibels}dB")  # 20dB

log10(x)、log2(x):よく使われる対数

print(math.log10(1000))   # 3.0(1000 = 10^3)
print(math.log2(1024))    # 10.0(1024 = 2^10)

# 実用例:コンピュータのメモリサイズ
memory_bytes = 1024 * 1024 * 1024  # 1GB
memory_power = math.log2(memory_bytes)
print(f"2の{memory_power:.0f}乗バイト")  # 2の30乗バイト

指数・対数関数は最初は難しく感じるかもしれませんが、科学計算やデータ分析では欠かせない機能です。次は、身近な三角関数を見てみましょう。

三角関数で角度と距離の計算

基本的な三角関数

三角関数は、角度から座標を計算したり、波の形を作ったりする時に使います。ゲーム開発、アニメーション、音楽制作などでよく使われます。

sin(x)、cos(x)、tan(x):基本の三角関数

import math

# 注意:Pythonの三角関数はラジアン単位です
angle_degrees = 30  # 30度
angle_radians = math.radians(angle_degrees)  # ラジアンに変換

print(f"sin(30°) = {math.sin(angle_radians):.3f}")  # 0.500
print(f"cos(30°) = {math.cos(angle_radians):.3f}")  # 0.866
print(f"tan(30°) = {math.tan(angle_radians):.3f}")  # 0.577

# 実用例:円周上の点の座標を計算
radius = 10  # 半径10の円
angle = 45   # 45度
x = radius * math.cos(math.radians(angle))
y = radius * math.sin(math.radians(angle))
print(f"座標: ({x:.2f}, {y:.2f})")  # (7.07, 7.07)

角度の変換関数

# 度 ↔ ラジアンの変換
degrees = 90
radians = math.radians(degrees)
print(f"{degrees}度 = {radians:.3f}ラジアン")  # 90度 = 1.571ラジアン

radians = math.pi / 4
degrees = math.degrees(radians)
print(f"{radians:.3f}ラジアン = {degrees}度")  # 0.785ラジアン = 45度

逆三角関数(角度を求める)

座標から角度を計算したい時に使います。

asin(x)、acos(x)、atan(x):逆三角関数

# 正弦値から角度を求める
sin_value = 0.5
angle_radians = math.asin(sin_value)
angle_degrees = math.degrees(angle_radians)
print(f"sin値が0.5の角度: {angle_degrees}度")  # 30度

# 実用例:斜面の角度を計算
height = 3  # 高さ
length = 5  # 斜辺の長さ
angle = math.degrees(math.asin(height / length))
print(f"斜面の角度: {angle:.1f}度")  # 36.9度

atan2(y, x):座標から角度を求める

# 原点から点(x, y)への角度を計算
x = 3
y = 4
angle_radians = math.atan2(y, x)
angle_degrees = math.degrees(angle_radians)
print(f"角度: {angle_degrees:.1f}度")  # 53.1度

# 実用例:キャラクターが敵の方向を向く
player_x, player_y = 0, 0
enemy_x, enemy_y = 10, 10
direction = math.atan2(enemy_y - player_y, enemy_x - player_x)
direction_degrees = math.degrees(direction)
print(f"敵の方向: {direction_degrees:.1f}度")  # 45.0度

実用的な三角関数の活用例

円運動のアニメーション

import math

def circle_position(time, radius=5, speed=1):
    """時間に応じて円周上の位置を計算"""
    angle = speed * time
    x = radius * math.cos(angle)
    y = radius * math.sin(angle)
    return x, y

# 時間0秒から5秒まで、0.5秒ごとの位置
for t in range(0, 11):
    time = t * 0.5
    x, y = circle_position(time)
    print(f"時間{time}秒: ({x:.2f}, {y:.2f})")

波の計算

def wave_height(x, amplitude=2, frequency=1):
    """正弦波の高さを計算"""
    return amplitude * math.sin(frequency * x)

# x = 0 から 2π まで、波の高さを計算
for i in range(13):
    x = i * math.pi / 6  # 30度ずつ
    height = wave_height(x)
    print(f"x={x:.2f}: 高さ={height:.2f}")

三角関数は、角度や円に関する計算では欠かせません。次は、mathモジュールに用意されている便利な定数を見てみましょう。

便利な数学定数

よく使われる数学定数

mathモジュールには、数学でよく使われる定数があらかじめ用意されています。自分で値を入力する必要がないので、とても便利です。

pi:円周率

print(math.pi)  # 3.141592653589793

# 実用例:円の面積と周囲を計算
radius = 5
area = math.pi * radius**2
circumference = 2 * math.pi * radius
print(f"半径{radius}cmの円:")
print(f"面積: {area:.2f}cm²")      # 78.54cm²
print(f"周囲: {circumference:.2f}cm")  # 31.42cm

e:ネイピア数(自然対数の底)

print(math.e)  # 2.718281828459045

# 実用例:自然増加の計算
initial_population = 1000
growth_rate = 0.1  # 10%増加
time = 2  # 2年
final_population = initial_population * (math.e ** (growth_rate * time))
print(f"2年後の人口: {final_population:.0f}人")  # 1221人

tau:2π

print(math.tau)  # 6.283185307179586

# 実用例:完全な円(360度)をラジアンで表す
full_circle = math.tau
half_circle = math.tau / 2
quarter_circle = math.tau / 4
print(f"360度 = {full_circle:.3f}ラジアン")    # 6.283ラジアン
print(f"180度 = {half_circle:.3f}ラジアン")   # 3.142ラジアン
print(f"90度 = {quarter_circle:.3f}ラジアン")  # 1.571ラジアン

特殊な値

inf:無限大

print(math.inf)    # inf
print(math.inf > 1000000)  # True

# 実用例:最小値を探す時の初期値
def find_minimum(numbers):
    min_value = math.inf  # 最初は無限大
    for num in numbers:
        if num < min_value:
            min_value = num
    return min_value

numbers = [5, 2, 8, 1, 9]
print(f"最小値: {find_minimum(numbers)}")  # 1

nan:非数(Not a Number)

print(math.nan)  # nan
print(math.isnan(math.nan))  # True

# 実用例:無効な計算結果をチェック
def safe_divide(a, b):
    if b == 0:
        return math.nan
    return a / b

result = safe_divide(10, 0)
if math.isnan(result):
    print("計算できませんでした")
else:
    print(f"結果: {result}")

定数を使った実用的な計算例

球の体積計算

def sphere_volume(radius):
    """球の体積を計算"""
    return (4/3) * math.pi * radius**3

radius = 3
volume = sphere_volume(radius)
print(f"半径{radius}cmの球の体積: {volume:.2f}cm³")  # 113.10cm³

振り子の周期計算

def pendulum_period(length, gravity=9.81):
    """振り子の周期を計算"""
    return 2 * math.pi * math.sqrt(length / gravity)

length = 1  # 1メートル
period = pendulum_period(length)
print(f"長さ{length}mの振り子の周期: {period:.2f}秒")  # 2.01秒

数学定数を使うことで、正確で読みやすい計算ができるようになります。最後に、mathモジュールの便利な組み合わせ関数を紹介します。

その他の便利な関数

組み合わせ・順列の計算

数学の確率や統計でよく使われる、組み合わせと順列の計算ができます。

comb(n, k):組み合わせ

# 5人の中から3人を選ぶ組み合わせ
combinations = math.comb(5, 3)
print(f"5人から3人を選ぶ組み合わせ: {combinations}通り")  # 10通り

# 実用例:チーム編成
players = 10
team_size = 5
possible_teams = math.comb(players, team_size)
print(f"{players}人から{team_size}人のチームを作る方法: {possible_teams}通り")  # 252通り

perm(n, k):順列

# 5人の中から3人を順番に選ぶ順列
permutations = math.perm(5, 3)
print(f"5人から3人を順番に選ぶ順列: {permutations}通り")  # 60通り

# 実用例:表彰台の組み合わせ
runners = 8
podium = 3
possible_podiums = math.perm(runners, podium)
print(f"{runners}人の中から1位〜3位を決める方法: {possible_podiums}通り")  # 336通り

精密な計算

fsum(iterable):高精度の合計

# 普通の合計だと誤差が出る場合
numbers = [0.1] * 10
normal_sum = sum(numbers)
precise_sum = math.fsum(numbers)

print(f"通常の合計: {normal_sum}")      # 0.9999999999999999
print(f"高精度の合計: {precise_sum}")    # 1.0

# 実用例:お金の計算
prices = [19.99, 5.99, 12.50, 3.99]
total = math.fsum(prices)
print(f"合計金額: {total}円")  # 42.47円

prod(iterable):積の計算

# リストの全要素の積を計算
numbers = [2, 3, 4, 5]
product = math.prod(numbers)
print(f"{numbers}の積: {product}")  # 120

# 実用例:確率の計算
success_rates = [0.8, 0.9, 0.95]  # 各段階の成功率
total_success_rate = math.prod(success_rates)
print(f"全体の成功率: {total_success_rate:.3f}")  # 0.684 (68.4%)

数値の分解と操作

modf(x):小数部分と整数部分を分ける

number = 123.456
fractional, integer = math.modf(number)
print(f"元の数: {number}")
print(f"小数部分: {fractional}")  # 0.456
print(f"整数部分: {integer}")     # 123.0

# 実用例:時間の表示
total_hours = 5.75
hours, minutes_decimal = math.modf(total_hours)
minutes = minutes_decimal * 60
print(f"{total_hours}時間 = {int(hours)}時間{int(minutes)}分")  # 5時間45分

isqrt(n):整数の平方根

# 平方根の整数部分だけが欲しい場合
number = 50
int_sqrt = math.isqrt(number)
print(f"{number}の整数平方根: {int_sqrt}")  # 7

# 実用例:正方形に並べられる最大数
items = 63
max_per_side = math.isqrt(items)
total_in_square = max_per_side ** 2
remaining = items - total_in_square
print(f"{items}個のアイテムを正方形に並べると:")
print(f"{max_per_side}×{max_per_side} = {total_in_square}個、余り{remaining}個")

まとめ

Pythonのmathモジュールは、プログラミングで数学計算を行う時の強力な味方です。複雑な数式を覚える必要がなく、簡単な関数呼び出しで高度な計算ができます。

覚えておきたい主要な機能

日常的によく使う関数

  • math.sqrt(x):平方根の計算
  • math.ceil(x)math.floor(x):切り上げ・切り捨て
  • math.fabs(x):絶対値
  • math.pow(x, y):べき乗計算

三角関数と角度変換

  • math.sin(x)math.cos(x)math.tan(x):三角関数
  • math.radians(x)math.degrees(x):角度変換
  • math.atan2(y, x):座標から角度を計算

便利な定数

  • math.pi:円周率
  • math.e:ネイピア数
  • math.inf:無限大

高精度計算

  • math.fsum():誤差の少ない合計
  • math.prod():積の計算

使用時の注意点

ラジアンと度の違い Pythonの三角関数はラジアン単位です。度で計算したい場合は、math.radians()で変換しましょう。

適切な関数の選択

  • 整数が欲しい場合:math.floor()math.ceil()
  • 高精度が必要な場合:math.fsum()
  • 大きな数の計算:適切なデータ型の選択

コメント

タイトルとURLをコピーしました