# Approximation d'une loi binomiale par une loi de Poisson (St-Cyr 2019)

# a) Loi binomaile de paramètres (n,p)
def LX(n,p):
    L = [(1-p)**n]
    for k in range(n):
        L.append(L[k]*(n-k)*p/(k+1)/(1-p))
    return L

# b) Loi binomiale de paramètre np
import numpy as np
def LY(n,p):
    L = [np.exp(-n*p)]
    for k in range(n):
        L.append(L[k]*n*p/(k+1))
    return L

# c) Plus grand écart
def PGE(n,p):
    return max([abs(LX(n,p)[k]-LY(n,p)[k]) for k in range(n+1)])

# d) Explorations numériques
n,p = 4,0.1
print(PGE(n,p))

import numpy.random as rd
m=10

X = rd.binomial(n,p,m)
X = X.tolist()
print(X)
LXe = [X.count(i)/m for i in range(n+1)]
print(LXe)
print(LX(n,p))
print(max([abs(LX(n,p)[k]-LXe[k]) for k in range(n+1)]))

Y = rd.poisson(n*p,m)
Y = Y.tolist()
print(Y)
LYe = [Y.count(i)/m for i in range(n+1)]
print(LYe)
print(LY(n,p))
print(max([abs(LY(n,p)[k]-LYe[k]) for k in range(n+1)]))
print(sum(LYe))
##

# Exercice 1
import numpy.random as rd
T =[]
for k in range(10**6):
    n = 1
    while rd.binomial(1,0.5):
        n += 1
    T.append(rd.randint(1,n+1))
print(T.count(1)/10**6)

import numpy as np
print(np.log(2))
##

# Exercice 7
import numpy.random as rd
def attente(q):
    k=2
    a = rd.binomial(1,q)
    b = rd.binomial(1,q)
    while 1-a*b:
        k += 1
        a = b
        b = rd.binomial(1,q)
    return k

m = 0
for n in range(10**4):
    m += attente(1/3)
print(m/10**4)
