Exercice
Q1
def puiss(x, n):
p = 1
while n != 0 :
if n % 2 == 1 :
p = p * x
x = x * x
n = n // 2
return pQ2
L = [10, 0, 7, -3, -2, 0, -1]Q3
def valeur(x, L):
v = 0
for i in range(len(L)):
v += puiss(x, i) * L[i]
return vQ4
la fonction puiss a une complexité $O(log(n))$
On pose $n = len(L) =$ dégrée du polynôme
donc :
$$C(n) = O(\sum_{i=0}^{n-1} log(i)) = O(nlog(n))$$
voir plus de detail ici
Q5
def images(X, L):
Y = []
for x in X:
Y.append(valeur(x, L))
return YQ6
- Version iterative
def compose(x, L, n):
v = x
for i in range(n):
v = valeur(v, L)
return v- Version recursive
def compose(x, L, n):
if n == 0: return x
return valeur(compose(x, L, n-1), L)- Version optimisee (WIP)
def compose_opti(x, L, n):
v = x
while n != 0 :
if n%2 == 1 :
pass
# TODO
n = n//2
return pPartie 1
import numpy as np Q7
def minProduit(T, i, j):
if i == j-1 :
return 0
R = []
for k in range(i+1, j):
c = minProduit(T, i, k) + minProduit(T, k, j) + T[i]*T[k]*T[j]
R.append(c)
return min(R)Q8
D = {}
def minPrd(T, i, j):
if (i, j) in D:
return D[(i, j)]
if i == j-1 :
D[(i, j)] = 0
return 0
R = []
for k in range(i+1, j):
c = minPrd(T, i, k) + minPrd(T, k, j) + T[i]*T[k]*T[j]
R.append(c)
D[(i, j)] = min(R)
return D[(i, j)]
T = [20, 10, 35, 8, 12]
# minPrd(T, 0, len(T)-1)
# print(D)Q9
def matriceC(T):
n = len(T)-1
C = [[0]*n for i in range(n)]
for d in range(1, n):
for i in range(n-d):
j = i + d
R = []
for k in range(i, j):
R.append(C[i][k] + C[k+1][j] + T[i]*T[k+1]*T[j+1])
C[i][j] = min(R)
return C
# print(matriceC(T))Q10
def matriceP(T, C):
n = len(T)-1
P = [[0]*n for i in range(n)]
for d in range(1, n):
for i in range(n-d):
j = i + d
for k in range(i, j):
if C[i][k] + C[k+1][j] + T[i]*T[k+1]*T[j+1] == C[i][j]:
P[i][j] = k
break
return PQ11
def produit_matriciel(M):
n = len(M)
T = [len(m) for m in M]
T.append(len(M[-1][0]))
C = matriceC(T)
P = matriceP(T, C)
def produit(M, i, j):
if i == j: return M[i]
if i == j-1 : return numpy.dot(M[i][j])
return produit(M, i, P[i][j]) * produit(M, P[i][j] + 1, j)
return produit(M, 0, n-1)Partie 2
Q12
8 bits, car $2^8 = 256$ états, de 0 a 255
Q13
On a 1000 lignes et 1800 colonnes, donc $ 18 \times 10^5 $ pixels, donc $ 3 \times 18 \times 10^5 $ entiers sur 1 octet, donc la taille totale est $ 5273,43 $ ko
Q14
def histogramme(M):
H = [[0]*256 for c in range(3)]
for i in range(len(M)):
for j in range(len(M[0])):
for c in range(3):
val = M[i][j][c]
H[c][val] += 1
return H
import matplotlib.pyplot as pltQ15
def representation(H):
t = list(range(256))
plt.plot(t, H[0], color="red", label="rouge")
plt.plot(t, H[1], color="green", label="vert")
plt.plot(t, H[2], color="blue", label="bleu")
plt.legend()
plt.show()
M = plt.imread("Iris_versicolor_3.jpg")
# H = histogramme(M)
# representation(H)Q16
def distance(X, Y):
d = 0
for c in range(3):
d += abs(X[c] - Y[c])
return dQ17
from random import randint
def init_centroides(M, k):
n, m, _ = M.shape
C = []
for i in range(k):
x, y = randint(0, n-1), randint(0, m-1)
C.append(M[x][y])
return CQ18
def proche_centroide(P, C):
m = np.inf
i_min = 0
for i in range(len(C)):
if distance(P, C[i]) < m :
i_min = i
m = distance(P, C[i])
return i_minQ19
def segmentation(M, C):
n, m, _ = M.shape
R = np.zeros((n, m))
for i in range(n):
for j in range(m):
R[i][j] = proche_centroide(M[i][j], C)
return RQ20
def nv_centroide(M, R, g):
n, m, _ = M.shape
c0, c1, c2 = 0, 0, 0
total = 0
for i in range(n):
for j in range(m):
if R[i][j] == g :
c0 += M[i][j][0]
c1 += M[i][j][1]
c2 += M[i][j][2]
total += 1
return [c0/total, c1/total, c2/total]Q21
def maj_centroides(M, R, k):
C = []
for i in range(k):
C.append(nv_centroide(M, R, i))
return CQ22
def kmeans(M, k, n):
C = init_centroides(M, k)
for i in range(n):
R = segmentation(M, C)
new_C = maj_centroides(M, R, k)
if new_C == C :
break
C = new_C
return R, CQ23
def calcul_inertie(M, R, C):
n, m, _ = M.shape
inertie = 0
for i in range(n):
for j in range(m):
cluster = R[i][j]
inertie += distance(M[i][j], C[cluster])
return inertieQ24
def inerties(M, n):
D = {}
for k in range(1, 10):
R, C = kmeans(M, k, n)
D[k] = calcul_inertie(M, R, C)
return DSQL
Q25
La clé primaire est le couple (ligne, colonne), car pour déterminer un unique pixel il faut la ligne et la colonne, tandis qu’utiliser uniquement la ligne ou la colonne ne donne pas l’unicité
Q26
$$ \pi_{ligne, colonne, rouge, vert, bleu} \left(\sigma_{\begin{subarray}{c} cluster=0 \\ or \\ cluster=2 \end{subarray}} \left(Segmentation\right)\right)$$
Q27
SELECT ligne, colonne, rouge, vert, bleu
FROM Segmentation
WHERE cluster = 1 or cluster = 2
ORDER BY ligne, colonne ASC Q28
SELECT cluster, COUNT(*) AS compte, AVG(rouge) AS intensite_rouge_centroide
FROM Segmentation
GROUP BY cluster
HAVING intensite_rouge_centroide BETWEEN 100 AND 200
ORDER BY compte DESCQ29
SELECT AVG(compte)
FROM (
SELECT COUNT(*) AS compte
FROM Segmentation
GROUP BY cluster
)