63 lines
1.4 KiB
Python
63 lines
1.4 KiB
Python
from fractions import Fraction
|
|
|
|
def nextu(a):
|
|
n = len(a)
|
|
a.append(1)
|
|
for i in range(n - 1, 0, -1):
|
|
a[i] = i * a[i] + a[i - 1]
|
|
return a
|
|
|
|
def nextv(a):
|
|
n = len(a) - 1
|
|
b = [(1 - n) * x for x in a]
|
|
b.append(1)
|
|
for i in range(n):
|
|
b[i + 1] += a[i]
|
|
return b
|
|
|
|
def sumpol(n):
|
|
u = [0, 1]
|
|
v = [[1], [1, 1]]
|
|
yield [Fraction(0), Fraction(1)]
|
|
for i in range(1, n):
|
|
v.append(nextv(v[-1]))
|
|
t = [0] * (i + 2)
|
|
p = 1
|
|
for j, r in enumerate(u):
|
|
r = Fraction(r, j + 1)
|
|
for k, s in enumerate(v[j + 1]):
|
|
t[k] += r * s
|
|
yield t
|
|
u = nextu(u)
|
|
|
|
def polstr(a):
|
|
s = ""
|
|
q = False
|
|
n = len(a) - 1
|
|
for i, x in enumerate(reversed(a)):
|
|
i = n - i
|
|
if i < 2:
|
|
m = "n" if i == 1 else ""
|
|
else:
|
|
m = "n^%d" % i
|
|
c = str(abs(x))
|
|
if i > 0:
|
|
if c == "1":
|
|
c = ""
|
|
else:
|
|
m = " " + m
|
|
if x != 0:
|
|
if q:
|
|
t = " + " if x > 0 else " - "
|
|
s += "%s%s%s" % (t, c, m)
|
|
else:
|
|
t = "" if x > 0 else "-"
|
|
s = "%s%s%s" % (t, c, m)
|
|
q = True
|
|
if q:
|
|
return s
|
|
else:
|
|
return "0"
|
|
|
|
for i, p in enumerate(sumpol(10)):
|
|
print(i, ":", polstr(p))
|