"""
Définition d'une classe Complex implémentant les nombres complexes. Le propos
est d'illustrer quelques aspects de la programmation objet en python.
Exemples d'utilisation de la classe Complex :
# Construction d'un complexe en coordonnées polaires
In [108]: j = Complex(1, 2*math.pi/3, polar = True)
In [109]: j
Out[109]: -0.50 + 0.87*i
# Calculs
In [110]: j+j*j
Out[110]: -1.00 + 0.00*i
# Module et conjugué
In [111]: abs(j)
Out[111]: 0.9999999999999999
In [112]: ~j
Out[112]: -0.50 - 0.87*i
"""
from math import sqrt, sin, cos, acos
class Vector2(object):
"""Vecteurs de R^2"""
def __init__(self, x, y):
self.abc = float(x)
self.ord = float(y)
def __repr__(self):
return "(%.2f, %.2f)" % (self.abc, self.ord)
def __add__(self, v):
x = self.abc + v.abc
y = self.ord + v.ord
return self.__class__(x, y)
def __sub__(self, v):
return self.__class__(self.abc - v.abc, self.ord - v.ord)
def __neg__(self):
return self.__class__(-self.abc, -self.ord)
def __mul__(self, v):
return (self.abc*v.abc + self.ord*v.ord)
def norm(self):
return sqrt(self.abc*self.abc + self.ord*self.ord)
def __abs__(self):
return self.norm()
class Complex(Vector2):
"""Nombres complexes"""
def __init__(self, x, y, polar = False):
"""
Construit le complexe x + iy ; si polar est vrai x et y sont
le module et l'argument du complexe à construire
"""
if polar:
x, y = x*cos(y), x*sin(y)
super(Complex, self).__init__(x, y)
def __repr__(self):
y = self.im()
if y < 0:
sign = "-"
y = -y
else:
sign = "+"
return "%.2f %s %.2f*i" % (self.real(), sign, y)
def real(self):
return self.abc
def im(self):
return self.ord
def __mul__(self, z):
return self.__class__(self.real()*z.real() - self.im()*z.im(),
self.real()*z.im() + self.im()*z.real())
def conjugate(self):
return Complex(self.real(), -self.im())
def __invert__(self):
return self.conjugate()
def module(self):
return self.norm()
def arg(self):
angle = acos(self.real()/self.module())
if self.im() < 0:
angle = -angle
return angle