etape0(n,s):={ local ch,chA,chD,t,nA,nD; si (n==0) return n;fsi; ch,t:=chiffres0(n); chA:=SortA(ch); chD:=SortD(ch); nA:=nombre(chA); nD:=nombre(chD)*10^(s-t); return nD-nA; };
En utilisant la fonction horner de xcas au lieu de nombre, on écrit la fonction etape (f(n)=etape(n,4)) puis, on écrit la fonction test pour tester un nombre quelconque en itérant la fonction f :
chiffres(n):={ local ch,t; ch:=string(n); t:=size(ch); return (asc(ch)-[seq(48,t)],t); }; etape(n,s):={ local ch,chA,chD,t,nA,nD; (ch,t):=chiffres(n); chA:=SortA(ch); chD:=SortD(ch); nA:=horner(chA,10); nD:=horner(chD,10)*10^(s-t);; return nD-nA; }; test(n,s):={ si (n==0) "0 non permis";fsi; si (n>10^s) alors return s+" chiffres au plus";fsi; si (irem(n,horner([seq(1,s)],10))==0) alors return s+" chiffres non identiques" fsi; si (s==3) alors tantque (n!=495) faire print(n);n:=etape(n,s);ftantque; fsi; si (s==4) alors tantque (n!=6174) faire print(n);n:=etape(n,s);ftantque; fsi; return n; };On écrit une première "démonstration" en testant tous les nombres en ordonnant leur chiffres pour ne pas faire 103 (resp 104) tests : c'est le fait que le programme s'arrête qui prouvera que 495 (resp 6174) est un point fixe de f. On compte le nombre m d'itérations que l'on doit faire avant d'obtenir 495 (resp 6174).
demo495():={ local j,k,l,u,n,p,m,n0; p:=0 for (j:=0;j<10;j++){ for (k:=j;k<10;k++){ for (l:=k;l<10;l++){ if (l!=j){ n:=horner([j,k,l],10); p:=p+1;m:=0;n0:=n; tantque (n!=495) faire m:=m+1;n:=etape(n,3);ftantque; print(n0,m); } } } } return p; }Pour 6174
demo6174():={ local j,k,l,u,n,p,m,n0; p:=0 for (j:=0;j<10;j++){ for (k:=j;k<10;k++){ for (l:=k;l<10;l++){ for (u:=l;u<10;u++){ if (u!=j){ n:=horner([j,k,l,u],10); p:=p+1;m:=0;n0:=n; tantque (n!=6174) faire m:=m+1;n:=etape(n,4);ftantque; print(n0,m); } } } } } return p; }On trouve que pour s = 3, on a tester p=210 nombres et pour tous ces nombres le nombre d'itérations est inférieur ou égal à 6.
demorapide():={ local j,k,n,p,m,n0; for (j:=1;j<10;j++){ for (k:=0;k<10;k++){ n:=9*(j*111+k*10) m:=0;n0:=n; tantque (n!=6174) faire m:=m+1;n:=etape(n,4);ftantque; print(n0,m); } } return "fin"; }On cherche la liste des nombres à tester :
atester():={ local j,k,n,ch,nA,chA,l; l:=[]; for (j:=1;j<10;j++){ for (k:=0;k<10;k++){ n:=9*(j*111+k*10); ch:=chiffres(n)[0]; chA:=SortA(ch); nA:=horner(chA,10); if (member(nA,l)==0) {l:=append(l,nA);} } } return sort(l); }On obtient une liste de 30 éléments :
[189,288,378,468,558,999,1179,1269,1278,1359,1377,1449, 1467,1557,1899,2268,2358,2367,2448,2466,2556,2799,3357, 3447,3456,3555,3699,4446,4455,4599]On teste les nombres de cette liste dans demorapide2 :
demorapide2():={ local l,s,n,n0,m,j; l:=atester(); s:=size(l); for (j:=0;j<s;j++){ n:=l[j]; n0:=n; m:=0; tantque (n!=6174) faire m:=m+1;n:=etape(n,4);ftantque; print(n0,m); } return "fin"; }On trouve par exemple que pour 9351=9*(9*111+4*10) il faut 6 itérations. Mais comme f(9730)=9730-379=9351, pour 9730 il faut 7 itérations.