L’algorithme de Dattatreya Ramachandra Kaprekar
VOICI une petite appplication écrite en python3 (sa forme permet une autoexécution pour un système Unix) reprenant l’algorithme imaginé en 1949 par Dattatreya Ramachandra Kaprekar (1905-1986). Pour ce qui est de la théorie, voir la page de Wikipedia.
Cette page suit les recommandations de 1990 pour une orthographe réformée.
L’algorithme est plutôt simple :
- Prendre n’importe quel nombre, par exemple 486
- faire la différence entre le nombre de ses chiffres en ordre décroissant et celui en nombre croissant : 864 - 468 = 396
- répéter l’opération avec la réponse obtenue : 963 - 369 = 594 ; 954 -459 = 495
- constater qu’arrivé à 495, l’algorithme reproduit du 495 : 954 -459 = 495
- constater qu’avec certains nombres, comme 999, le résultat est nul : 999 - 999 =0
- essayer avec quelques nombres de quatre chiffres.
- essayer également avec des nombres de plus de quatre chiffres.
Voici l’application qui permet d’éviter ces calculs qui deviennent vite fastidieux :
#! /usr/bin/python3
print("""
Générateur des suites de Kaprekar -- Jean-Christophe Beumier -- GPL3
Pour un nombre de trois chiffres, la différence entre le nombre
constitué de ses trois chiffres en ordre descendant et le nombre
constitué de ses chiffres ascendant finit (itération) par donner 495
Exemple: 381 -> 831 -138 = 693 -> 963 -369 = 594 -> 954 -459
= 495 -> 954 -459 =495 (ce dernier nombre cycle sur lui même)
Des cas triviaux donnent 0 : 100 -> 100 -1 = 99 -> 99 -99 =0
À quatre chiffres, le nombre final est 6174 (ou 0)
Pour plus de chiffres, des cyclages sur plusieurs nombres apparaissent
""")
q =int(input("nombre de chiffres (de 2 à 5 est recommandé): "))
texte =[] ; mx =0
for i in range(10 **(q -1), 10 **q) : # détermination de la plage des nombres
n =i ; suite =[]
while -1 :
ch =str(n)
n1 =int("".join(sorted(ch))) # mises en ordre
n2 =int("".join(sorted(ch, reverse=True))) # des chiffres
n =n2 -n1 ; nn =str(n)
# si un nombre est déjà présent dans la suite
if nn in suite :
fin =suite.index(nn) ; lon =len(suite)
suite[fin] =f">{suite[fin]}" # marquage du début de cycle
ligne =f"{i} ({lon}) {' '.join(suite)}<"
mx =max(lon, mx)
break
suite +=[nn]
print(ligne)
texte +=[ligne]
print("itération maximale:", mx)
open(f"kaprekar{q}ch.txt", "w").write("\n".join(texte))