Adloun

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.