# DS 07 mathématiques correction : partie informatique
# BCPST1B 2025-2026
# Lycée Hoche, Versailles
# L.-C. LEFÈVRE

#%% Problème 2

def somme(P, Q):
    n = len(P) - 1
    m = len(Q) - 1
    if n >= m:
        # le résultat est de degré n
        R = [0 for _ in range(n+1)]
        # somme là où P, Q ont des coefficients communs
        for i in range(m+1):
            R[i] = P[i] + Q[i]
        # puis rajouter les coefficients de P tout seul
        for i in range(m+1, n+1):
            R[i] = P[i]
        return R
    else:
        # Sinon, on peut tout refaire en échangeant P et Q.
        # Ou alors grosse astuce (réservée aux professionnels) :
        return somme(Q, P)

def produit(P, Q):
    n = len(P) - 1
    m = len(Q) - 1
    # le résultat de la bonne taille
    r = n + m
    R = [0 for _ in range(r+1)]
    # double boucle pour remplir R
    for i in range(n+1):
        for j in range(m+1):
            R[i+j] = R[i+j] + P[i] * Q[j]
    return R

def dérive(P):
    n = len(P) - 1
    # le résultat est de degré n-1
    r = n - 1
    R = [0 for _ in range(r+1)]
    for i in range(r+1):
        R[i] = (i+1) * P[i+1]
    return R

def P(n):
    Q = [1]
    for i in range(n):
        Q = somme(produit([2, 0, -3*i], Q), produit([0, 0, 0, 1], dérive(Q)))
    return Q

# test
for i in range(10):
    print(P(i))


#%% Problème 3

from random import randint

def lancer():
    x = randint(1, 2)
    if x == 1:
        return "pile"
    else:
        return "face"

def trouvePPF(n):
    # a et b sont les deux lancers précédents
    a = lancer()
    b = lancer()
    # on a déjà fait 2 lancers…
    for k in range(3, n+1):
        c = lancer()
        if a == "pile" and b == "pile" and c == "face":
            return True
        # mettre à jours les lancers précédents
        a = b
        b = c
    return False

def simule(n, N):
    # compteur
    c = 0
    for _ in range(N):
        t = trouvePPF(n)
        if t == True:
            c = c + 1
    # ou en pourcentage, ce n'est pas vraiment important
    return c / N

# test : jusqu'à 20 lancers, répétés 1000 fois
N = 1000
n = 20
for i in range(3, n+1):
    print(i, simule(i, N))
