'''Тема урока: тип данных complex
Вещественные числа
Мнимые числа
Комплексные числа
Тип данных complex
Модуль cmath
Аннотация. Урок посвящен комплексным числам, модулям complex и cmath , а также типу данных Complex.

В этом уроке мы изучим численный тип данных Complex. К этому типу данных относятся комплексные числа с заданной действительной и мнимой частью.

Вещественные числа
Как уже было сказано в уроке, объединение рациональных и иррациональных чисел образует множество вещественных чисел. Геометрическая интерпретация множества вещественных чисел – это числовая прямая:



Каждому вещественному числу соответствует определённая точка числовой прямой, и наоборот – каждой точке числовой прямой обязательно соответствует некоторое вещественное число. Другими словами, числовая прямая полностью покрыта вещественными числами.

Мнимые числа
Рассмотрим квадрат произвольного вещественного числа:

2 \cdot 2 = 42⋅2=4
(-2) \cdot (-2) = 4(−2)⋅(−2)=4
0 \cdot 0 = 00⋅0=0
0.1 \cdot 0.1 = 0.010.1⋅0.1=0.01
Результат всегда неотрицательное число. Действительно, пусть aa – произвольное вещественное число. Тогда a \cdot a = a^2 \ge 0a⋅a=a
2
 ≥0. Таким образом, на множестве вещественных чисел, перемножая два одинаковых числа мы всегда получаем неотрицательное число (большее, либо равное нулю).

Представим, что существует число ii (не являющееся вещественным), такое, что i\cdot i = i^2 = -1i⋅i=i
2
 =−1. Будет ли такое обозначение полезным? Оказывается, да!

Такие числа в математике называются мнимыми и обозначают их буквой ii, от слова imaginary (мнимый, воображаемый). Итак, получаем:
i^2 = -1 \Longrightarrow i = \sqrt{-1}.
i
2
 =−1⟹i=
−1
​
 .

С таким числом (обозначением), можно решать задачи, где требуется извлечь квадратный корень из отрицательного числа.

Рассмотрим несколько примеров.

Пример 1. Выразите число \sqrt{-9}
−9
​
  через ii.

Решение. Согласно введенному обозначению можем записать:
\sqrt{-9} = \sqrt{9}\cdot \sqrt{-1} = 3i
−9
​
 =
9
​
 ⋅
−1
​
 =3i

Или в общем виде для любого положительного числа xx существует равенство:
\sqrt{-x} = \sqrt{x}\cdot i
−x
​
 =
x
​
 ⋅i

Пример 2. Посчитать значение выражения (5i)^2(5i)
2
 .

Решение. Согласно определению мнимой единицы i^2 = -1i
2
 =−1, получаем:
(5i)^2= 25i^2 = 25\cdot (-1) = -25.
(5i)
2
 =25i
2
 =25⋅(−1)=−25.

Пример 3. Решите уравнение x^2 + 1 = 0x
2
 +1=0.

Решение. Запишем уравнение в виде x^2 =-1x
2
 =−1. Такое уравнение не имеет решений на множестве вещественных чисел. Однако уравнение имеет решения на множестве мнимых чисел. Имеем:
x^2 = -1 \iff x = \pm \sqrt{-1} = \pm i.
x
2
 =−1⟺x=±
−1
​
 =±i.

Мнимая единица
Число i = \sqrt{-1}i=
−1
​
  называется мнимой единицей. Введение мнимой единицы позволяет расширить множество вещественных чисел до множества комплексных чисел.

Примеры мнимых чисел:

ii	11.67i11.67i	-i−i	3i/43i/4	0.02i0.02i	\pi iπi
Мнимая единица ii обладает интересным свойством: каждый раз при умножении на ii она "циклически" проходит через 4 различных значения:
1 \cdot i = i\\ i \cdot i = -1\\ -1 \cdot i = -i \\ -i \cdot i = 1
1⋅i=i
i⋅i=−1
−1⋅i=−i
−i⋅i=1



Получаем равенства натуральных степеней мнимой единицы:
i = \sqrt{-1}, \, i^2 = -1, \, i^3 = i^2 \cdot i = -i, \, i^4 = i^3 \cdot i = 1, \, i^5 = i^4 \cdot i = i, \ldots
i=
−1
​
 ,i
2
 =−1,i
3
 =i
2
 ⋅i=−i,i
4
 =i
3
 ⋅i=1,i
5
 =i
4
 ⋅i=i,…

Несложно посчитать значения для больших показателей:
i^{100}= (i^2)^{50} = (-1)^{50} = 1, \, i^{55} = (i^2)^{27} \cdot i = -i.
i
100
 =(i
2
 )
50
 =(−1)
50
 =1,i
55
 =(i
2
 )
27
 ⋅i=−i.

Комплексные числа в математике
Комплексное число – комбинация вещественного и мнимого числа. Таким образом, число вида a+bia+bi, где a, ba,b – вещественные числа, называется комплексным числом.

Complex Number

Число aa – называется вещественной (действительной) частью комплексного числа, а число bb – мнимой частью числа.

Примеры комплексных чисел:

1+i1+i	39+4i39+4i	0.5-6.7i0.5−6.7i	-2+\pi i−2+πi	\sqrt{2} + \sqrt{3} i
2
​
 +
3
​
 i
Заметим, что действительная (число aa) и мнимая (число bb) часть комплексного числа a + b ia+bi может быть равна нулю:

Комплексное число	Действительная часть	Мнимая часть	Комментарий
3+2i3+2i	33	22
77	77	00	вещественное число
-5i−5i	00	-5−5	мнимое число
Можем ли мы конструировать одно число на основании двух других? Конечно, можем! И уже делали это, когда вводили рациональные числа. Дробь \dfrac37
7
3
​
  – конструкция на основании двух натуральных чисел 33 и 77. Комплексное число – конструкция на основании вещественного и мнимого числа.

Комплексным числам нет места на числовой прямой, для них нужна так называемая комплексная плоскость. Для графической интерпретации комплексных чисел нам потребуется две взаимно перпендикулярные прямые.

Горизонтальная прямая (ось) отвечает за действительную часть комплексного числа, вертикальная – за мнимую.

complex plane

Любое комплексное число может быть представлено в виде точки на комплексной плоскости. Например, комплексное число 3+4i3+4i выглядит так:

complex plane 3+4i

Обозначения комплексных чисел
Комплексные числа обычно обозначаются буквой z = a+biz=a+bi. Действительная часть комплексного числа обозначается как Re(z) = aRe(z)= a, мнимая часть обозначается Im(z) = bIm(z)=b.

Complex Number Re() and Im()

На комплексной плоскости комплексное число z = a+biz=a+bi выглядит так:

complex plane z example

Модуль комплексного числа
Модулем комплексного числа z = a +biz=a+bi называется вещественное число, равное
|z| = \sqrt{a^2+b^2}
∣z∣=
a
2
 +b
2

​

Такое число, равно расстоянию от точки (a; \, b)(a;b) до начала координат, то есть до точки (0; \, 0)(0;0).

Сложение комплексных чисел
Пусть z_1 = a+ bi, \, z_2 = c + diz
1
​
 =a+bi,z
2
​
 =c+di. Тогда
z_1+z_2 = (a+bi)+ (c+di) = (a+c)+(b+d)i
z
1
​
 +z
2
​
 =(a+bi)+(c+di)=(a+c)+(b+d)i
Пример. Пусть z_1 = 3 + 2i, \, z_2 = 1 + 7iz
1
​
 =3+2i,z
2
​
 = 1+7i, тогда

z_1 + z_2 = (3 + 2i) + (1 + 7i) = (3 + 1) + (2 + 7)i = 4 + 9i.
z
1
​
 +z
2
​
 =(3+2i)+(1+7i)=(3+1)+(2+7)i=4+9i.

Разность комплексных чисел
Пусть z_1 = a+ bi, \, z_2 = c + diz
1
​
 =a+bi,z
2
​
 =c+di. Тогда
z_1- z_2 = (a+bi) - (c+di) = (a-c)+(b-d)i
z
1
​
 −z
2
​
 =(a+bi)−(c+di)=(a−c)+(b−d)i
Пример. Пусть z_1 = 3 + 2i, \, z_2 = 1 + 7iz
1
​
 =3+2i,z
2
​
 = 1+7i, тогда

z_1 - z_2 = (3 + 2i) - (1 + 7i) = (3 - 1) + (2 - 7)i = 2 - 5i.
z
1
​
 −z
2
​
 =(3+2i)−(1+7i)=(3−1)+(2−7)i=2−5i.

Умножение комплексных чисел
Пусть z_1 = a+ bi, \, z_2 = c + diz
1
​
 =a+bi,z
2
​
 =c+di. Тогда
z_1\cdot z_2 = (a+bi) \cdot (c+di) = ac+adi+bci+bdi^2 = (ac-bd)+(ad+bc)i.
z
1
​
 ⋅z
2
​
 =(a+bi)⋅(c+di)=ac+adi+bci+bdi
2
 =(ac−bd)+(ad+bc)i.
   При умножении комплексных чисел возникает i^2i
2
 , значение которого равно -1−1.

Пример 1. Пусть z_1 = 3 + 2i, \, z_2 = 1 + 7iz
1
​
 =3+2i,z
2
​
 = 1+7i, тогда

z_1 \cdot z_2 = (3 + 2i) \cdot (1 + 7i) = (3- 14)+(21+2)i = -11+23i.
z
1
​
 ⋅z
2
​
 =(3+2i)⋅(1+7i)=(3−14)+(21+2)i=−11+23i.

Пример 2. Пусть z = 1+iz=1+i, тогда

z ^2 = z\cdot z = (1+i)\cdot (1+i) = (1-1) + (1+1)i = 0 +2i = 2i.
z
2
 =z⋅z=(1+i)⋅(1+i)=(1−1)+(1+1)i=0+2i=2i.

Сопряженные комплексные числа
Число \bar{z} = a - bi
z
ˉ
 =a−bi называется сопряженным к числу z = a+biz=a+bi. Произведение двух сопряженных чисел является вещественным числом. Действительно:
z \cdot \bar{z} = (a+bi)\cdot (a-bi) = (a^2+b^2)+(-ab+ab)i = a^2+b^2.
z⋅
z
ˉ
 =(a+bi)⋅(a−bi)=(a
2
 +b
2
 )+(−ab+ab)i=a
2
 +b
2
 .

    При умножении сопряженных комплексных чисел возникает i^2i
2
 , значение которого равно -1−1.

Деление комплексных чисел
Пусть z_1 = a+ bi, \, z_2 = c + diz
1
​
 =a+bi,z
2
​
 =c+di. Тогда
\dfrac{z_1}{z_2} = \dfrac{a+bi}{c+di} = \dfrac{(a+bi)(c-di)}{(c+di)(c-di)} = \dfrac{(ac+bd)+(bc-ad)i}{c^2+d^2} = \dfrac{ac+bd}{c^2+d^2} + \dfrac{bc-ad}{c^2+d^2}i.
z
2
​

z
1
​

​
 =
c+di
a+bi
​
 =
(c+di)(c−di)
(a+bi)(c−di)
​
 =
c
2
 +d
2

(ac+bd)+(bc−ad)i
​
 =
c
2
 +d
2

ac+bd
​
 +
c
2
 +d
2

bc−ad
​
 i.
Таким образом, для того, чтобы поделить два комплексных числа, мы умножаем числитель и знаменатель дроби на число сопряженное к знаменателю, в результате в знаменателе оказывается вещественное число!

    При делении комплексных чисел возникает i^2i
2
 , значение которого равно -1−1.

Пример. Пусть z_1 = 3 + 2i, \, z_2 = 1 + 7iz
1
​
 =3+2i,z
2
​
 = 1+7i, тогда

\dfrac{z_1}{z_2} = \dfrac{3+2i}{1+7i} = \dfrac{(3+2i)(1-7i)}{(1+7i)(1-7i)} = \dfrac{(3+14)+(-21+2)i}{1^2+7^2} = \dfrac{17-19i}{50} = \dfrac{17}{50}-\dfrac{19}{50}i.
z
2
​

z
1
​

​
 =
1+7i
3+2i
​
 =
(1+7i)(1−7i)
(3+2i)(1−7i)
​
 =
1
2
 +7
2

(3+14)+(−21+2)i
​
 =
50
17−19i
​
 =
50
17
​
 −
50
19
​
 i.'''


