Aller au contenu

Algo & Prog 1 Python : TP séance 03

Rendu du TP sur Ametice :
Suivez les instructions pour le rendu du TP en mettant le bon numéro de séance dans le nom du répertoire.
N'oubliez pas de rendre votre travail à la fin de la séance comme indiqué, même si vous n'avez pas fini la planche de TP, puis de rendre la version finale avant le début de la séance suivante.

Exercice 1 : pgcd et récursivité

Pour chaque question écrire un programme principal qui permet de tester la fonction.

1.a. Calcul pour 2 entiers

Écrire une fonction récursive calculer_pgcd (a, b) qui calcule et renvoie le plus grand commun diviseur entre 2 nombres \(a\) et \(b\) positifs. Utiliser la définition suivante :

\[ \text{pgcd}(a,b) = \left\{\begin{array}{ll} a+b & \text{si } a*b = 0 \\ \text{pgcd}(a\,, b\,\text{mod}\,a) & \text{si } a \leqslant b \\ \text{pgcd}(a\,\text{mod}\,b\,, b) & \text{si } a > b \end{array}\right. \]

Par exemple : \(\text{pgcd}(85, 25) = \text{pgcd}(10, 25) = \text{pgcd}(10, 5) = \text{pgcd}(0, 5) = 5\).

1.b. Valeur absolue

Propriété : \(\forall a,b\;\) on a \(\;\text{pgcd}(a,b) = \text{pgcd}(|a|,|b|)\).

Écrire une fonction remplacer_abs_liste (liste) qui reçoit en paramètres une liste d'entiers. La fonction remplace dans la liste les entiers négatifs par leur valeur absolue.

1.c. Calcul sur une liste d'entiers

Écrire une fonction calculer_pgcd_liste (liste) qui reçoit en paramètre une liste d'entiers positifs ou nuls. La fonction calcule et renvoie le pgcd des entiers stockés dans liste.

Utiliser la propriété 1 :
\(\text{pgcd}(a, b, c) = \text{pgcd}(\text{pgcd}(a, b), c)\).

Par exemple, pour calculer le pgcd de \(a, b, c, d\) on calcule :

  • \(x = \text{pgcd}(a,b)\) ;
  • \(y = \text{pgcd}(x,c)\) ;
  • \(z = \text{pgcd}(y,d)\) ;

le résultat est alors \(z\).

Traiter tous les cas de figure (1 élément, 2 éléments, ...) en utilisant si besoin la propriété 2. Si la liste est vide on renvoie 0.

Propriété 2 : \(\forall a \geq 0\;\) on a \(\;\text{pgcd}(a,0) = a\).

1.d. Saisie des entiers

Écrire un programme principal qui saisit des entiers (éventuellement négatifs) au clavier et les stocke dans une liste ; la saisie s'arrête lorsque l'on rentre 0. Le programme affiche un message d'erreur si on ne saisit pas un entier, mais continue quand même la saisie.

Le programme affiche ensuite le pgcd des entiers saisis.

Exercice 2 : points visibles

On appelle point visible (depuis l'origine) un point \(P\) de coordonnées entières \((x,y)\) telles qu'il n'existe aucun autre point de coordonnées entières sur le segment \([O,P]\).

Une condition équivalente est \(\text{pgcd}(x,y) = 1\).

2.1. Test de visibilité

Écrire une fonction est_visible(x,y) qui renvoie True si le point \((x,y)\) est visible, sinon False.

2.2. Dessin d'une grille

Reprenez l'exemple de dessin en TkInter de la planche de TP01, puis modifiez le programme de manière à ce qu'il saisisse un entier positif \(n\), puis appelle la fonction dessiner_grille (zone_dessin, h, w, c, n)h est la hauteur et w est la hauteur de la zone de dessin (en pixels), et c est la longueur en pixels du côté d'une case de la grille.

Écrire une fonction dessiner_grille qui affiche une grille rectilinéaire (comme les carreaux d'un cahier) de \(n+1\) par \(n+1\) cases (il suffit de tracer des traits horizontaux et verticaux).

Elle affiche également en bas, et à gauche, les coordonnées des cases de \(0\) à \(n\), comme sur un échiquier (mais que avec des chiffres).

2.3. Dessin des points visibles

Écrire la fonction dessiner_points_visibles (zone_dessin, h, w, c, n) et appeler la fonction dans le programme principal, juste après l'appel de dessiner_grille.

La fonction dessiner_points_visibles affiche une croix bleue dans chaque case \((x,y)\) telle que \(0 \leqslant y \leqslant x \leqslant n\) si \((x,y)\) est un point visible.

2.4. Comparaison avec Farey

Recopier la fonction calculer_suite_Farey (n) du TP précédent, ainsi que les fonctions qu'elle appelle.

Appeler calculer_suite_Farey (n) dans votre programme principal, puis la fonction dessiner_suite_de_Farey (à écrire) qui pour chaque fraction \(h/k\) de la suite de Farey, affiche un petit cercle rouge dans la case de coordonnées \((k, h)\).

Que constatez-vous, est-ce que les carrés bleus et les cercles rouges se superposent tous ?