RosettaCodeData/Task/Fibonacci-sequence/Delphi/fibonacci-sequence-3.delphi

38 lines
726 B
Plaintext

function fib(n:Int64):int64;
type TFibMat = array[0..1] of array[0..1] of int64;
function FibMatMul(a,b:TFibMat):TFibMat;
var i,j,k:integer;
tmp:TFibMat;
begin
for i:=0 to 1 do
for j:=0 to 1 do
begin
tmp[i,j]:=0;
for k:=0 to 1 do tmp[i,j]:=tmp[i,j]+a[i,k]*b[k,j];
end;
FibMatMul:=tmp;
end;
function FibMatExp(a:TFibMat;n:int64):TFibmat;
begin
if n<=1 then fibmatexp:=a else
if (n mod 2 = 0) then FibMatExp:=FibMatExp(FibMatMul(a,a), n div 2) else
if (n mod 2 = 1) then FibMatExp:=FibMatMul(a,FibMatExp(FibMatMul(a,a),(n) div 2));
end;
var
matrix:TFibMat;
begin
matrix[0,0]:=1;
matrix[0,1]:=1;
matrix[1,0]:=1;
matrix[1,1]:=0;
if n>1 then
matrix:=fibmatexp(matrix,n-1);
fib:=matrix[0,0];
end;