## Exercice 1

# 1)

def aire_disque(r):
    return r**2 * 3.14

# 2)

def aire_rectangle(a, b):
    return a * b


## Exercice 2

def factorielle(n):
    f = 1
    for i in range(2, n+1):
        f = f * i
    return f

def coefficient_binomial(n, p):
    if p < 0 or p > n:
        return 0
    return factorielle(n) // (factorielle(p)*factorielle(n-p))

# On peut faire moins de calculs avec le programme suivant qui utilise l'égalité
# ((i+1) parmi n) = (i parmi n) * (n-i) // (i+1) :

def coefficient_binomial(n, p):
    if p < 0 or p > n:
        return 0
    if 2*p > n:  # on exploite la symétrie des coefficients binomiaux
        p = n - p
    coeff = 1
    for i in range(p):
        coeff = coeff * (n-i) // (i+1)
    return coeff


## Exercice 3

# 1) a) Si p > sqrt(n) et q > sqrt(n), alors pq > n. Par conséquent, si pq = n,
# alors p <= sqrt(n) ou q <= sqrt(n).

# b) On peut ainsi se contenter de chercher les diviseurs de n qui sont inférieurs
# ou égaux à sqrt(n). La fonction modifiée est :

from math import sqrt

def est_premier(n):
    if n < 2:
        return False
    for i in range(2, int(sqrt(n))+1):
        if n % i == 0:
            return False
    return True

# 2)

def nombre_de_premiers(n):
    nb = 0
    for p in range(2, n+1):
        if est_premier(p):
            nb = nb + 1
    return nb

# 3)

def somme_premiers(n):
    s = 0
    for p in range(2, n+1):
        if est_premier(p):
            s = s + p
    return s

# 4)

def premier_suivant(n):
    while not est_premier(n):
        n = n + 1
    return n

# 5) La fonction suivante renvoie le k-ième nombre premier.

def kieme_premier(k):
    nb = 1
    p = 2
    while nb < k:
        p = p + 1
        if est_premier(p):
            nb = nb + 1
    return p

# >>> kieme_premier(1000)
# 7919

# 6) Il n'est pas nécessaire d'utiliser la fonction est_premier ici.

def decomposition(n):
    k = 2
    while n > 1:
        while n % k == 0:
            n = n // k
            print(k)
        k = k + 1
