Algorithme de Kaprekar ÉCS2 1 Objectifs Dans la suite de l’algorithme, on souhaite ¶ vérifier informatiquement la conjecture En itérant l’algorithme de Kaprekar en partant d’un nombre à 3 chiffres, on finit par tomber sur 495 ou sur 0. On dit que la suite obtenue est stationnaire, c’est-à-dire constante à partir d’un certain rang ; · explorer ce qui se passe en partant de nombres à 4 ou 5 (voire plus) chiffres. À travers l’exploration un peu ludique d’un algorithme, renouer avec les fondements de la programmation en Scilab : les types d’objets les plus courants (réels, vecteurs, matrices ...) et les structures (tests, boucles, fonctions ...). 2 Algorithme de Kaprekar L’algorithme de Kaprekar est un algorithme qui transforme un nombre entier en un autre, de façon répétitive jusqu’à arriver à un cycle. Il fut découvert en par le mathématicien indien Dattatreya Ramachandra Kaprekar pour les nombres de quatre chiffres, mais il peut être généralisé à tous les nombres. 2.1 ¬ ­ ® ¯ 3. 2.2 Programmation de l’algorithme Afin de programmer l’algorithme de Kaprekar, on définit les deux fonctions suivantes : t=3// t=taille=nombre de chiffres function c=code(x) c=zeros(1,t) Description de l’algorithme y=0 for k=1:t Choisir un nombre n ; c(k)=floor((x-y)/10^(t-k)) Soit n1 le nombre obtenu en rangeant les chiffres de n dans l’ordre y=y+c(k)*10^(t-k) croissant et n2 le nombre obtenu en rangeant les chiffres de n dans end l’ordre décroissant ; endfunction déf. Le nombre de Kaprekar formé à partir de n est K(n) = n1 − n2 ; function x=decode(c) Recommencer les points ­, ® & ¯ avec K(n) à la place de n. x=sum(10^(t-(1:t)).*c) endfunction} n 410 396 594 Exemple : 1. 2. T.D.no 1 n1 410 963 n2 041 369 4. K(n) 396 594 5. Compléter le tableau précédent. Que constate-t-on ? 6. Essayer avec un autre nombre à 3 chiffres non identiques de votre choix. Que constate-t-on ? Et en partant de 111 ? Lycée Henri Poincaré 1/2 Faire des essais pour comprendre le but de ces fonctions. Expliquer le rôle de chaque ligne de ces fonctions. À l’aide de la fonction gsort et des deux fonctions précédentes, écrire une fonction d’en-tête function k=kaprekar(x) qui applique (une fois) l’algorithme de Kaprekar à x. lo 7. 8. 9. T.D.no 1 Algorithme de Kaprekar ÉCS2 S’assurer que la fonction Kaprekar fonctionne lorsque x vaut 0. Écrire une fonction d’en-tête function l=liste(x,n) calculant la liste des n premiers termes de la suite de Kaprekar x, K(x), K(K(x)), . . . À l’aide de la fonction find, écrire une fonction cycle(x) qui calcule la liste des termes de la suite de Kaprekar d’origine x jusqu’à ce qu’on tombe sur un terme déjà rencontré. On fera apparaître ce terme à la fin de la liste afin voir quel est le terme répété. Concrètement, on doit obtenir les exécutions suivantes : -->cycle(111) ans = 111. 0. -->cycle(410) ans = 410. 396. 14. Essayer plot2d(....,y,-1). Ce graphique valide-t-il la conjecture ? 15. Utiliser la liste y et la fonction find pour déterminer exactement tous les entiers dont la chute est 0. 16. Préciser alors la conjecture. 2.4 Exploration du cas “quatre chiffres” 17. En remplaçant t=3 par t=4, explorer le cas « quatre chiffres », émettre une conjecture analogue et la valider. 2.5 Exploration du cas “cinq chiffres” 18. Avec t=5, que donne cycle(12345) ? 19. Les suites Kaprekar à 5 chiffres sont-elles toutes stationnaires ? 20. Les suites Kaprekar à 5 chiffres sont-elles toutes cycliques à partir d’un certain rang ? 0. 594. 495. 495. 2.6 Et avec juste “deux chiffres” ? 10. Pour quelle raison est-on sûr, même si la conjecture n’est pas encore 21. À vous de voir, et d’expliquer, voire de démontrer ! validée, de retomber sur un nombre déjà rencontré ? Autrement dit, la suite devient nécessairement cyclique ... 3 Pour information 11. Écrire une fonction chute(x) calculant la valeur finale de la liste générée par cycle(x). Chiffres Cycles possibles Descriptions 2.3 Validation de la conjecture pour trois chiffres 2 2 (0) (9 81 63 27 45) 3 2 (0) (495) 4 2 (0) (6174) 5 4 (0) (53955 59994) (61974 82962 75933 63954) (62964 71973 83952 74943) 12. Quelle liste y génère le script suivant : r=10^t y=zeros(1,r); for k=0:r-1 y(k+1)=chute(k); disp([k y(k+1)]) end 13. Compléter l’instruction plot2d(....,y,0) pour faire apparaître les points (n, chute(n)) pour n ∈ [[0 ; 999]] sur un graphique. Lycée Henri Poincaré 2/2 lo