Another update from ingydotnet^djgoku
This commit is contained in:
parent
91df62d461
commit
948b86eafa
7604 changed files with 108452 additions and 22726 deletions
|
|
@ -1,37 +1,36 @@
|
|||
function fib(n:Int64):int64;
|
||||
function fib(n: Int64): Int64;
|
||||
|
||||
type TFibMat = array[0..1] of array[0..1] of 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;
|
||||
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;
|
||||
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];
|
||||
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