Vérifier sur des matrices aléatoires que transposee(transposee(m))…
Exercice de TD · niveau 2 · NSI (première), chapitre 4 — Les types construits · Matrices, et le piège de la référence partagée
Énoncé
Vérifier sur des matrices aléatoires que transposee(transposee(m)) redonne m. Cette vérification prouve-t-elle que transposee est correcte ? Justifier en une phrase, en s'appuyant sur le chapitre 3.
Corrigé
for _ in range(500):
L, C = random.randint(1, 5), random.randint(1, 5)
m = [[random.randint(-9, 9) for _ in range(C)] for _ in range(L)]
assert transposee(transposee(m)) == m
Les matrices passent, rectangulaires comprises. C'est rassurant, et c'est mathématiquement attendu : .
Non, cette vérification ne prouve pas que transposee est correcte. La raison est celle du chapitre 3 : un test d'involution ne teste que la composition des deux applications, pas chacune séparément. Le contre-exemple est immédiat :
def transposee_fausse(m):
return [ligne for ligne in m] # ne transpose rien du tout
carre = [[1, 2], [3, 4]]
assert transposee_fausse(transposee_fausse(carre)) == carre # passe !
assert transposee(carre) == [[1, 3], [2, 4]] # la vraie reponse
La fonction identité passe le test d'involution sans broncher. Sur des matrices rectangulaires elle serait démasquée par l'assertion de dimensions ; sur des matrices carrées, rien ne la trahit.
Ce qu'il faut ajouter. Un cas dont la réponse vient d'ailleurs que du code : transposee([[1, 2], [3, 4]]) doit rendre [[1, 3], [2, 4]]. Et une propriété qui caractérise la transposition plutôt que de la composer avec elle-même :
t = transposee(m)
for i in range(len(m)):
for j in range(len(m[0])):
assert t[j][i] == m[i][j]
Celle-là teste la définition, case par case, et aucune fonction fausse n'y survit. Un bon test compare à la définition, pas à une autre exécution du même code.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.