Exercice
Q1
def divStrict(x):
for d in range(1, x):
if x % d == 0:
print(d)
Q2
La boucle fait $x-1$ itérations, la condition du if
ainsi que le print
étant $O(1)$ donc la complexité de divStrict(x)
est $O(x)$
Q3
def somDivStrict(x):
S = 0
for d in range(1, x):
if x % d == 0:
S += d
return S
Q4
def amis(x, y):
return x == somDivStrict(y) and y == somDivStrict(x)
Q5
def liste_amis(n):
L = []
for i in range(1, n+1):
for j in range(i, n+1):
if amis(i, j):
L.append((i,j))
return L
Q6
Soit $C(n)$ la complexité de liste_amis(n)
.
La fonction amis(x, y)
fait appel a somDivStrict
deux fois,
donc sa complexité est $O(x+y)$
Donc $$ \begin{split} C(n) &= \sum_{i=1}^n \sum_{j=1}^n O(i+j) \\ &= \sum_{i=1}^n O(n\times i + n\times(n+1)/2) \\ &= O(n^2\times(n+1)/2 + n^2\times(n+1)/2) \\ &= O(n^3) \\ \end{split} $$
Partie 1: SQL
Q1
INSERT INTO Personnes
VALUES (123, 'GUISSI', 'MARYAM', 'F'),
(138, 'FORA', 'AHMED', 'M')
Q2
$$ \pi_{code, nom, prénom}(\sigma_{codeC=394}(Personnes \underset{code = codeP}{\bowtie} Votes))$$
Q3
SELECT Personnes.code, Personnes.nom, Personnes.prénom
FROM Personnes
INNER JOIN Votes ON Personnes.code = Votes.codP
WHERE Votes.codC = 394
ORDER BY Personnes.code ASC
Q4
SELECT P.code, P.nom, P.prénom, P.genre
FROM Personnes AS P
INNER JOIN Votes ON P.code = Votes.codC
WHERE nom LIKE "_A___%"
ORDER BY nom, prénom ASC
Q5
SELECT P.code, P.nom, P.prénom
FROM Personnes AS P
WHERE genre = 'M'
AND P.code NOT IN (SELECT codP FROM Votes)
Q6
SELECT P.code, P.nom, P.prénom, P.genre
FROM Personnes AS P
INNER JOIN (
SELECT codC, COUNT(*) AS compte
FROM Votes
GROUP BY codC
) AS V
ON P.code = V.codC
WHERE V.compte > (SELECT COUNT(*) / 2 FROM Votes);
Q7
SELECT MAX(compte), MIN(compte), AVG(compte)
FROM (
SELECT COUNT(*) AS compte
FROM Votes
GROUP BY codC
) AS V
Partie 2 : Calcul numérique
Q1
def decoupe(P):
X = []
Y = []
for p in P:
X.append(p[0])
Y.append(p[1])
return X, Y
Q2
def matrice(X):
n = len(X)
M = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(i+1):
n_j = 1
for k in range(j):
n_j *= (X[i] - X[k])
M[i][j] = n_j
return M
Q3
def solution(M, Y):
n = len(Y)
A = [0 for _ in range(n)]
for i in range(n):
S = 0
for j in range(i):
S += M[i][j] * A[j]
A[i] = 1/M[i][i] * Y[i] - S
Q4
def valeur(x, A, X):
n = len(X)
S = 0
for i in range(n):
P = 1
for j in range(i):
P *= (x-X[j])
S += A[i] * P
return S
Q5
import numpy as np
import matplotlib.pyplot as plt
def courbe(P):
n = len(P)
X, Y = decoupe(P)
A = solution(matrice(X), Y)
t = np.linspace(min(X), max(X), 500)
images = [valeur(x, A, X) for x in t]
plt.plot(t, images, color="black")
plt.scatter(X, Y)
plt.show()
Partie 3 : Problème
Q1
def NON(X):
Z = ""
for x in X:
if x == "":
Z += "1"
else :
Z += "0"
return Z
Q2
def ET(X, Y):
n = len(X)
Z = ""
for i in range(n):
if X[i] == "1" and Y[i] == "1":
Z += "1"
else:
Z += "0"
return Z
Q3
def XOR(X, Y):
n = len(X)
Z = ""
for i in range(n):
if X[i] == Y[i]:
Z += "1"
else :
Z += "0"
return Z
Q4
def decal_droite(X, p):
return "0" * p + X[:-p]
Q5
def rotation_droite(X, p):
return X[:p] + X[:-p]
Q6
def addition(X, Y):
n = len(X)
c = 0
Z = ""
for i in range(n):
if X[i] + Y[i] + c == 0:
Z += "0"
c = 0
elif X[i] + Y[i] + c == 1:
Z += "1"
c = 0
elif X[i] + Y[i] + c == 2:
Z += "0"
c = 1
else :
Z += "1"
c = 0
return Z
Q7
def bin_fract(x, n):
s = ""
x = x**(1/n)
x -= int(x)
for i in range(32):
x *= 2
s += str(int(x))
x -= int(x)
return s
Q8
def liste_init(t, n):
return [bin_fract(L[i], n) for i in range(t)]
Q9
l’énonce semble comporter une erreur; on parle de 8 variables, de h0
a h7
, pas de variable h8
h0, h1, h2, h3, h4, h5, h6, h7 = liste_init(8, 2)
K = liste_init(64, 3)
Q10
def binaire(x, t):
s = ""
for i in range(t):
s = str(x % 2) + s
x //= 2
return s
Q11
def binaire_txt(T):
s = ""
for x in T:
s += binaire(x, 8)
return s
Q12
def remplissage(B):
n = len(B)
B += '1'
B += '0' * ((448 - len(B)) % 512)
B += binaire(n, 64)
return B
Q13
def decoupe(B):
n = len(B)
W = []
for x in range(len(B)//512):
w = [B[32*k:32*k+32] for k in range(16)]
W.append(w)
return W
Q14
def compression(W):
global h0, h1, h2, h3, h4, h5, h6, h7
for w in W:
w += ['0'*32 for _ in range(48)]
for i in range(16, 64):
S0 = XOR(rotation_droite(w[i-15], 7), XOR(rotation_droite(w[i-15], 18), decal_droite(w[i-15], 3)))
S1 = XOR(rotation_droite(w[i-2], 17), XOR(rotation_droite(w[i-2], 19), decal_droite(w[i-2], 10)))
w[i] = w[i-16] + S0 + w[i-7] + S1
a, b, c, d, e, f, g, h = h0, h1, h2, h3, h4, h5, h6, h7
for i in range(0, 64):
S0 = XOR(rotation_droite(e, 6), XOR(rotation_droite(e, 11), rotation_droite(e, 25)))
ch = XOR(ET(e, f), ET(NON(e), g))
tmp1 = h + S0 + ch + K[i] + w[i]
S1 = XOR(rotation_droite(a, 2), XOR(rotation_droite(a, 13), rotation_droite(a, 22)))
maj = XOR(ET(a, b), XOR(ET(a, c), ET(b, c)))
tmp2 = S1 + maj
h, g, f, e, d, c, b, a = g, f, e, d + tmp1, c, b, a, tmp1 + tmp2
h0 += a
h1 += b
h2 += c
h3 += d
h4 += e
h5 += f
h6 += g
h7 += h
Q15
def hex(s):
x = s[0] + 2*s[1] + 4*s[2] + 8*s[3]
if x == 10: return 'a'
if x == 11: return 'b'
if x == 12: return 'c'
if x == 13: return 'd'
if x == 14: return 'e'
if x == 15: return 'f'
return str(x)
def hache_final():
hache = ""
H = h0 + h1 + h2 + h3 + h4 + h5 + h6 + h7
n = len(H)
for i in range(n//4):
hache += hex(H[4*i: 4*i+4])
return hache