Chapitre 6 Travaux Pratiques Python

6.1 Lights Out

6.1.1 Introduction et consignes

Le but de ce TP est de créer le jeu (Exercices 6.1 à 6.3) puis de savoir dans quelles dimensions le jeu a toujours une solution (Exercice 6.5) puis de créer un solutionneur (Exercices 6.4 à 6.7).

Dans tout ce TP, les matrices de taille \(n\) auront des indices \(i,j\) entre \(0\) et \(n-1\) pour avoir des notations compatibles avec Python.

Le TP sera rendu sous la forme d’un notebook JupyterLab (https://jupyter.org) sur la plate-forme Moodle de l’IUT (https://cours.iut-orsay.fr/). Il est possible d’utiliser la version en ligne mais la commande input() pose problème. Il est donc recommandé d’utiliser Jupyter en local. Pour cela, vous pouvez le lancer avec la commande suivante dans un terminal sous linux:

jupyter lab

Si elle ne fonctionne, vous pouvez essayer jupyter notebook. Sous windows, jupyter lab se trouve en suivant le chemin suivant :

C:\winpython\jupyterlab

Il aussi possible d’écrire des notebooks Jupyter avec certains IDE comme Visual Code Studio ou Pycharm : (https://www.jetbrains.com/help/pycharm/jupyter-notebook-support.html).

Une fois lancé, un navigateur s’ouvre. Vous pouvez choisir un nouveau notebook Python. Vous avez alors une interface de type IDE avec des fichiers d’exemple et la possibilité de créer un nouveau fichier avec un noyau Python.

Vous pouvez alors créer des cellules avec du texte au format Markdown ou du code Python. Cela vous permettra de mettre en page votre TP et éxécuter du code. Un court memento Markdown se trouve à la fin de ce TP. Il est conseillé de faire des cellules différentes pour créer des functions et faire tourner des exemples. L’ordre dans lequel on éxécute les cellules est important.

Il s’agit d’un TP de mathématiques et non de code informatique. Il est indispensable de sortir une feuille de brouillon et un stylo pour réfléchir avand de se lancer à écrire du code ! Les bonnes pratiques de code restent cependant valables (commenter le code, choisir des noms de variables explicites, définir des fonctions intermédiaires,…)

Vous aurez besoin de certaines bibliothèques pour manipuler des matrices. La principale est numpy. Vous pouvez la charger en premier lieu avec la commande suivante.

import numpy as np

L’option “as np”, signifie que vous pourrez appeler cette bibliothèque avec le raccourci np.

Avec numpy, une matrice est un objet de la classe array. Il s’agit d’une liste de listes, c’est la liste des lignes de la matrice. Par exemple, la matrice \(\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix}\) se définit avec la commande suivante

np.array([[1, 2, 3], [4, 5, 6]])

L’avantage d’utiliser cette classe est que l’on pourra utiliser des méthodes prédéfinies. Par exemple, le produit matriciel (np.dot(A,B) retourne le produit matriciel de \(A\) et \(B\)) ou la méthode .shape() qui retourne le couple \((n,m)\) correspondant aux dimensions de la matrice.

La documentation officielle numpy est à cette adresse : (https://numpy.org).

6.1.2 Exercices

Exercice 6.1 Le but de cet exercice est de créer deux fonctions, une qui associe le vecteur colonne dans la base canonique à une matrice de \(\mathrm{M}_{m,n}(\mathbf{K})\) et l’autre qui fait l’opération inverse.

  1. Soit \(A\in\mathrm{M}_{m,n}(\mathbf{K})\) et \(V\) le vecteur colonne associé. Quelle est la dimension de \(V\) ? Quelle est la relation entre les \(V_k\) et les \(A_{i,j}\) ?
  2. Écrire une fonction colonne Vecteur_Colonne(\(A\)) qui prend en entrée une matrice et retourne le vecteur associé de la bonne taille.
  3. Écrire la fonction Matrice(\(V\)) qui prend en entrée un vecteur colonne de taille \(n^2\) et retourne la matrice de taille \(n\times n\) correspondante.

Exercice 6.2 (Création des matrices croix) Créer une fonction Croix(\(i,j,n\)) qui crée la matrice \(C_{i,j}\) de taille \(n^2\) avec des 1 seulement en \((i,j)\) et les voisins verticaux et horizontaux. Il y aura des zéros aux autres positions.

Exercice 6.3 (Jeu 3X3) Dans cette question, on veut demande de créer un fonction Lights_Out() sans variable d’entrée qui lance le jeu avec les indications :

  1. Phrase d’accueil dans le jeu,
  2. Tirage d’une configuration alératoire avec la commande random.randint() de Numpy,
  3. Affichage de la configuration initiale,
  4. Demande de la case où le joueur veut jouer
  5. Récupération du numéro de ligne et de colonne avec la commande input()
  6. Mise à jour de la configuration et affichage de celle-ci
  7. On continue jusqu’à ce que le joueur éteigne toutes les lampes et dans ce cas, on affiche un message de félicitations et on sort du jeu.

Exercice 6.4 (Matrice de passage) Créer une fonction Matrice_Passage(\(n\)) qui prend en entrée la dimension \(n\) et retourne la matrice dont les vecteurs sont les \(C_{i,j}\) exprimées dans la base canonique de \(\mathrm{M}_n(\mathbf{F}_2)\). On prendra les \(C_{i,j}\) dans le même ordre que les vecteurs \(E_{i,j}\) de la base canonique.

Exercice 6.5 On veut déterminer pour quelles dimensions, le jeu a toujours une solution.

  1. Écrire une boucle qui calcule pour \(n=2\) à 11, le déterminant de Matrice_Passage(\(n\)). On rappelle que ce déterminant est un nombre dans \(\mathbf{F}_2\), c’est-à-dire 0 ou 1. Comme Python fait les calculs avec nombres à virgule flottante, il pourra être utile d’utiliser les commandes round(), int() et ajouter %2 pour avoir le reste dans la division euclidienne par 2.
  2. Donner la liste des dimensions inférieures à 11 pour lesquelles le jeu possède une solution unique pour toute configuration initiale.

Exercice 6.6 (Inverse de la matrice de passage en dimension 3) Grâce à Python, calculer l’inverse de la matrice de passage en dimension 3 dans. On pourra soit faire les calculs dans \(\mathbf{R}\) avec la commande linalg.inv() de Numpy, se ramener aux entiers puis réduire modulo 2 ou charger le package Sympy, changer le type de la matrice avec Matrix() et calculer l’inverse dans \(\mathrm{M}(\mathbf{F}_2)\) avec la méthode .inv_mod(2).

Exercice 6.7 (Solutionneur en dimension 3) Écrire une fonction Solution(\(A\)) qui prend en entrée une configuration initiale sous forme d’une matrice \(3\times3\) \(A\) et retourne une matrice solution \(S\) (qui contient des 1 pour les cases où il faut appuyer et des 0 ailleurs).

Tester avec une version en ligne du jeu.

Exercice 6.8 (Bonus) Créer une interface graphique pour le jeu grâce à la bibliothèque Pygame. On pourra le faire en dimension 3 puis laisser le choix de la dimension au joueur, ajouter un bouton pour afficher la solution (Dans ce cas, on tirera la solution au hasard et la configuration initiale sera son image par la matrice de passage)…

6.1.3 Memento Markdown

Un titre de niveau 1 (équivalent de la balise html “h1”) :

# Titre

Un titre de niveau 2 (équivalent de la balise html “h2”) :

## Sous-titre

Un titre de niveau 3 (équivalent de la balise html “h3”) :

### Sous-sous-titre

Du texte en gras :

**texte en gras**

Du texte en italique :

*texte en italique*

Une formule mathématique :

L'identité de Pythagore est $a^2+b^2=c^2$.

Une liste ordonnée :

1. Premier élément
2. Second élément
3. Troisième élément

Une liste non-ordonnée :

* Premier élément
* Second élément
* Troisième élément