| # 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() |