## exercice 1

def maxi(x,y):
    if x <= y:
        return y, y >= 0
    return x, x>=0

def maxi1(x,y):
    if x <= y:
        m = y
    else:
        m=x
    return m,m>=0

## Exercice n°2

def med(x,y,z):
    if x < y < z or z < y < x:
        return y
    elif z < x < y or y < x < z:
        return x
    else:
        return z

##Exercice n°3

n=int(input("n=?"))
p=1
for k in range(1,n+1):
    p *= k
print(p)

## Exercice n°4

a=float(input('entrez un réel a'))
S = 0
k = 0
while S <= a:
    k += 1
    S += 1/k
print(k)

## Exercice n°5

def som(n):
    s = 0
    for k in range(1,n+1):
        s+=1/k**3
    return s

## Exercice n°6

def suite_exo6(n):
    u,v = 0,1/2 # u=u_0, v = u_1
    for k in range(n-1): # ou range(2,n+1)
        u,v = v,(1/3)*(1+ v + u**3)
    if n == 0:
        return u
    return v

# ou

def suite_exo6bis(n):
    u,v = 0,1/2 # u=u_0, v = u_1
    for k in range(n):
        u,v = v,(1/3)*(1+ v + u**3)
    return u

## Exercice n°7

from math import sin,sqrt
import matplotlib.pyplot as plt

def suite(n,a):
    L = [a] # u1
    for k in range(2,n+1):
        L.append((1+1/(k-1))*sin(L[-1]))
    return L

n,a = 100,0.5
N = list(range(1,n+1))# liste des abscisses
S = suite(n,a) # liste de ordonnées
plt.plot(N,S,'x')
T = [sqrt(k)*S[k-1] for k in range(1,n+1)]
plt.plot(N,T,'o')
plt.show()

## Exercice n°8

from math import exp,log,sqrt
def moysuite(f,n):
    s = 0
    for k in range(n+1):
        s += f(k)
    return s / (n+1)

def f1(x):
    return exp(1/(1+x))

def f2(x):
    return log(2+1/(x+2))

def f3(x):
    return sqrt(x)*exp(-x)

def f4(x):
    return (-1)**x


# moyenne de Césaro pour f1, la suite tend vers 1, pour f2, vers ln(2), pour f3, vers plus l'infinie et f4 vers 0.
# Si (f(n)) converge , il en est de même pour la suite (f(0)+..+f(n))/(n+1). La réciproque est fausse.

##Exercice n°9

def binome(k,n):
    p = 1 # numerateur
    q = 1 # dénominateur
    for i in range(k):
        p *= (n-i)
        q *= (i+1)
    return p // q

print(binome(0,1))
print(binome(2,3))

# autre possibilité :

def binom(k,n):
    produit = 1
    for i in range(k):
        produit *= (n-i) / (i+1)
    return produit


