Python
 Computer >> コンピューター >  >> プログラミング >> Python

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

解決の手順

  1. 実部 re と虚部 im を持つ Complex クラスを定義する
  2. __add__(self, o):新しい Complex オブジェクト (re + o.re, im + o.im) を返す
  3. __sub__(self, o):新しい Complex オブジェクト (re − o.re, im − o.im) を返す
  4. __mul__(self, o):新しい Complex オブジェクト (re×o.re − im×o.im, re×o.im + im×o.re) を返す
  5. __truediv__(self, o):m = o.re² + o.im² とし、新しい Complex オブジェクト ((re×o.re + im×o.im)/m, (im×o.re − re×o.im)/m) を返す
  6. mod():√(re² + im²)(実部と虚部の二乗和の平方根)を返す
  7. __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 型のように自然な記述で独自クラスを扱えるようになり、コードの可読性と再利用性が大きく向上します。

  1. 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, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法

  2. 【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説

    本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が