1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/python3

"""
Строка с описанием модуля
"""

import random
import math


class MyComplex:
    def __init__(self, real=0, imag=0):
        """
        Строка документации для метода __init__.
        Как вы помните, такие строки автоматически подхватиываются системати
        документирования и входят в документацую.

        :param real: действительная часть
        :param imag: мнимая часть
        """
        self.real = real
        self.imag = imag

    def __add__(self, other):
        result = MyComplex(self.real, self.imag)
        result.real += other.real
        result.imag += other.imag
        return result

    def __sub__(self, other):
        result = MyComplex(self.real, self.imag)
        result.real -= other.real
        result.imag -= other.imag
        return result

    def __mul__(self, other):
        result = MyComplex()
        result.real = self.real * other.real - self.imag * other.imag
        result.imag = self.real * other.imag + self.imag * other.real
        return result

    def __truediv__(self, other):
            other_abs = other.real * other.real + other.imag * other.imag
            return MyComplex((self.real * other.real + self.imag * other.imag) / other_abs,
                             (self.imag * other.real - self.real *other. imag) / other_abs)

    def __str__(self):
        return str(self.real)+'+j*'+str(self.imag)


def autotest():
    """
    Функция для автоматического тестирования. В данное случае, просто сравнить результаты
    операций с нашим типом с результатами операций с типом complex. Тест повторяется
    10 раз для различных случайных
    """
    for i in range(10):
        re1 = random.uniform(0, 10)  # Случайное число с плавающей точкой от 0 до 10.
        im1 = random.uniform(0, 10)
        re2 = random.uniform(0, 10)
        im2 = random.uniform(0, 10)
        a = MyComplex(re1, im1)
        b = MyComplex(re2, im2)
        x = complex(re1, im1)
        y = complex(re2, im2)

        # Умножаем слои числа и строенные числа и сравниваем результаты.
        # Просто так равнить не можем, так как не определили в MyComplex метод __eq__
        c = a + b
        z = x + y
        assert c.real == z.real and c.imag == z.imag

        c = a - b
        z = x - y
        assert c.real == z.real and c.imag == z.imag

        c = a * b
        z = x * y
        assert c.real == z.real and c.imag == z.imag

        c = a / b
        z = x / y
        # Так как деление встроенных комплексных чисел вычисляется по оптимизированной формуле
        # и не всегда даёт такой же результат, как наше, будем считать, что наше работает, если
        # они расходятся не более, чем на 1e-10. Добро пожаловать в реальный мир.
        assert abs(c.real - z.real) < 1e-10 and abs(c.imag - z.imag) < 1e-10


if __name__ == "__main__":
    autotest()
    print("Autotesting passed successfully")