'''Комплексные числа в Python
В языке Python есть возможность работать с комплексными числами. Общая форма представления комплексного числа 
следующая: real + imag j, где

real – вещественная часть комплексного числа;
imag – мнимая часть комплексного числа, которая завершается символом j или J.
  Обратите внимание: в Python используется буква j, а не i.

Приведенный ниже код:

z1 = 5 + 7j
z2 = 1j
z3 = -3 + 5J
z4 = 1.5 + 3.2j

print(z1, z2, z3, z4, sep='\n')
print(type(z1))
выводит:

(5+7j)
1j
(-3+5j)
(1.5+3.2j)
<class 'complex'>
Создание комплексных чисел
Комплексные числа можно создать с помощью литерала, как выше, а можно с помощью функции complex(), которая 
принимает два аргумента: вещественную и мнимую часть числа, либо строковое представление числа.

Приведенный ниже код:

z1 = -3 + 2j              # создании на основе литерала
z2 = complex(6, -8)       # z2 = 6 - 8j
z3 = complex(0, 2.5)      # z3 = 2.5j
z4 = complex(5, 0)        # z4 = 5 + 0j
z5 = complex('3+4j')      # создании на основе строки

print(z1, z2, z3, z4, z5, sep='\n')
выводит:

(-3+2j)
(6-8j)
2.5j
(5+0j)
(3+4j)
Арифметические операции над комплексными числами
Тип данных complex отлично интегрирован в язык Python. С complex числами работают все привычные операции: сложение, 
вычитание, умножение, деление, возведение в степень.

Приведенный ниже код:

z1 = 1 + 3j
z2 = -3 + 2j

print('z1 + z2 =', z1 + z2)
print('z1 - z2 =', z1 - z2)
print('z1 * z2 =', z1 * z2)
print('z1 / z2 =', z1 / z2)
print('z1^20 =', z1**20)
выводит:

z1 + z2 = (-2+5j)
z1 - z2 = (4+1j)
z1 * z2 = (-9-7j)
z1 / z2 = (0.23076923076923078-0.8461538461538461j)
z1^20 = (9884965888-1512431616j)
Мы также можем совершать арифметические операции над complex и целыми числами (миксовать complex, int, float).

Приведенный ниже код:

z = 1 + 3j

print(z + 5)
print(z - 2)
print(3*z)
print(z/2)
выводит:

(6+3j)
(-1+3j)
(3+9j)
(0.5+1.5j)
Методы и свойства комплексных чисел
Для получения действительной и мнимой частей комплексного числа используются свойства real и imag.

Приведенный ниже код:

z = 3+4j

print('Действительная часть =', z.real)
print('Мнимая часть =', z.imag)
выводит:

Действительная часть = 3.0
Мнимая часть = 4.0
Python представляет комплексное число как два вещественных числа, поэтому при выводе у нас появились выражения
 3.03.0 и 4.04.0 вместо 33 и 44.

Для нахождения сопряженного комплексного числа, можно использовать метод conjugate().

Приведенный ниже код:

z = 3+4j

print('Сопряженное число =', z.conjugate())
выводит:

Сопряженное число = (3-4j)
Примечания
Примечание 1. Почему используется буква j вместо буквы i, можно почитать тут.

Примечание 2. Для нахождения модуля комплексного числа, используется встроенная функция abs().

Приведенный ниже код:

z = 3+4j

print('Модуль числа =', abs(z))
выводит:

Модуль числа = 5.0
Примечание 3. Встроенный модуль math работает с вещественными числами. Для работы с комплексными числами есть 
модуль cmath. Модуль cmath включает дополнительные функции для использования комплексных чисел.

import cmath

z = 2+3j
print(cmath.phase(z)) # полярный угол
print(cmath.polar(z)) # полярные координаты
Модуль cmath содержит следующие категории функций:

Экспоненциальные и логарифмические функции

Квадратные корни

Тригонометрические функции и их обратные

Гиперболические функции и их обратные

Примечание 4. Документация по модулю cmath тут.

Примечание 5. Больше примеров работы с комплексными числами тут и тут.

Примечание 6. Для работы с комплексными числами (тип complex) не нужно подключать какой-либо модуль, в отличии от 
типа Decimal и Fraction.'''



