from random import randint

## Liste aléatoire

def liste_aleatoire(n, a, b):
    L = []
    for i in range(n):
        L.append(randint(a, b))
    return L

## Sommes et produits
# On parcourt les éléments. Accumulateur initialisé à 0 (somme) ou 1 (produit).

def somme(liste):
    s = 0
    for e in liste:
        s = s + e
    return s

def moyenne(liste):
    return somme(liste) / len(liste)

def produit(liste):
    p = 1
    for e in liste:
        p = p * e
    return p

## Présence et extrêmes
# Pour tester une propriété sur toute la liste : return False dès qu'un contre-exemple
# est trouvé, return True après la boucle.

def est_present(element, liste):
    for e in liste:
        if e == element:
            return True
    return False

def minimum(liste):
    m = liste[0]
    for e in liste:
        if e < m:
            m = e
    return m

def maximum(liste):
    M = liste[0]
    for e in liste:
        if e > M:
            M = e
    return M

## Tester un algorithme
# tous_positifs_1 : faux (s'arrête au premier élément).
# tous_positifs_2 : faux (renvoie True dès qu'un positif est vu).
# tous_positifs_3 : faux (s'arrête au premier élément).
# tous_positifs_4 : correct.
# Contre-exemple pour 1, 2, 3 : [1, -1] ou [-1, 2] selon les cas.

## Crible d'Ératosthène

def eratosthene(N):
    premiers = []
    est_premier = [False, False] + [True] * (N - 1)
    for i in range(N + 1):
        if est_premier[i]:
            k = 2
            while k * i <= N:
                est_premier[k * i] = False
                k = k + 1
            premiers.append(i)
    return premiers
