Xerxes a écrit : ↑25 mai 2017 20:07
[...]Dear C.Ret, I'm really sorry, but apparently there is still a bug in your formula, if I made no mistake while porting it.
Please check f^-123(12345)=2536, what should be 2474.
You don't have to be sorry, I currently made a lot of mistaken, typo, inversion, and so on...
I just check your example and I get the correct answer with the last code on my SPARP PC-1211
Code : Tout sélectionner
keystrokes Display Comment
[MODE] > Set to the DEF mode
[shft][ F ] ? Input N
12345[ENTER] ? Input k
-123[ENTER] 2474.=^-123.12345. Correct result displayed
Tracing into the computation:
1:
INPUT N N = 12345 User entry
,K K = -123 User entry
:
R=INT (.5+√N, R = 111 Round of √12345 ~ 111.1080555
E=INT .5K, E = -62 INT return integer immediately less or equal to argument
-123/2 is -61.5 so INT returns -62 here
F=E-(RR>=N)+(K>2E F=-62-0+1 (RR>N) is false (returns 0) while R²=12321 which is < 12345
(K>2E) is in fact K MOD 2 = 1 here -123 > -124
F=-61
:
PRINT N+KR+EF; 2474. = 12345 - 123*111 + 61*62
"=^"; =^
K; -123.
N 12345.
:
END
Here is the corresponding code for HP-41C of the same algorithm:
Code : Tout sélectionner
Pc T: Z: Y: X: L:
001 LBL "79MPO n k
002 FIX 0
003 RCL X n k k
004 RCl Z n k k n
005 SQRT n k k √n n
006 RND n k k R √n
007 ST* Y n k k.R R
008 X^2 n k k.R R² R
009 R^ k k.R R² n
010 ST+ Z k n+k.R R² n
011 x>y? k n+k.R R² n
012 CLx k n+k.R R² 0 vn
013 x<>y k n+k.R 0 R²
014 / k k n+k.R i.iiii
015 INT k k n+k.R i i.iiii
016 CHS k k n+k.R -i i
017 R^ k n+k.R -i k
018 2 n+k.R -i k 2
019 / n+k.R -i k/2 2
020 RCL X n+k.R -i k/2 k/2
021 INT n+k.R -i k/2 e k/2
022 x>y? n+k.R -i k/2 e
023 DSE X n+k.R -i k/2 E
024 NOP n+k.R -i k/2 E
025 ST* Z n+k.R -i.E k/2 E
026 x#y? n+k.R -i.E k/2 E
027 ST+ Z n+k.R E-iE k/2 E
028 x<>y n+k.R mE-iE E k/2
029 RDN n+k.R mE-iE E
030 x^2 n+k.R mE-iE E² E
031 + n+k.R mE-iE+E² E²
032 + n+k.R+EF E.(E-i+m)
033 END f^k(n)
Or printed in short:
Code : Tout sélectionner
01 LBL "79MPO
02 FIX 0 RCL X RCl Z SQRT RND ST* Y X^2 R^ ST+ Z x>y? CLx
13 x<>y / INT CHS R^ 2 / RCL X INT x>y? DSE X NOP
25 ST* Z x#y? ST+ Z
28 x<>y RDN x^2 + +
33 END
Le NOP de l'instruction 024 indique une instruction quelconque qui n'a pas d'effet sur la pile et le déroulement du programme (par exemple LBL 00).
C'est dû au DSE précèdent qui dans certains cas va "sauter" le ST* Z très important pour annuler le produit E*F
Le DSE est nécessaire car, contrairement au SHARP PC1211, l'instruction INT sur HP-41 renvoi le mauvais entier en cas d'argument négatif (i.e. -61 pour -61.5 ). Les autres tests permettent de calculer i et m
L'usage de la pile est alambiqué afin de ne pas utiliser d'autre registre mémoire que l pile et de drapeaux.
L'explication de la formule f^k(n) = n + k.R + E.F provient de l'observation des valeurs successives de f^k(n) pour n et k:
f^k(n) en fonction de n et k:
Code : Tout sélectionner
n\k 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
1 : 2 3 5 7 10 13 17 21 26 31 37 43 50 57 65 73
2 : 3 5 7 10 13 17 21 26 31 37 43 50 57 65 73 82
3 : 5 7 10 13 17 21 26 31 37 43 50 57 65 73 82 91
4 : 6 8 11 14 18 22 27 32 38 44 51 58 66 74 83 92
5 : 7 10 13 17 21 26 31 37 43 50 57 65 73 82 91 101
6 : 8 11 14 18 22 27 32 38 44 51 58 66 74 83 92 102
7 : 10 13 17 21 26 31 37 43 50 57 65 73 82 91 101 111
8 : 11 14 18 22 27 32 38 44 51 58 66 74 83 92 102 112
9 : 12 15 19 23 28 33 39 45 52 59 67 75 84 93 103 113
10: 13 17 21 26 31 37 43 50 57 65 73 82 91 101 111 122
11: 14 18 22 27 32 38 44 51 58 66 74 83 92 102 112 123
12: 15 19 23 28 33 39 45 52 59 67 75 84 93 103 113 124
Les choses sont fort régulières, et comme l'explique
Xerxes, il y a un décalage (offset) systématique qui dépend :
de la parité de k (pris en compte par m) et du changement de l'arrondi de √n (pris en compte par i.
Les offsets observés proviennent tous du même fait, le carré
n² est distant du carré précédant
(n-1)² d'exactement
(2n-1) valeurs entières.
Code : Tout sélectionner
1 2 3
4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
64 ...