J'améliore mon programme de calculs de Permutations (ou factorielles), d'Arrangements et de Combinaisons - PAC pour les intimes - pour HP-29C/E.
C'est un peu hors-propos, mais c'est l'unique moyen que j'ai trouvé pour essayer d'obtenir 22/20 en informatique (comprenne qui peut ).
En 39 pas (un peu mieux que le précédent), il est surtout beaucoup plus rapide car il ne calcule que le nécessaire ; par exemple, le calcul de la combinaison C(52,3)= 22 100 prend moins de trois secondes contre dix-sept précédemment (sur HP-29E).
Voici :
Code : Tout sélectionner
01 LBL 1 | Factorielle ou son application immédiate : Permutations (combien de possibilités d'agencer des éléments un par un ?)
02 1
03 X>Y?
04 RTN | Si le nombre à factoriser égale zéro, il vaudra un.
05 x><y
06 ENTER | On copie X en Y, on bénéficiera ainsi de la formule des arrangements : N!/(N-P)!=N!/1
07 GSB 2
08 RTN
09 LBL 2 | Arrangements
10 FIX 0 | Tous les sous-programmes passent par ici, la mise en forme de l'affichage est donc placée ici.
11 1
12 STO 1 | ... En raison des multiplications ultérieures sur ce registre... cela évite aussi un effacement général.
13 Rd
14 x><y
15 -
16 Lst x
17 +
18 STO - 0
19 Lst x | Différents travaux pour positionner le N et le N-P et placer le curseur Mémoire correctement.
20 LBL 0 | La boucle de factorielle proprement dite.
21 STO * 1
22 1
23 -
24 ISZ | Si on atteint 0 (par en dessous), cela signifie qu'on ne doit plus multiplier.
25 GTO 0
26 RCL 1
27 RTN
28 LBL 3 | Combinaisons ; on va tirer profit des permutations en divisant par P! leur résultat.
29 STO 2
30 GSB 2
31 RCL 2
32 x><y
33 STO 2
34 x><y
35 GSB 1
36 RCL 2
37 x><y
38 /
39 RTN
Arrangements : A(8,3) {[8] [ENTER] [3] [GSB] [2]} = 336 en... pfiuuu... une seconde et demie ?
Combinaisons : C(52,3) {[5] [2] [ENTER] [3] [GSB] [3]} = 22 100 en moins de trois secondes.
Le programme prend en compte le fait que 0!=1 ; on comprend que le calcul de l'arrangement ou de la combinaison nécessite le cas où N=P, et si on avait zéro, ça ficherait la pagaille.
Et comme il se doit, seule la partie entière est montrée (FIX 0 au LBL 2) pour éviter les erreurs d'approximation.
Trois registres (0, 1 et 2), 39 pas : 60 octets.