86 lines
1.6 KiB
Python
Executable File
86 lines
1.6 KiB
Python
Executable File
# Complex numbers
|
|
|
|
|
|
from math import sqrt
|
|
|
|
|
|
class complex:
|
|
|
|
def __init__(self, re, im):
|
|
self.re = float(re)
|
|
self.im = float(im)
|
|
|
|
def __coerce__(self, other):
|
|
if type(other) == type(self):
|
|
if other.__class__ == self.__class__:
|
|
return self, other
|
|
else:
|
|
raise TypeError, 'cannot coerce to complex'
|
|
else:
|
|
# The cast to float() may raise an exception!
|
|
return self, complex(float(other), 0.0)
|
|
|
|
def __repr__(self):
|
|
return 'complex' + `self.re, self.im`
|
|
|
|
def __cmp__(a, b):
|
|
a = a.__abs__()
|
|
b = b.__abs__()
|
|
return (a > b) - (a < b)
|
|
|
|
def __float__(self):
|
|
if self.im:
|
|
raise ValueError, 'cannot convert complex to float'
|
|
return float(self.re)
|
|
|
|
def __long__(self):
|
|
return long(float(self))
|
|
|
|
def __int__(self):
|
|
return int(float(self))
|
|
|
|
def __abs__(self):
|
|
# XXX overflow?
|
|
return sqrt(self.re*self.re + self.im*self.im)
|
|
|
|
def __add__(a, b):
|
|
return complex(a.re + b.re, a.im + b.im)
|
|
|
|
def __sub__(a, b):
|
|
return complex(a.re - b.re, a.im - b.im)
|
|
|
|
def __mul__(a, b):
|
|
return complex(a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re)
|
|
|
|
def __div__(a, b):
|
|
q = (b.re*b.re + b.im*b.im)
|
|
re = (a.re*b.re + a.im*b.im) / q
|
|
im = (a.im*b.re - b.im*a.re) / q
|
|
return complex(re, im)
|
|
|
|
def __neg__(self):
|
|
return complex(-self.re, -self.im)
|
|
|
|
|
|
def test():
|
|
a = complex(2, 0)
|
|
b = complex(3, 4)
|
|
print a
|
|
print b
|
|
print a+b
|
|
print a-b
|
|
print a*b
|
|
print a/b
|
|
print b+a
|
|
print b-a
|
|
print b*a
|
|
print b/a
|
|
i = complex(0, 1)
|
|
print i, i*i, i*i*i, i*i*i*i
|
|
j = complex(1, 1)
|
|
print j, j*j, j*j*j, j*j*j*j
|
|
print abs(j), abs(j*j), abs(j*j*j), abs(j*j*j*j)
|
|
print i/-i
|
|
|
|
test()
|