Data update
This commit is contained in:
parent
81fd053722
commit
52a6ef48dd
10248 changed files with 63654 additions and 6775 deletions
36
Task/Fibonacci-sequence/Delphi/fibonacci-sequence-3.pas
Normal file
36
Task/Fibonacci-sequence/Delphi/fibonacci-sequence-3.pas
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
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;
|
||||
Loading…
Add table
Add a link
Reference in a new issue