Algorithme de Kaprekar 1 Objectifs 2 Algorithme de Kaprekar

publicité
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
Téléchargement