Algo & Prog 1 Python : TP séance 02
- 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.
Vocabulaire : les mots employés dans l'énoncé ont un sens très précis, ne confondez pas :
- la fonction saisit → elle fait un
input
- la fonction affiche → elle utilise
print
- la fonction renvoie → elle fait un
return
Exercice 1 : fractions, utilisation de tuples
On se propose de manipuler des fractions \(h/k\) sous la forme de tuples (h,k)
.
1.a. Saisie
Écrivez une fonction saisir_frac()
qui saisit au clavier les 2 membres
entiers d'une fraction puis les renvoie dans un tuple.
1.b. Affichage
Écrivez une fonction afficher_frac (f)
qui reçoit en paramètre une fraction
sous la forme d'un tuple, puis affiche la fraction sous la forme "h/k"
sans espace ni retour à la ligne.
1.c. Médian
On appelle médian de \(h/k\) et \(h'/k'\) la fraction \((h+h')/(k+k')\).
Écrivez une fonction calculer_median (f, g)
qui reçoit en paramètres deux
fractions sous la forme de tuples, puis renvoie leur médian dans un tuple.
1.d. Programme
Écrivez un programme utilisant les 3 fonctions, qui saisit 2 fractions, calcule leur médian puis l'affiche.
Exercice 2 : suites de Farey, liste de tuples, insertion par recopie
Les suites de Farey \(F_n\) d'ordre \(n\) sont les séries croissantes de fractions irréductibles entre 0 et 1, dont les dénominateurs n'excèdent pas \(n\).
- Les premières suites sont :
- \(F_1 : 0/1 < 1/1\)
- \(F_2 : 0/1 < 1/2 < 1/1\)
- \(F_3 : 0/1 < 1/3 < 1/2 < 2/3 < 1/1\)
- \(F_4 : 0/1 < 1/4 < 1/3 < 1/2 < 2/3 < 3/4 < 1/1\)
Dans tout l'exercice on code une suite de Farey sous la forme d'une liste de
tuples, par exemple \(F_2\) par [(0,1), (1,2), (1,1)]
.
2.a. Affichage
Écrivez la fonction afficher_suite_Farey (sf)
qui affiche la suite de
Farey reçue en paramètre, sur une seule ligne en utilisant afficher_frac()
.
Par exemple, si sf
représente \(F_3\), on devra obtenir cet affichage :
0/1 < 1/3 < 1/2 < 2/3 < 1/1
Tester la fonction dans un programme principal, et faire de même pour les questions suivantes.
2.b. Test de l'ordre
Écrivez la fonction frac_est_ordre_n (f, n)
qui reçoit en paramètres une
fraction f
irréductible entre 0 et 1 sous la forme d'un tuple, et un
entier n
.
La fonction renvoie True
si son dénominateur n'excède pas n
, sinon False
.
2.c. Construction d'une suite
Propriété 1 : si \(h/k < h''/k'' < h'/k'\) sont 3 termes successifs de \(F_n\), alors \(h''/k''\) est le médian de \(h/k\) et \(h'/k'\).
Étant donnée la suite de Farey \(F_{n-1}\), on peut donc construire \(F_n\) en intercalant entre chaque couple de fractions successives de \(F_{n-1}\) leur médian lorsque son dénominateur n'excède pas \(n\).
Écrire la fonction construire_suite_Farey (n, sf_n_1)
qui reçoit en
paramètres un ordre \(n > 1\) et la suite de Farey sf_n_1
d'ordre \(n-1\). La
fonction construit la suite \(F_n\) à l'aide de la propriété 1, puis la renvoie.
2.d. Calcul depuis le début
Écrire la fonction calculer_suite_Farey (n)
qui calcule la suite de Farey
d'ordre \(n \geq 1\) puis la renvoie. La fonction part de \(F_1\) puis construit les
suites \(F_2\), ... \(F_n\) en itérant sur construire_suite_Farey()
.
Exercice 3 : utilisation de dict et de set
3.a. Unicité
Écrire une fonction verifier_unicite_fractions (sf)
qui reçoit en
paramètre une suite de Farey sf
sous la forme d'une liste de tuples,
chaque tuple représentant une fraction comme dans les exercices précédents.
La fonction renvoie True
si chacune des fractions de la suite est unique
dans la suite, sinon False
.
Pour déterminer l'unicité, convertir la liste (qui est de type list
) en
ensemble (de type set
) puis comparer leurs longueurs respectives.
Écrire un programme principal permettant de tester différents cas de figure,
puis tester sur des suites obtenues avec construire_suite_farey
.
3.b. Rang d'une fraction
Écrire une fonction creer_dictionnaire_rangs (sf, n)
qui reçoit en paramètre
une suite de Farey sf
et son ordre n
. La fonction calcule puis renvoie un
dictionnaire dico_rangs
dans lequel chaque clé est un tuple représentant une fraction,
et la valeur associée est son rang dans sf
, c'est-à-dire son indice dans la
liste.
Par exemple pour \(F_2\), la fonction renvoie
{ (0,1) : 0, (1,2) : 1, (1,1) : 2 }
.
Écrire un programme principal qui demande à saisir un ordre n
,
puis calcule \(F_n\) et le dictionnaire de rangs.
Le programme entre ensuite dans un boucle infinie, dans laquelle il
saisit une fraction, cherche son rang dans le dictionnaire de rangs,
affiche le rang si il a été trouvé, sinon il affiche "absent
".
La boucle de saisie s'interrompt lorsque 0 0
est saisi.
Exercice 4 : cercles de Ford
Étant donné une suite de Farey \(F_n\), les cercles de Ford de la suite sont les cercles de centre \(\displaystyle (\frac{h}{k},\frac{1}{2k^2})\) et de rayon \(\displaystyle\frac{1}{2k^2}\) pour chaque fraction \(h/k\) de \(F_n\).
Ces cercles ont une propriété remarquable : deux cercles de Ford sont tangents si et seulement si leurs fractions sont consécutives dans une des suites de Farey.
Reprenez l'exemple de dessin en TkInter de la planche de TP01,
puis modifiez le programme de manière à ce qu'il saisisse un ordre \(n\),
calcule \(F_n\) puis appelle la fonction
dessiner_cercles_Ford (zone_dessin, h, w, n)
(à écrire)
qui dessine les cercles de Ford correspondants.
Dans la fonction il faudra multiplier les coordonnées par la largeur h
et la hauteur w
de la zone de dessin pour que les cercles prennent
tout l'espace.