'''Операции над комлексными числами
Даны два комплексных числа. Напишите программу, которая вычисляет и выводит их сумму, разность и произведение.

Формат входных данных
На вход программе подается два комплексных числа, каждое на отдельной строке.

Формат выходных данных
Программа должна вывести ответ на задачу.

Sample Input 1:

1+2j
-2+4j
Sample Output 1:

(1+2j) + (-2+4j) = (-1+6j)
(1+2j) - (-2+4j) = (3-2j)
(1+2j) * (-2+4j) = (-10+0j)
Sample Input 2:

-1-1j
-1+1j
Sample Output 2:

(-1-1j) + (-1+1j) = (-2+0j)
(-1-1j) - (-1+1j) = -2j
(-1-1j) * (-1+1j) = (2+0j)
Sample Input 3:

3-2j
1+4j
Sample Output 3:

(3-2j) + (1+4j) = (4+2j)
(3-2j) - (1+4j) = (2-6j)
(3-2j) * (1+4j) = (11+10j)
'''

# z1 = complex(input())
# z2 = complex(input())
# print(f'{z1} + {z2} = {z1 + z2}')
# print(f'{z1} - {z2} = {z1 - z2}')
# print(f'{z1} * {z2} = {z1 * z2}')

# a = input()
# b = input()
# for i in "+-*":
#     print(f"({a}) {i} ({b}) =",  eval(f"({a}){i}({b})"))


