Pythonで複素数クラスを定義する方法|四則演算と絶対値の実装例
はじめに
本記事では、Pythonで複素数(虚数)を扱うための独自クラス「Complex」を定義し、四則演算や絶対値(モジュラス)の計算を実装する方法を解説します。演算子オーバーロードを活用することで、直感的なコードで複素数を操作できるようになります。
実装する機能
- add():2つの複素数の加算
- sub():2つの複素数の減算
- mul():2つの複素数の乗算
- div():2つの複素数の除算
- mod():複素数の絶対値(大きさ)を取得
複素数は (a + bi) の形式で表示します。2つの複素数に対しこれらの演算を行いますが、クラス内部では add()・sub()・mul()・div() に対応する特殊メソッド(__add__、__sub__、__mul__、__truediv__)をオーバーロードすることで、「+」「-」「*」「/」といった通常の演算子で直接計算できるようにします。さらに __str__() メソッドもオーバーロードし、複素数を読みやすい形式で出力できるようにします。
たとえば、入力が c1 = 2+3i、c2 = 5-2i のとき、出力は次のようになります。
(7.00 + 1.00i), (-3.00 + 5.00i), (16.00 + 11.00i), (0.14 + 0.66i), 3.61, 5.39
解決の手順
- 実部 re と虚部 im を持つ Complex クラスを定義する
- __add__(self, o):新しい Complex オブジェクト (re + o.re, im + o.im) を返す
- __sub__(self, o):新しい Complex オブジェクト (re − o.re, im − o.im) を返す
- __mul__(self, o):新しい Complex オブジェクト (re×o.re − im×o.im, re×o.im + im×o.re) を返す
- __truediv__(self, o):m = o.re² + o.im² とし、新しい Complex オブジェクト ((re×o.re + im×o.im)/m, (im×o.re − re×o.im)/m) を返す
- mod():√(re² + im²)(実部と虚部の二乗和の平方根)を返す
- __str__() をオーバーロードし、以下のルールで文字列化する
- im が 0 の場合 → 実部のみを小数第2位まで表示
- re が 0 の場合 → 虚部のみを小数第2位まで表示
- im が負の場合 → 「re − |im|i」の形式で小数第2位まで表示
- 上記以外 → 「re + im i」の形式で小数第2位まで表示
サンプルコード
以下の実装例を見て、実際の動きを確認してみましょう。
from math import sqrt
class Complex:
def __init__(self, real, imag):
self.re = real
self.im = imag
# 加算(+ 演算子)
def __add__(self, o):
return Complex(self.re + o.re, self.im + o.im)
# 減算(- 演算子)
def __sub__(self, o):
return Complex(self.re - o.re, self.im - o.im)
# 乗算(* 演算子)
def __mul__(self, o):
return Complex(self.re * o.re - self.im * o.im,
self.re * o.im + self.im * o.re)
# 除算(/ 演算子)
def __truediv__(self, o):
m = o.re * o.re + o.im * o.im
return Complex((self.re * o.re + self.im * o.im) / m,
(self.im * o.re - self.re * o.im) / m)
# 絶対値(モジュラス)
def mod(self):
return sqrt(self.re ** 2 + self.im ** 2)
# 表示形式の整形
def __str__(self):
if self.im == 0:
return '%.2f' % self.re
if self.re == 0:
return '%.2fi' % self.im
if self.im < 0:
return '%.2f - %.2fi' % (self.re, -self.im)
else:
return '%.2f + %.2fi' % (self.re, self.im)
def solve(comp1, comp2):
print(comp1 + comp2)
print(comp1 - comp2)
print(comp1 * comp2)
print(comp1 / comp2)
print('%.2f' % comp1.mod())
print('%.2f' % comp2.mod())
comp1 = Complex(2, 3)
comp2 = Complex(5, -2)
solve(comp1, comp2)入力
2, 3
5, -2出力
7.00 + 1.00i
-3.00 + 5.00i
16.00 + 11.00i
0.14 + 0.66i
3.61
5.39実行結果のポイント
加算では実部同士・虚部同士をそれぞれ足し合わせます。乗算は数学の公式 (a+bi)(c+di) = (ac−bd) + (ad+bc)i に従って実装しています。除算では、分母の共役複素数を掛けて分母を実数化する考え方を、m = c² + d² で割る形でシンプルに表現しています。また、mod() は三平方の定理と同様に √(a²+b²) を計算するため、|2+3i| ≒ 3.61、|5−2i| ≒ 5.39 という結果が得られます。
このように特殊メソッドをオーバーロードすれば、Python標準の complex 型のように自然な記述で独自クラスを扱えるようになり、コードの可読性と再利用性が大きく向上します。
-
Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法
本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法
-
【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説
本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が