from numpy.polynomial import Polynomial
import numpy as np

def fact(n) :
    L = [1]
    for k in range(1,n+1) :
        a = L[-1]*k
        L.append(a)
    return L

def S(P) :
    s = 0
    L = fact(50)
    for k in range(51) :
        s += P(k)/L[k]
    return np.exp(-1)*s

for d in range(1,11) :
    P = Polynomial([0]*d+[1])
    print('d = ',d,', S(P)/e = ',S(P))

Q = Polynomial([-3,1,0,-15,0,0,0,-4,0,1])
print('P = X^9-4X^7-15X^3+X-3 , S(P)/e = ',S(Q))

def D(P) :
    R = Polynomial([1,1])
    return P(R)-P

def T(P) :
    s = 0
    L = fact(50)
    for k in range(51) :
        Q = P
        for _ in range(k) :
            Q = D(Q)
        s += Q(0)/L[k]
    return s

for d in range(1,11) :
    P = Polynomial([0]*d+[1])
    print('d = ',d,', T(P) = ',T(P))
print('P = X^9-4X^7-15X^3+X-3 , T(P) = ',T(Q))