D.S. I.P.T. MP Exercice. On démontre que l ensemble N N est dénombrable (i.e. en bijection avec N) en numérotant chaque couple (x, y) N 2 suivant le procédé suggéré par la figure ci-dessous, appelée numérotation de Cantor de N 2 : a) Ecrire une fonction récursive Cantor(x,y) qui retourne le numéro du point de coordonnées (x, y). b) Ecrire une fonction récursive CantorInverse(n) pour la fonction réciproque. N.B. On veillera à ne pas multiplier les appels récursifs. c) Il est facile de donner une formule explicite pour la fonction Cantor(x,y) mais on ne la demande pas ici. En revanche, mathématiquement, pour définir CantorInverse(n) on doit distinguer le cas où n prend une des valeurs 0,,3,6,0... marquées sur l axe des abscisses du schéma. On note (T k ) k N la suite de ces valeurs : (i) Définir (T k ) k N mathématiquement. (ii) Ecrire une fonction impérative Tk(n) qui renvoie True si n est une valeur de cette suite (T k ) et False sinon. Exercice 2. On s intéresse ici au nombre de façons d obtenir n euros avec des pièces et des billets de, 2, 5 et 0 euros. Par exemple n = 5 peut se décomposer en + + + +, + + + 2, + 2 + 2, 5, ce qui donne 4 façons. D une manière générale une décomposition sera donc donnée par un quadruplet [a, a 2, a 5, a 0 ] tel que a + a 2 2 + a 5 5 + a 0 0 = n. Il est utile pour la suite de penser que n = 0 admet une décomposition associée au quadruplet [0, 0, 0, 0]. ) On veut écrire une fonction comptepiece qui reçoit comme paramètre un entier n et qui renvoie le nombre de décompositions comme ci-dessus. Indication On peut séparer les décompositions entre celles qui contiennent (au moins) un billet de 0 euros et les autres. Pour compter les décompositions de n qui contiennent un billet de 0 euros, il est équivalent de compter celles de n 0. Pour les autres décompositions de n, on est ramené à une décomposition avec une liste plus petite. Ainsi, une bonne façon de résoudre ce problème est de le généraliser : on écrira plutôt une fonction compteavecliste(n,l) qui prend comme argument n et L où n est un entier strictement positifs et L est une liste d entiers et compteavecliste renvoie le nombre de façons d écrire n comme somme d éléments de L. On en déduira ensuite facilement la fonction comptepiece. 2) (Plus difficile) Ecrire ensuite une fonction decompose(n,l) qui renvoie sous forme d une liste de listes toutes les décompositions de l entier n à l aide des éléments de la liste L. Par exemple : >>>decompose(5,[,2,5,0]) [[,,,, ], [,,, 2], [, 2, 2], [5]]
Problème : suites de Farey Introduction : Pour tout n N, la suite de Farey d ordre n, notée F n, est la suite croissante des fractions irréductibles a avec 0 a b n dans N, qui sont donc dans l intervalle [0, ]. b Par exemple F = [ 0, ] et F 5 = [ 0, 5, 4, 3, 2 5, 2, 3 5, 2 3, 3 4, 4 5, ]. Le but de ce petit problème est d étudier plusieurs méthodes de construction des suites de Farey. Convention : Une écriture fractionnaire a/b sera codée par une liste [a,b]. 0) Quelques outils pour la suite : a) Créer une fonction chaine qui prend en argument une liste [a,b] et renvoie la chaîne de caractère "a/b". b) En déduire une fonction chaineliste qui reçoit une liste de rationnels (toujours écrits chacun sous la forme [a,b]), ne renvoie rien mais affiche la chaîne de caractères formée de ces rationnels écrits sous la forme "a/b", séparés par des virgules. c) Ecrire une fonction récursive pgcd qui reçoit deux entiers a et b et renvoie le pgcd de a et b. d) En déduire une fonction simplifieliste qui reçoit une liste L de couples [a,b] codant des rationnels et qui renvoie une autre liste M obtenue à partir de L en enlevant les couples tels que pgcd(a,b). e) Créer une fonction elimine qui reçoit une liste L de rationnels irréductibles et un entier positif n et renvoie une liste M obtenue à partir de L en enlevant les rationnels dont le dénominateur est strictement supérieur à n. ) Tri par insertion Ecrire une fonction Tri qui reçoit une liste L et renvoie une liste triée déduite de L par la méthode de tri par insertion. 2) Une méthode brutale pour obtenir la suite de Farey a) Ecrire une fonction listebrute qui reçoit un entier n et renvoie la liste de tous les couples [i,j] avec 0 i < j n à laquelle on rajoute [,]. b) A l aide de fonctions précédentes (ou de modifications de ces fonctions) déduire de la fonction listebrute une fonction Fareybrut(n) qui renvoie la suite de Farey F n sous la forme d une liste ordonnée de couples. 3) Un peu de mathématique pour trouver un meilleur algorithme! Dans la méthode précédente, on a dû utiliser un algorithme de tri. On va voir qu on peut s en passer. Dans la suite, on va utiliser les deux propriétés suivantes des suites de Farey : Prop. 3. Si a /b et a 2 /b 2 sont deux termes consécutifs de F n alors : a 2 b a b 2 =. Prop. 3.2 Si a /b, a 2 /b 2 et a 3 /b 3 sont trois termes consécutifs de F n, alors : a 2 b 2 = a + a 3 b + b 3. Question de maths (plutôt facile!) : Montrer que la propriété 3. entraîne la propriété 3.2. On admet provisoirement la propriété 3., cf partie 6) 4) Un algorithme plus efficace A l aide de la propriété 3.2, on peut construire F 2 à partir de F = [ 0, ] : il suffit de rajouter 0 + + = au milieu (cette fraction est appelée médiante des deux écritures précédentes). 2 2
a) Obtenir ainsi, à la main, sur votre copie, les suites F 2, F 3, F 4, F 5. Bien noter ce qu il faut faire en plus, à part le calcul des fractions médiantes, pour obtenir vraiment F 4 et F 5 b) Ecrire une fonction ajoutemediante qui reçoit une liste L dont les entrées sont des couples de la forme [a,b] et modifie cette liste L pour ajouter entre chaque entrées [a,b] et [a,b ] successives la médiante [a+a,b+b ]. c) Déduire de ce qui précède une fonction Farey qui reçoit un entier n et renvoie la liste F n toujours sous la forme d une liste de couples. Remarque : on admet ici (voir le 6) pour une preuve) que si (a, b) et (a, b ) sont deux termes successifs d une suite F n alors a + a et b + b sont encore premiers entre eux. 5) Un petit dessin pour finir Avec les algorithme précédent, on construit pour chaque a b dans F n, le cercle de Ford de centre ( a b, ) de rayon. On obtient pour n = 0 : 2b2 2b2 On donne le script suivant qui définit une fonction cercle permettant de tracer un cercle avec pylab : import pylab as pl pl.clf() F=pl.gca()# get current axis def cercle(x,y,r): """crée un cercle de centre (x,y) et de rayon r""" cir=pl.circle([x,y],radius=r,fill=false) F.add_patch(cir) # ajout du cercle # à la figure F var. globale. cercle(0,0,) # création d un cercle de centre (0,0) et de rayon pl.axis( scaled ) # pour que la figure soit centrée sur notre cercle... pl.show() # affichage de la figure Travail à faire : de Farey F n. Ecrire un script permettant de tracer les cercles de Ford associés à une suite 3
Appendice au problème : questions de maths (points bonus, à rédiger sur une copie séparée) ou à la maison 6) Un peu de géométrie des nombres : Définition 6.. On se place dans le plan R 2 : dans ce plan on appelle réseau les sous ensembles de la forme R = Zu + Zv où u = (x, y ) et v = (x 2, y 2 ) sont deux vecteurs du plan fixés. Autrement dit un vecteur w est dans R si, et seulement si, il existe deux entiers k et l dans Z tels que w = ku + lv. Par exemple sur le dessin ci-dessous w = u + 3v. Définition 6.2. On note e = (, 0) et e 2 = (0, ) les deux vecteurs de la base canonique de R 2. On appelle réseau fondamental le réseau Λ = Ze + Ze 2 = Z 2 R 2. a) On considère une transformation linéaire f Λ Λ, (x, y) Z 2 (ax + by, cx + dy) avec (a, b, c, d) Z 2 autrement dit de matrice A = ( a b c d ) M 2(Z). Démontrer que f(λ) = Λ si, et seulement si, le déterminant det(f) = det(a) est égal à ±. b) En déduire que pour deux vecteurs u et v de Z 2 le réseau Zu + Zv engendré par u et v est égal au réseau fondamental Z 2 si et seulement si det(u, v) =, ce qui revient à dire que l aire du parallélogramme de côté u et v vaut. N.B. Ce parallélogramme est appelé maille du réseau en cristallographie. Définition 6.3. Un point P Z 2 est dit visible depuis l origine s il n y a aucun point du réseau Λ = Z 2 dans l intervalle ]O, P [, où O = (0, 0). Exemple : (, ) est visible depuis O, mais (2, 2) ne l est pas puisque justement (, ) le cache. Remarque : Il est facile de voir que, de manière générale, un point P = (x, y) Z 2 est visible depuis l origine si, et seulement si, pgcd(x, y) =. c) Soient P et Q deux points de Z 2 visibles depuis l origine. Soit = det( OP, OQ) l aire du parallélogramme Π de côté OP et OQ. Montrer qu il n y aucun point de Z 2 à l intérieur du parallélogramme Π si, et seulement si, =. 4
d) Application à la prop. 3.. Les fractions [a,b] avec 0 a b n et pgcd(a, b) =, correspondent aux points (a, b) visibles depuis l origine à l intérieur ou au bord du triangle délimité par les droites d équations x = 0, y = x et y = n. Si on fait tourner une droite passant par l origine, à partir du bord d équation y = x, dans le sens inverse trigonométrique, cette droite va rencontrer successivement tous les points visibles. En déduire la propriété 3.. : si [a, b ] et [a 2, b 2 ] représentent deux fractions de Farey consécutives alors : a 2 b a b 2 =. e) En déduire aussi que si [a, b ] et [a 2, b 2 ] représentent deux fractions de Farey consécutives dans F alors en posant a = a + a 2 et b = b + b 2, on a encore pgcd(a, b) =. 5