( calc_det3)
( 8th April 2016)

( Calculating a determinant by simplifying)
4 FLD !

0 VARIABLE a{n,m}      ( array element)
0 VARIABLE n           ( row number)
3 CONSTANT #rows    3 CONSTANT #columns


( example of array for order 3 - 3 rows and 3 columns)
#rows #columns ARRAY[] det3

: zero_det3 #rows 0 DO  #columns 0 DO   0 J I det3 !   LOOP  LOOP ;

: dsp_det3 #rows 0 DO CR #columns  0 DO  J I det3 @ F. SPACE LOOP  LOOP ;

: load_det3 ( a0,a1,a2,a3...)
   0 #rows 1- DO DUP >R I  det3    ( a0,a1,a2,a3...)
          !  R>                    ( a0,a1,a2,row...)
       -1 +LOOP DROP ;

( values to be floating point)
zero_det3
14 FINT  2 FINT   3 FINT   0  load_det3
 9 FINT  5 FINT  -1 FINT   1  load_det3
 7 FINT  8 FINT  -4 FINT   2  load_det3

( make column zero be zero apart from a{0,0})
( a{2,n}=a{2,n} - a{1,n}*a{2,0}/a{1,0} - for bottom row - #2) 
: nrow_mod  ( row number...) n !   ( save row number)
   n @    0 det3 @    ( a{2,0}...)
   n @ 1- 0 det3 @    ( a{2,0},a{1,0}...)
   F/                 ( ratio...)
   #columns 0 DO DUP
               n @ 1- I  det3 @    ( ratio,ratio,a{1,n}...) 
               F*  FMNF            ( ratio,-a{1,n}*a{2,0}/a{1,0}...)
               n @    I  det3      ( ratio,-a{1,n}*a{2,0}/a{1,0},addr...)
               F+!                 ( ratio,a{2,n} - a{1,n}*a{2,0}/a{1,0}...)
              LOOP DROP ;

: all_rows
   1 #rows 1- DO I nrow_mod -1 +LOOP ;

: calc3x3
   all_rows
   1 1 det3 @
   2 2 det3 @  F*
   1 2 det3 @
   2 1 det3 @  F*  F-
   0 0 det3 @  F* 
   ." Determinant value= " F. CR ;

CR ." Determinant:"
dsp_det3 CR
calc3x3 CR



  
