# 1)
import numpy as np

def A(n):
    M = np.zeros((n+1,n+1))
    for i in range(n+1):
        for j in range(i,n+1):
            M[i,j] = 1/(j+1)
    return M

for n in range(1,6):
    T = np.linalg.eig(A(n))
    k = list(T[0]).index(1) # statistiquement inutile
    print(A(n))
    print(T[1][:,k]) # k-ième colonne
# question purement gratuite en fait !

# 2)
import numpy.random as rd

def simul(n,k):
    i = rd.randint(n+1)
    L = [i]
    for j in range(1,k):
        i = rd.randint(i+1)
        L.append(i)
    return L

print(simul(10,20))
print(simul(100,20))

# 3)
def w(n,k):
    return np.dot(np.linalg.matrix_power(A(n),k),np.array((n+1)*[[1/(n+1)]]))

print(w(10,20))