# a, b = complex(input()), complex(input())
# print(f'{a} + {b} = {a + b}\n{a} - {b} = {a - b}\n{a} * {b} = {a * b}')


# ops = {'+': complex.__add__, '-': complex.__sub__, '*': complex.__mul__}
#
# a, b= (complex(input()) for _ in '12')
#
# print(*(f'{a} {op} {b} = {f(a, b)}' for op, f in ops.items()), sep='\n')




'''Сопряженные числа
Дано натуральное число nn и два комплексных числа z1, z2
 . Напишите программу, которая вычисляет и выводит значение выражения
z1^n + z2^n + z_1^n + {z_2}^{n+1}.

Sample Input 1:

1
2+3j
1+4j
Sample Output 1:

(-10-4j)'''


# n = int(input())
# z1 = complex(input())
# z2 = complex(input())
# zn = (z1**n) + (z2**n)+(z1.conjugate()**n)+(z2.conjugate()**(n+1))
# print(zn)

# n, z1, z2 = int(input()), complex(input()), complex(input())
#
# print(z1 ** n + z2 ** n + z1.conjugate() ** n + z2.conjugate() ** (n + 1))


# n = int(input())
# z1, z2 = complex(input()), complex(input())
# print(z1**n + z2**n + z1.conjugate()**n + z2.conjugate()**(n+1))


