Problem 1: Complex Number (100pts)

In mathematics, a complex number is a number that can be expressed in the form \(a + bi\), where \(a\) and \(b\) are real numbers, and \(i\) represents the imaginary unit that satisfies the equation \(i^2 = −1\). For example, \(2 + 3i\) is a complex number. For the complex number \(a + bi\), \(a\) is called the real part, and \(b\) is called the imaginary part. To emphasize, the imaginary part does not include a factor \(i\); that is, the imaginary part is \(b\), not \(bi\).

Complex numbers can be added and multiplied. For any complex number \(c_1\) and \(c_2\) where \(c_1 = a + bi\) and \(c_2 = c + di\), the addition operator '+' is defined as \(c_1 + c_2 = (a + c) + (b + d)i\) and the multiplication operator '⋅' is defined as \(c_1 \cdot c_2 = (ac − bd) + (ad + bc)i\).

Implement required methods of class Complex such that representing a Complex object Complex(a, b) displays Complex(real=a, imaginary=b), printing it displays a + bi and we can directly add or multiply two complex objects.

class Complex:
    """Complex Number.

    >>> a = Complex(1, 2)
    >>> a
    Complex(real=1, imaginary=2)
    >>> print(a)
    1 + 2i
    >>> b = Complex(-1, -2)
    >>> b
    Complex(real=-1, imaginary=-2)
    >>> print(b)
    -1 + -2i
    >>> print(a + b)
    0 + 0i
    >>> print(a * b)
    3 + -4i
    >>> print(a)
    1 + 2i
    >>> print(b) # a and b should not be changed
    -1 + -2i
    """
    def __init__(self, real, imaginary):
        self.real = real
        self.imaginary = imaginary
    
    "*** YOUR CODE HERE ***"

You may find Python string formatting syntax or f-strings useful. A quick example:

>>> ten, twenty, thirty = 10, 'twenty', [30]
>>> '{0} plus {1} is {2}'.format(ten, twenty, thirty)
'10 plus twenty is [30]'

>>> feeling = 'love'
>>> course = 61
>>> f'I {feeling} {course}A!'
'I love 61A!'