algorithm-in-python/codes/dataStructure/polynomial/polynomial.py
2018-07-08 16:41:55 +08:00

162 lines
4.8 KiB
Python

#!/bin/python3
# notice that creating a class's initialization won't conflict with __call__ method
# because the former call class ,and the latter call instance
# to be implemented
class polynomial:
pls= []
n = 0
def dictize(pl):
if isinstance(pl,int) or isinstance(pl,float):
pl = {0:pl}
if isinstance(pl,polynomial):
pl = pl.polynomial.copy()
return pl
def isZero(n):
return abs(n)<0.000001
def __init__(self,s='0 0'):
polynomial.pls.append(self)
polynomial.n +=1
if isinstance(s,polynomial):
self.polynomial=s.polynomial.copy()
# don't write like this .**self.polynomial = s.polynomial**,it's ref
return
elif isinstance(s,dict):
self.polynomial = s.copy()
return
s= s.replace(',',' ')
s= s.replace('x',' ')
s= s.replace('x^',' ')
s = s.replace(':',' ')
s = s.replace('\n',' ')
s = s.split(' ')
num = len(s)
i = 0
print(s)
self.polynomial = dict()
li = [float(i) for i in s]
while i<num:
if not polynomial.isZero(li[i]):
index = li[i+1]
if index in self.polynomial.keys():
self.polynomial[index] += li[i]
else:self.polynomial[index] = li[i]
i+=2
if not self.polynomial:
self.polynomial = {0:0}
def __iter__(self):
return iter(list(self.polynomial.keys()))
def __getitem__(self,key):
return self.polynomial[key]
def __setitem__(self,key,val):
self.polynomial[key] = val
def __delitem__(self,k):
del self.polynomial[k]
def __add__(self,pl):
pl = polynomial.dictize(pl)
rst = self.polynomial.copy()
for i in pl:
if i not in rst:
rst[i] = pl[i]
else:
rst[i] += pl[i]
if polynomial.isZero(rst[i]):
del rst[i]
return polynomial(rst)
def __iadd__(self,pl):
pl = polynomial.dictize(pl)
for i in pl:
if i not in self:
self[i] = pl[i]
else:
self[i] += pl[i]
if polynomial.isZero(self[i]):
del self[i]
return self
def __sub__(self,pl):
pl = polynomial.dictize(pl)
tmp = {i:-j for i,j in pl.items()}
return self + tmp
def __mul__(self,pl):
pl = polynomial.dictize(pl)
dic = dict()
for i in pl:
for j in self:
index= i+j
if index in dic:
dic[index] += pl[i]*self[j]
else:dic[index] = pl[i]*self[j]
return polynomial({i:j for i,j in dic.items() if not polynomial.isZero(j)})
def __imul__(self,pl):
self = self*pl
return self
def __pow__(self,n):
rst = polynomial({0:1})
for i in range(n):
rst*=self.polynomial
return rst
def __repr__(self):
return self.__str__()
def __str__(self):
output = ''
if self.polynomial:
key = sorted(self.polynomial.keys(),reverse = True)
num = len(key)
for j,i in enumerate(key):
if polynomial.isZero(i):
output +='%+g'%self[i]
continue
if not polynomial.isZero(self[i]-1):
if not polynomial.isZero(self[i]+1):
output +="%+g"%self[i]
else:output +='-'
else:output +='+'
if not polynomial.isZero(i): output +='x'
if not polynomial.isZero(i-1):output +='^%g'%i
if output[0] == '+':
return output[1:]
return output
def iterPolynomial(self,s):
rst = polynomial({0:0})
for i in self:
rst += s**int(i)*self[i]
return rst
def __call__(self,s):
if isinstance(s,polynomial):
return self.iterPolynomial(s)
sum = 0
for i in self:
sum += self[i] * s**i
return sum
def __xor__(self,n):
tmp = polynomial(self)
for i in range(n):
self = self.iterPolynomial(tmp)
return self
def save(self):
polynomial.pls.append(self)
polynomial.n +=1
def delPlynomial(self,n):
return polynomial.pls.pop(n-1)
def menu():
print('polynomial operations')
print('1.create')
print('2.add')
print('3.sub')
print('4.iadd')
print('5.mul')
print('6.del')
print('7.display')
print('8.cal val')
print('9.polynomial iter')
print('10.menu')
print('11.exit')
def go():
menu()
if __name__ == '__main__':
go()