mirror of
https://github.com/heqin-zhu/algorithm.git
synced 2024-03-22 13:30:46 +08:00
201 lines
5.3 KiB
Python
201 lines
5.3 KiB
Python
''' mbinary
|
|
#########################################################################
|
|
# File : polynomial.py
|
|
# Author: mbinary
|
|
# Mail: zhuheqin1@gmail.com
|
|
# Blog: https://mbinary.xyz
|
|
# Github: https://github.com/mbinary
|
|
# Created Time: 2018-05-19 23:07
|
|
# Description:
|
|
#########################################################################
|
|
'''
|
|
|
|
#!/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')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
menu()
|