Je me suis d'abord demandé pourquoi il y avait un module accélérateur aussi sophistiqué avec pas moins de huit niveaux. Puis ensuite, j'ai réalisé qu'effectivement calculer les grands nombres de Fibonacci pouvait être très long en commençant avec 1+1 = 2 , 1+2 =3, 2+3 =5, ...FLISZT a écrit : ↑04 déc. 2022 22:14 Présentation du système OuraganCode : Tout sélectionner
<< DUP { } → n m l << CASE m 18 ALOG > THEN 200 END m 15 ALOG > THEN 88 END m 12 ALOG > THEN 74 END m 9 ALOG > THEN 60 END m 6 ALOG > THEN 45 END m 3 ALOG > THEN 30 END m 2 ALOG > THEN 16 END m 2 ALOG ≤ THEN 12 END END 'm' STO
Code : Tout sélectionner
{ } { } 1 CF m WHILE 1 ≠
Code : Tout sélectionner
REPEAT m FIB DUPDUP n ≤ IF THEN UNROT + SWAP NEG 'n' STO+ 1 'l' STO+ SWAP "F" m + + 1 SF ELSE DROP2 1 FS? 1 == { 0 ::l STO+ } IFT END
2) Le module "Fiboget"Code : Tout sélectionner
'm' DECR END l REVLIST >> >>
Code : Tout sélectionner
<< [[1 1][1 0]] SWAP ^ 2 GET >>
Et effectivement. Mais il y a quand même comme un petit problème. Le Grieg's Baron Von Nervigstück am Petrus me fait remarquer qu'il n'y a que huit niveaux et que la suite de l'algorithme ne décrémente la variable locale 'm' que pas à pas. Le Baron se demande donc s'il n'y a pas là un moyen de faire plus rapide. Surtout qu'avec un "Fiboget" aussi performant, il devrait être possible d'économiser des tentatives de pointage en utilisant l'inverse de la formule du Binet comme le fait zpalm pour mieux approcher la valeur m.
J'aurai volontiers essayé, mais nous n'avons pas ici de matériel aussi performant. Les seuls systèmes RPL mobilisés sur notre front sont les Achtundzwanzig Spezial en action au nord du pays.
Elles sont munies du code suivant qui formate parfaitement les rapports de tirs en laissant les décompositions sous forme algébrique, les indices sous forme de liste et le code résultat sous forme binaire. En interne, les valeurs de Fibonacci et leur indice sont mémorisées dans la pile sous forme de valeur complexe (k,Fk).
Code : Tout sélectionner
« 0 { } #0b → n S F b
« 0 (1,1) @ Initialise F0 et F1 respectivement (0,0)=0 et (1,1)
DO DUP2 OVER RE 1 - - + @ Calcul F(k)=F(k-1)+F(k-2) et rempli la pile avec les (k,Fk)
UNTIL n OVER IM ≤ END @ Boucle tant que n≤Fk
WHILE DUP RE @ Tant que k>0
REPEAT IF n S →NUM - OVER IM < @ Si le reste est plus petit que Fk
THEN DROP 0 @ Retire (k,Fk) de la pile et retenue binaire nulle
ELSE C→R F ROT + 'F' STO @ sinon Store nouvelle liste des indices
S a + DUP SIZE ROT EXSUB 'S' STO 1 END @ Store nouvelle somme algébrique et retenue binaire unaire
b SL + 'b' STO END END @ Store nouvelle valeur binaire 'b'
DROP n S F b 20 MENU » » @ Affiche les quatre résultats et rétracte la barre de menu
Code : Tout sélectionner
4: 100
3: '89+8+3'
2: { 11 6 4 }
1: # 10000101000b
Code : Tout sélectionner
4: 221111
3: '196418+17711+6765+144+55+13+5'
2: { 27 22 20 12 10 7 5 }
1: # 100001010000000101001010000b
Code : Tout sélectionner
4: 123456789
3: '102334155+14930352+5702887+317811+121393+46368+2584+987+233+13+5+1'
2: { 40 36 34 28 26 24 18 16 13 7 5 2 }
1: # 1000101000001010100000101001000001010010b
Evidemment, le code pourrait être plus court... Je laisse à chaque Capitaine d'Unité le soin d'optimiser le code de ses dotations.