* fibref.htm
*$MST_FROM_ENTRY;
* Calculation of sequence Fibonacci by a matrix way
*
* if F(k+2) = F(k+1) + F(k),
* then for vectors
*
* ( F(k+1) , F(k+2) ) = ( F(k) , F(k+1) ) * A
*
* where a matrix A =
* ( 0 1 )
* ( 1 1 )
*
* The function Fibonacci calculates the next element of sequence
$ENTRY Fibonacci {
e.begin (e.k) (e.k1) = e.begin (e.k)
<MulVM ((e.k) (e.k1)) (<MatrixA >)>;
}
* Definition of a matrix A
MatrixA {
= ( (0) (1) )
( (1) (1) );
}
* Multiplication of a vector to a matrix
MulVM {
(e.vector) ( ) = ;
(e.vector) (e.matrix) = <MulVV (e.vector) (<Mfirst e.matrix>)>
<MulVM (e.vector) (<Mlast e.matrix>)>;
}
Mfirst {
= ;
((e.1) e.2) e.3 = (e.1) <Mfirst e.3>;
}
Mlast {
= ;
((e.1) ) e.3 = <Mlast e.3>;
((e.1) e.2) e.3 = (e.2) <Mlast e.3>;
}
* Multiplication of a vector to a vector (or scalar product)
MulVV {
(e.v1) (e.v2) = <MulVV1 (0) (e.v1) (e.v2)>;
}
MulVV1 {
(e.rez) ( ) ( ) = (e.rez);
(e.rez) ((e.1) e.2) ((e.3) e.4) = <MulVV1
(<Add (e.rez) <Mul (e.1) e.3>>)
(e.2) (e.4)>;
}
/*
Result of supercompilation
$ENTRY Fibonacci {
e.41 (e.102 ) (e.101 )
, <Add (e.102 ) e.101 >:e.122
= e.41 (e.102 ) (e.101 ) (e.122 ) ;
}
After elementary transformation
$ENTRY Fibonacci {
e.41 (e.102) (e.101) = e.41 (e.102) (e.101) (<Add (e.102) e.101>) ;
}
*/