Python - Как я могу разделить число на комплексное число, реализуя свой собственный класс для комплексных чисел? - PullRequest
0 голосов
/ 06 марта 2020

В настоящее время я реализую свой собственный класс для комплексных чисел, таких как здесь . И благодаря этому посту мне удалось сделать это для разделения между 2 комплексными числами.

Но у меня все еще есть проблема: я понимаю, что 4 / (42i + 4) и (42i + 4) / 4 не одно и то же, но в моем случае я получу тот же результат. Это потому, что в этом случае программа примет одно число как целое и не сможет разделить целое число на мой сложный объект.

Я понимаю, что мне нужно создать метод __rdiv__, чтобы справиться с этим. Я уже сделал это для других базовых c операций (__add__, __sub__, __mul__), выполнив следующее:

class Complex(object):
    def __init__(self, real=0, imag=0):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        return Complex(self.real + other.real,
                       self.imag + other.imag)

    def __radd__(self, other):
        return self.__add__(other) 

    def __sub__(self, other):
        print(self, other)
        return Complex(self.real - other.real,
                       self.imag - other.imag)

    def __rsub__(self, other):
        return self.__sub__(other)

    def __mul__(self, other):
        # print(self, other)
        return Complex(self.real*other.real - self.imag*other.imag,
                       self.imag*other.real + self.real*other.imag)

    def __rmul__(self, other):
        return self.__mul__(other)

Но я не могу использовать те же логи c с делением. Возможно, математика должна быть другой, но я не могу обдумать это. Может ли кто-нибудь помочь мне в этом? Большое спасибо

Вот мой __div__:

def __div__(self, other):
    conjugation = Complex(other.real, -other.imag)
    denominatorRes = other * conjugation
    denominator = float(denominatorRes.real)
    nominator = self * conjugation
    try:
        return Complex(nominator.real/denominator, nominator.imag/denominator)
    except ZeroDivisionError as e:
        print e
        return None

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Готово!

Проблема была не в математике, а в моей логике c. Вот мой код:

class Complex(object):
    def __init__(self, real=0, imag=0):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        # if isinstance(other, (float,int)):
        #   other = Complex(other)
        return Complex(self.real + other.real,
                       self.imag + other.imag)

    def __radd__(self, other):
        return self.__add__(other) 

    def __mul__(self, other):
        # if isinstance(other, (float,int)):
        #   other = Complex(other)
        return Complex(self.real*other.real - self.imag*other.imag,
                       self.imag*other.real + self.real*other.imag)

    def __rmul__(self, other):
        return self.__mul__(other)

    def __sub__(self, other):
        if isinstance(other, (float,int)):
            other = Complex(other)
        return Complex(self.real - other.real,
                       self.imag - other.imag)

    def __rsub__(self, other):
        if isinstance(other, (float,int)):
            other = Complex(other)
        return other.__sub__(self)

    def __div__(self, other):
        if isinstance(other, (float,int)):
            other = Complex(other)
        s1, s2, o1, o2 = self.real, self.imag, other.real, other.imag
        r = float(o1**2 + o2**2)
        try: 
            return Complex((s1*o1+s2*o2)/r, (s2*o1-s1*o2)/r)
        except ZeroDivisionError as e:
            print e
            return None

    def __rdiv__(self, other):
        if isinstance(other, (float,int)):
            other = Complex(other)
        return other.__div__(other)
    ```
0 голосов
/ 06 марта 2020
def __truediv__(self, other):
    return Complex((self.real * other.real + self.imag * other.imag) / (other.real ** 2 + other.imag ** 2), (self.imag * other.real - self.real * other.imag) / (other.real ** 2 + other.imag ** 2))

источник: wolfram mathworld

...