(50g) Root with Euklidian Algorithm
04-22-2014, 09:09 AM (This post was last modified: 05-03-2015 08:05 PM by peacecalc.)
Post: #1
 peacecalc Member Posts: 149 Joined: Dec 2013
(50g) Root with Euklidian Algorithm
Hello friends,

for educational purpose I used the hp 50g to approximate a root with a continued fraction.

The main task of such a program is 1) to calculate integer part of the root,
2) the reciprocal of the non-integer part
3) find out the integer part of the expression in 2)

2) and 3) is repeated as long as you whish.

anrat: splits every fraction in three parts: integer part, enumarator and denominator.
anirr: with the help of "anrat" this program calculates one step 2) and 3)
rooeu: the main program acts with "anirr", it calculates 1) and the repeated times of 2) and 3), last task is to display the continued fraction in the depth you wished, display the reduced fraction and the numerical value of the continued fraction.

Enjoy!

anrat:

Input: fraction or integer

Output: integer (level 3)
denumerator (level 2)
denominator (level 1)

Code:

%%HP: T(3)A(R)F(,);
\<< DUP
IF   TYPE 9, ==                 @@it's a fraction?
THEN
DUP
IF   1 >                   @@when yes, it a improper fraction
THEN
PROPFRAC OBJ\-> DROP2 @@when yes, then change fraction in integer (level 2)
@@and rest fraction (level 1)
ELSE
0 SWAP                @@when no improper fraction, set integer to zero
END

OBJ\-> DROP2               @@split fraction into enumerator and denominator
ELSE
0 0                        @@if no fraction: level 1 and 2 is set to zero
END
\>>

anirr:

Input: root which has to be estimated (level 3)
integer part of the root (level 2)
the reciprocal value of (level 1)
irrational rest of the root
smaller 1

Output: root which has to be estimated (level 4)
integer part of the root (level 3)
the new reciprocal value of (level 2)
irrational rest of the root,
smaller 1
integer for continued fraction (level 1)

Code:

%%HP: T(3)A(R)F(,);
\<< 0 DUPDUP \-> VAL GVAL RVAL G R N
\<< RVAL FDISTRIB OBJ\-> DROP2 SWAP @@split reciprocal in an irrational and a rational part
@@swap is necessary because the rational part is on level 2
ANRAT DUP                       @@duplicate the last output from anrat
@@the denominator of the fraction
IF    0 \=/
THEN
/ 'R' STO                  @@that builds the fraction together
@but only the proper part of it
ELSE
DROP2                      @@clean up the stack, if there is only
END                             @@an integer

'G' STO                         @@Store the integer part for the continued fraction
VAL SWAP / EVAL                 @@Divide the search root value with the irrational part
'N' STO GVAL N /                @@that is necessary because hp 50g reduce fractions
@@automatically, with this denominator the integer part
@@of the root is divided
ANRAT DUP                       @@this fraction is analysed in respect
@@to its integer part

IF    0 \=/
THEN
/ 'R' STO+                @@add the proper fraction to the former fraction rest
ELSE
DROP2                      @@clean up the stack, if there is only
END                             @@an integer

'G' STO+                        @@add the integer part for the continued fraction
R EVAL                          @@New remainder is analysized for integer part
ANRAT DUP

IF   0 \=/
THEN
/                          @@if new remainder is a proper fraction then take it
@@as a new rational rest for the next stage calculating
@@the reciprocal remainder of the searched root
ELSE
DROP2 0              @@if there are three zeros add zero it to the integer part for
@@the continued fraction (it is not necessary)
END

'R' STO
'G' STO+
VAL GVAL DUP2 - N / R + INV     @@Calculate the newreciprocal value of
EVAL                            @@irrational rest of the root, smaller 1
G
\>>
\>>

rooeu:

Input: root to estimate (level 2)
depth of continued fraction (level 1)

Output: numerical value of continued fraction (level 1)

Code:

%%HP: T(3)A(R)F(,);
\<< \-> V ANZ
\<< V \->NUM IP \->Q DUP 1, \->LIST \-> GZ ELST @@Calculate and
@@load first integer value into result list
\<< V GZ DUP2 - INV EVAL                      @@calculate first reciprocal value
@@of the non integer remainder of root
1, ANZ                                    @@loop for calculating the integers for the
START                                     @@integers used in the continued fraction
ANIRR 'ELST' STO+
NEXT

3, DROPN                                  @@clean up the stack levels
0                                         @@first value in continued fraction
1, ANZ                                    @@loop for building up the
START                                     @@the continued fraction
ELST HEAD + INV               @@generate next level of fraction
ELST TAIL                            @@reduce list with numbers and store it
'ELST' STO
NEXT

HALT                                      @@display continued fraction
EVAL
HALT                                      @@display reduced fraction
\->NUM                                    @@display numerical value
\>>
\>>
\>>

and some display screen shots:

pic1: in- (level 4) and output from anrat
pic2, 3 in- and output from anirr (here root from 52)
pic4 input for rooeu (here root from 52 and iteration depth 6)
pic5 first output: continued fraction
pic6: second output reduced fraction
pic7: numerical value

04-22-2014, 09:10 AM (This post was last modified: 04-22-2014 12:03 PM by peacecalc.)
Post: #2
 peacecalc Member Posts: 149 Joined: Dec 2013
RE: HP 50g Root with Euklidian Algorithm
.last three pics.