Difference between revisions of "Talk:Lucas number"
From Lazarus wiki
Jump to navigationJump to search (Created page with "Q: Why not use UInt64 as return type for the function. It should be the same on all platforms. Remark: it seems a bit strange to me to derive Lucas(n) from Fib(n), because th...") |
|||
Line 2: | Line 2: | ||
Remark: it seems a bit strange to me to derive Lucas(n) from Fib(n), because the Fibonacci sequence is jus a special case of the Lucas numbers (with starting values 1,1). --[[User:Bart|Bart]] ([[User talk:Bart|talk]]) 19:15, 10 November 2018 (CET) | Remark: it seems a bit strange to me to derive Lucas(n) from Fib(n), because the Fibonacci sequence is jus a special case of the Lucas numbers (with starting values 1,1). --[[User:Bart|Bart]] ([[User talk:Bart|talk]]) 19:15, 10 November 2018 (CET) | ||
+ | |||
+ | |||
+ | Here's an example of what I mean: | ||
+ | |||
+ | <syntaxhighlight lang="pascal"> | ||
+ | { | ||
+ | A more general form of the Lucas series, where the 2 starting values | ||
+ | can be set using parameters | ||
+ | } | ||
+ | function LucasGen(L1, L2, N: UInt64): UInt64; | ||
+ | var | ||
+ | i, LucMin1, LucMin2: UInt64; | ||
+ | begin | ||
+ | if (N = 0) then | ||
+ | Raise ERangeError.Create('Lucas function is undefined for 0.'); | ||
+ | if (N = 1) then | ||
+ | Exit(L1) | ||
+ | else if (N = 2) then | ||
+ | Exit(L2) | ||
+ | else | ||
+ | begin | ||
+ | LucMin1 := L2; | ||
+ | LucMin2 := L1; | ||
+ | i := 2; | ||
+ | while (i <> N) do | ||
+ | begin | ||
+ | Inc(i); | ||
+ | Result := LucMin2 + LucMin1; | ||
+ | LucMin2 := LucMin1; | ||
+ | LucMin1 := Result; | ||
+ | end; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | function Lucas(N: UInt64): UInt64; | ||
+ | begin | ||
+ | Result := LucasGen(2,1,N); | ||
+ | end; | ||
+ | |||
+ | |||
+ | function Fib(N: UInt64): UInt64; | ||
+ | begin | ||
+ | Result := LucasGen(1,1,N); | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | --[[User:Bart|Bart]] ([[User talk:Bart|talk]]) 19:25, 10 November 2018 (CET) |
Revision as of 20:25, 10 November 2018
Q: Why not use UInt64 as return type for the function. It should be the same on all platforms.
Remark: it seems a bit strange to me to derive Lucas(n) from Fib(n), because the Fibonacci sequence is jus a special case of the Lucas numbers (with starting values 1,1). --Bart (talk) 19:15, 10 November 2018 (CET)
Here's an example of what I mean:
{
A more general form of the Lucas series, where the 2 starting values
can be set using parameters
}
function LucasGen(L1, L2, N: UInt64): UInt64;
var
i, LucMin1, LucMin2: UInt64;
begin
if (N = 0) then
Raise ERangeError.Create('Lucas function is undefined for 0.');
if (N = 1) then
Exit(L1)
else if (N = 2) then
Exit(L2)
else
begin
LucMin1 := L2;
LucMin2 := L1;
i := 2;
while (i <> N) do
begin
Inc(i);
Result := LucMin2 + LucMin1;
LucMin2 := LucMin1;
LucMin1 := Result;
end;
end;
end;
function Lucas(N: UInt64): UInt64;
begin
Result := LucasGen(2,1,N);
end;
function Fib(N: UInt64): UInt64;
begin
Result := LucasGen(1,1,N);
end;