# n = int(input())
# z1, z2 = complex(input()), complex(input())
# print(z1 ** n + z2 ** n + z1.conjugate() ** n + z2.conjugate() ** (n + 1))


'''Комплексные числа хранятся в списке numbers. Дополните приведенный код так, чтобы он вывел комплексное число с
 наибольшим модулем и сам модуль числа на отдельных строках.

Примечание. Модуль комплексного числа можно вычислить с помощью встроенной функции abs().

Для отладки кода 🟡'''

# numbers = [3 + 4j, 3 + 1j, -7 + 3j, 4 + 8j, -8 + 10j, -3 + 2j, 3 - 2j, -9 + 9j, -1 - 1j, -1 - 10j, -20 + 15j, -21 + 1j,
#            1j, -3 + 8j, 4 - 6j, 8 + 2j, 2 + 3j]
# print(max(numbers, key=abs))
# print(abs(max(numbers, key=abs)))


# numbers = [3+4j, 3+1j, -7+3j, 4+8j, -8+10j, -3+2j, 3-2j, -9+9j, -1-1j, -1-10j, -20+15j, -21+1j, 1j, -3+8j, 4-6j, 8+2j, 2+3j]
#
# largest = max((abs(i), i) for i in numbers)
#
# print(largest[1], largest[0], sep='\n')
