Difference between revisions of "Lucas number/fi"
(Created page with "{{Lucas_number}} Lucasin luvut on numerosarja: <syntaxhighlight lang="pascal"> 2, 1, 3, 4, 7, 11, 18, 29, 47, … </syntaxhighlight> Ajatuksena on lisätä kaksi viimeistä n...") |
|||
Line 58: | Line 58: | ||
=== Hyödyntäen Fibonacin sarjaa === | === Hyödyntäen Fibonacin sarjaa === | ||
− | Lucas-numerot voidaan laskea käyttämällä <syntaxhighlight lang="pascal" | + | Lucas-numerot voidaan laskea käyttämällä <syntaxhighlight lang="pascal" inline>fibonacci</syntaxhighlight> [[Function/fi|funktiota]] joka oli esillä [[Fibonacci number/fi|Fibonacin luvuissa]]. |
<syntaxhighlight lang="pascal" line start="54"> | <syntaxhighlight lang="pascal" line start="54"> | ||
{** | {** | ||
Line 105: | Line 105: | ||
* [https://oeis.org/A000032 Lucas numbers in “the on-line encyclopedia of integer sequences”] | * [https://oeis.org/A000032 Lucas numbers in “the on-line encyclopedia of integer sequences”] | ||
* [https://rosettacode.org/wiki/Lucas_sequence#Pascal Lucas sequence § “Pascal” on RosettaCode.org] | * [https://rosettacode.org/wiki/Lucas_sequence#Pascal Lucas sequence § “Pascal” on RosettaCode.org] | ||
− | * [[gmp|GNU multiple precision arithmetic library]]'s functions [https://gmplib.org/manual/Lucas-Numbers-Algorithm.html#Lucas-Numbers-Algorithm <syntaxhighlight lang="c" | + | * [[gmp|GNU multiple precision arithmetic library]]'s functions [https://gmplib.org/manual/Lucas-Numbers-Algorithm.html#Lucas-Numbers-Algorithm <syntaxhighlight lang="c" inline>mpz_lucnum_ui</syntaxhighlight> and <syntaxhighlight lang="c" inline>mpz_lucnum2_ui</syntaxhighlight>] |
Latest revision as of 17:23, 6 August 2022
│
English (en) │
suomi (fi) │
français (fr) │
Lucasin luvut on numerosarja:
2, 1, 3, 4, 7, 11, 18, 29, 47, …
Ajatuksena on lisätä kaksi viimeistä numeroa yhteen, jolloin saadaan seuraava arvo.
Luonti
Rekursiivinen toteutus
3type
4 /// domain for Lucas number function
5 /// where result fits within a nativeUInt
6 // You can not name it lucasDomain,
7 // since the Lucas number function itself
8 // is defined for all whole numbers
9 // but the result beyond L(n) exceeds high(nativeUInt).
10 lucasLeftInverseRange =
11 {$ifdef CPU64} 0..92 {$else} 0..46 {$endif};
12
13{**
14 calculates Lucas number recursively
15
16 \param n the index of the Lucas number to calculate
17 \return the Lucas number at n,
18 unless n is out of range, then 0
19}
20function lucas(const n: lucasLeftInverseRange): nativeUInt;
21begin
22 case n of
23 // recursive case
24 2..high(n):
25 begin
26 lucas := lucas(n - 2) + lucas(n - 1);
27 end;
28 // base cases
29 1:
30 begin
31 lucas := 1;
32 end;
33 0:
34 begin
35 lucas := 2;
36 end;
37 // abort case
38 otherwise
39 begin
40 // neutral element of addition
41 // indicating n is out of range
42 // [there is no n satisfying L(n) = 0]
43 lucas := 0;
44 end;
45 end;
46end;
Hyödyntäen Fibonacin sarjaa
Lucas-numerot voidaan laskea käyttämällä fibonacci
funktiota joka oli esillä Fibonacin luvuissa.
54{**
55 calculates Lucas number based on Fibonacci numbers
56
57 \param n the index of the Lucas number to calculate
58 \return the Lucas number at n,
59 unless n is out of range, then 0
60}
61function lucas(const n: lucasLeftInverseRange): nativeUInt;
62begin
63 case n of
64 1..high(n):
65 begin
66 lucas := fibonacci(n - 1) + fibonacci(n + 1);
67 end;
68 0:
69 begin
70 // We can not deduce L(0) from Fibonacci
71 // since that function is not defined for negative n
72 // [we would call fibonacci(-1) + fibonacci(1)].
73 lucas := 2;
74 end;
75 otherwise
76 begin
77 // neutral element of addition
78 // indicating n is out of range
79 // [there is no n satisfying L(n) = 0]
80 lucas := 0;
81 end;
82 end;
83end;
Iteratiivinen toteutus
Tämä on samanlainen kuin Fibonacin iteratiivisen toteutuksen kanssa, mutta erilaisilla lähtöarvoilla. Siksi koodia ei toisteta tässä.
Huomioita
Lucas-numeroiden laskeminen aina, kun niitä tarvitaan, on aikaa vievä. Vaikka tarvittava koodi ei vie lähes mitään tilaa, hakutaulukko on valintaväline, kun sovellus tarvitsee niitä usein. Koska Lucas-luvut voidaan saada Fibonacci-numeroista, yleensä vain yksi taulukko (Fibonacci-sarja) on kompromissi tehokkuuden ja muistin käytön välillä. Fibonacci-taulukon käyttämiseksi ilman marginaalikäsittelyä se on ainakin laajennettava fibonaksiin [-1]. Esimerkiksi GNU-monitarkkuuden aritmeettisen kirjaston (GNU multiple precision arithmetic library) Lucas-numerotoiminnot käyttävät tätä lähestymistapaa..