# TP1
## Exercie 1
print(len(range(0,10)))
print(len(range(25)))
print(len(range(1,11)))
print(len(range(1,12,-1)))
print(len(range(12,2,-1)))

## Exercice 2
print(list(range(11)))
print(list(range(1,15)))
print(list(range(38,58)))
print(list(range(41,98)))
print(list(range(-21,12)))
print(list(range(12,85)))
print(list(range(0,45,2)))
print(list(range(1,45,2)))
print(list(range(12,94,3)))
print(list(range(12,195,7)))
print(list(range(12,320,7)))
print(list(range(18,0,-1)))
print(list(range(18,1,-2)))
print(list(range(18,5,-3)))

## Exercice 3
def f1(x):
    return x**2-2*x-1

import numpy as np

def f2(x):
    if x<0:
        return x**2 + 1
    elif x<=2:
        return x**3
    else:
        return np.log(x)
def f3(x):
    return 1/(1+np.floor(x**2))
def f4(x):
    return
    np.sqrt(x)*np.log(x)

## Exercice 4
#1 for sans interruption
#2 for sans interruption
#3 while
#4 for avec interruption
#5 for avec interruption
#6 for avec interruption
#7 for sans interruption

## Exercice 5
#1 while u <= 100
#2 n = 1
#  while n <= 50 and u <= 100
#3 n = 1001
#  while u <= 100
#4 while s <= t
#5 while (y-x)*(z-y) > 0

## Exercice 6

def S1(n):
    S = 0
    for k in range(1,n+1):
        S += k
    return S
print(S1(5))

def S2(n):
    S = 0
    for k in range(n+1):
        S += 2**k
    return S
print(S2(5))

def S3(n):
    S = 0
    for k in range(2*n+1):
        S += k*(k-1)/2
    return S
print(S3(5))

def S4(n):
    S = 0
    for k in range(n+1):
        if k%2 == 1:
            S += 1/k
        else:
            S += np.exp(-k)
    return S
print(S4(5))

## Exercice 7
def u(n):
    u = 3
    for k in range(1,n):
        u = (k*u-1)/2
    return u
print(u(15))

## Exercice 8
def liste(n):
    L = [0]
    for _ in range(n):
        L.append(np.log(2+L[-1]))
    return L
print(liste(5))

## Exercice 9
def Fibo(n):
    F0, F1 = 1, 1
    for _ in range(n-1):
        F0, F1 = F1, F0+F1
    return F1
print(Fibo(4))

## Exercice 10
def rang(M):
    H, k = 0, 1
    while H <= M:
        H += 1/k
        k += 1
    return k-1
print(rang(10))

## Exercice 11
n = 15
L = [k**2 for k in range(1,n+1)]
print(L)
#1
L1 = L[:3]
print(L1)
L2 = L[-5:]
print(L2)
L3 = L[1::2]
print(L3)
L4 = L[::2]
print(L4)
L5 = L[::3]
print(L5)
L6 = L[1::5]
print(L6)
#2
M = L[:]
M.insert(8, 0)
print(M)

## Exercice 12
#1
def reverse(L):
    return L[::-1]
L = [k**2 for k in range(1,n+1)]
print(L)
print(reverse(L))
#2
L = [k**2 for k in range(1,n+1)]
print(L)
L.reverse()
print(L)
## Exercice 13
def saute(L,p):
    return L[p::2]
n = 15
L = [k**2 for k in range(1,n+1)]
print(L)
print(saute(L,2))

## Exercice 14
E1 = [1/n for n in range(1,16)]
print(E1)
E2 = [2**n for n in range(1,16)]
print(E2)
E3 = [1/(n*n+1) for n in range(1,11)]
print(E3)
E4 = [abs(np.cos(n)-np.sin(n)) for n in range(1,11)]
print(E4)
E5 = [1/n for n in range(1,16) if n not in [3,8,11]]
print(E5)
E6 = [(E1[k],E2[k]) for k in range(len(E1))]
print(E6)
E7 = [[k**i for i in [1,2,3,4]] for k in range(2,6)]
print(E7)
E8 = [list(range(k,2*k)) for k in range(1,6)]
print(E8)
E9 = [(i,j) for i in [-1,0,1] for j in [-1,0,1]]
print(E9)
E10 = [c for c in E9 if c != (0,0)]
print(E10)

## Exercice 15
def diff(L):
    n = len(L)
    return [L[i+1]-L[i] for i in range(n-1)]
n = 15
L = [k**2 for k in range(1,n+1)]
print(L)
print(diff(L))

## Exercice 16
def cumsum(L):
    n = len(L)
    CL = [L[0]]
    for k in range(1,n):
        CL.append(CL[-1]+L[k])
    return CL
L = [1,2,3]
print(cumsum(L))

## Exercice 17
def est_dans(L1,L2):
    for el in L2:
        if el not in L1:
            return False
    return True

L1 = [1,2,3,4,5]
L2 = [3,4]
print(est_dans(L1,L2))
L2 = [3,4,6]
print(est_dans(L1,L2))

## Exercice 18
def max(L):
    M = L[0]
    for el in L:
        if el > M:
            M = el
    return M

L = [1,5,3,5,2]
print(max(L))

## Exercice 19
def pos_max(L):
    M = max(L)
    return [i for i in range(len(L)) if L[i] == M]

L = [1,5,3,5,2]
print(pos_max(L))

## Exercice 20
def sans_rep(L):
    L1 = []
    for x in L:
        if x not in L1:
            L1.append(x)
    return L1


L = [1,5,3,5,2]
print(sans_rep(L))

## Exercice 21
def multiplicite(L):
    L1 = sans_rep(L)
    n = len(L1)
    M = [0]*n
    for i in range(n):
        for x in L:
            if x == L1[i]:
                M[i] += 1
    return L1, M

L = [1,5,3,5,2]
print(multiplicite(L))
