Lucas number
The Lucas series is the sequence of numbers:
2, 1, 3, 4, 7, 11, 18, 29, 47, ???The idea is, that the next number is produced by summing the two preceding ones.
generation
recursive implementation
type
/// domain for Lucas number function
/// where result fits within a nativeUInt
// You can not name it lucasDomain,
// since the Lucas number function itself
// is defined for all whole numbers
// but the result beyond L(n) exceeds high(nativeUInt).
lucasLeftInverseRange =
{$ifdef CPU64} 0..92 {$else} 0..46 {$endif};
{**
calculates Lucas number recursively
\param n the index of the Lucas number to calculate
\return the Lucas number at n,
unless n is out of range, then 0
}
function lucas(const n: lucasLeftInverseRange): nativeUInt;
begin
case n of
// recursive case
2..high(n):
begin
lucas := lucas(n - 2) + lucas(n - 1);
end;
// base cases
1:
begin
lucas := 1;
end;
0:
begin
lucas := 2;
end;
// abort case
otherwise
begin
// neutral element of addition
// indicating n is out of range
// [there is no n satisfying L(n) = 0]
lucas := 0;
end;
end;
end;based on Fibonacci sequence
The Lucas numbers can be calculated by using the fibonacci function shown in the article Fibonacci number.
{**
calculates Lucas number based on Fibonacci numbers
\param n the index of the Lucas number to calculate
\return the Lucas number at n,
unless n is out of range, then 0
}
function lucas(const n: lucasLeftInverseRange): nativeUInt;
begin
case n of
1..high(n):
begin
lucas := fibonacci(n - 1) + fibonacci(n + 1);
end;
0:
begin
// We can not deduce L(0) from Fibonacci
// since that function is not defined for negative n
// [we would call fibonacci(-1) + fibonacci(1)].
lucas := 2;
end;
otherwise
begin
// neutral element of addition
// indicating n is out of range
// [there is no n satisfying L(n) = 0]
lucas := 0;
end;
end;
end;iterative implementation
This is in line with the iterative implementation of fibonacci but with differing start values. Therefore the code is not repeated here.
lookup
Calculating Lucas numbers every time they are needed is time-consuming. While the code required for generation takes almost no space, a lookup table is the means of choice when an application needs them a lot. Since Lucas numbers can be derived from Fibonacci numbers, usually only one table (those with the Fibonacci series) is stored, being a compromise between efficiency and memory utilization. In order to use the fibonacci table without margin case treatment, it has to be at least expanded to fibonacci[-1].
An actual implementation is omitted here, since everyone wants it differently. Also, do not program, what's already been programmed. For instance, the Lucas number functions of the GNU multiple precision arithmetic library take this approach.
see also
- Lucas numbers in “the on-line encyclopedia of integer sequences”
- Lucas sequence § “Pascal” on RosettaCode.org
- GNU multiple precision arithmetic library's functions
mpz_lucnum_uiandmpz_lucnum2_ui
From the Free Pascal wiki, page "Lucas number", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Edited on wiki.freepascal.org by 5 people, 2014–2022
From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.
| When | Who | What changed |
|---|---|---|
| Djzepi | Created page | |
| BigChimp | Recursive way: indentation | |
| E-ric | (minor) | |
| Kai Burghardt | review | |
| Kai Burghardt | based on Fibonacci sequence: remove spelling mistake (minor) | |
| Kai Burghardt | m | |
| Kai Burghardt | generation: grammar | |
| Kai Burghardt | lookup: grammar | |
| Kai Burghardt | based on Fibonacci sequence: review implementation | |
| Kai Burghardt | recursive implementation: review implementation | |
| Kai Burghardt | based on Fibonacci sequence: more comments | |
| Kai Burghardt | generation: remove obsolete statement | |
| Kai Burghardt | recursive implementation: typo (minor) | |
| Bart | recursive implementation | |
| Bart | Reverted edits by Bart (talk) to last revision by Kai Burghardt (minor) | |
| Kai Burghardt | resolve Category: Pages using deprecated enclose attributes (minor) |
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
