

#%% Exercice 1

def u(n):
    x = 1
    for k in range(n):
        x = 2*x + k
    return x

# ou bien

def u(n):
    x = 1
    for k in range(1, n+1):
        x = 2*x + (k-1)
    return x



#%% Exercice 2

from math import log

def logstar(n):
    cpt = 0
    x = n
    while x > 1:
        x = log(x)
        cpt += 1
    return cpt    
    

#%% Exercice 3

def sommeSurProd(L):
    s = 0
    p = 1
    for v in L:
        s += v
        p *= v
    return s / p

#%% Exercice 4

def carres(n):
    cr = []
    for k in range(n):
        cr.append((n-k)**2)
    return cr


def carres(n):
    return [(n-k)**2 for k in range(n)]

#%% Exercice 5

def estConstante(L):
    for k in range(len(L)-1):
        if L[k] != L[k+1]:
            return False
    return True


#%% Exercice 6

def compteChiffres(L):
    C = [0] * 10
    for v in L:
        if 0 <= v <= 9:
            C[v] += 1
    return C


#%% Exercice 7

from random import random

def simulX1(N, p):
    X1 = 0
    for _ in range(N):
        if random() <= p:
            X1 += 1
    return X1

def simulX2(N, p):
    k = simulX1(N, p)
    X2 = 0
    for _ in range(k):
        if random() <= p:
            X2 += 1
    return X2

def simulX2(N, p):
    k = simulX1(N, p)
    return simulX1(k, p)


def simulTk(p):
    rg = 1
    while random() <= p:  # ou bien while random() >= 1-p
        rg += 1
    return rg

def simulT(N, p):
    maxtmp = 0
    for _ in range(N):
        Tk = simulTk(p)
        if Tk > maxtmp:
            maxtmp = Tk
    return maxtmp

def estimEspT(N, p, nbsim):
    s = 0
    for _ in range(nbsim):
        s += simulT(N, p)
    return s / nbsim

        