# 1)
import numpy as np
B = np.zeros((13,13))
B[0,0] = 1
for n in range(1,13):
    B[n,0] = 1
    for k in range(1,n+1):
        B[n,k] = B[n-1,k-1] + B[n-1,k]
print(B)
B = B.astype(int)
print(B)

# ou bien tout simplement
import math
B = np.array([[math.comb(n,k) for k in range(13)] for n in range(13)])
print(B)

# 2.d)
A = [1,1]
for n in range (2,13):
    a = sum([B[n-1,i]*A[i] for i in range(n)])
    A.append(a)
print(A)

# 3.b)
def f(x):
    r,t = 1,1
    for n in range(1,13):
        t = t*x/n
        r = r + A[n]*t
    return(r)

import matplotlib.pyplot as plt

X = np.arange(-2,1.5,0.02)
Y = [f(x)*np.exp(1) for x in X]
Z = [np.exp(np.exp(x)) for x in X]
plt.plot(X,Y,color='r')
plt.plot(X,Z,color='b')
plt.show()

# 3.e)
from numpy.polynomial import Polynomial

U = [0]
u = 1
for k in range(1,13):
    U.append(1/u)
    u = u*(k+1)
V = Polynomial(U)

T = Polynomial([1])
W = Polynomial([1])
q = 1
for k in range(1,13):
    W = W*V
    T = T + W/q
    q = q*(k+1)

for k in range(13):
    print(T.coef[k])

q = 1
for k in range(13):
    print(A[k]/q)
    q = q*(k+1)