{"id":410,"date":"2022-06-30T09:19:04","date_gmt":"2022-06-30T09:19:04","guid":{"rendered":"https:\/\/solinfo.ro\/blog\/?p=410"},"modified":"2024-05-17T20:31:18","modified_gmt":"2024-05-17T20:31:18","slug":"al-n-lea-termen-din-sirul-lui-fibonacci","status":"publish","type":"post","link":"https:\/\/solinfo.ro\/blog\/al-n-lea-termen-din-sirul-lui-fibonacci\/","title":{"rendered":"Al n-lea termen din \u0219irul lui Fibonacci \u00een timp logaritmic"},"content":{"rendered":"\n<p>Un termen din \u0219irul lui Fibonacci se formeaz\u0103 din suma ultimilor doi dinaintea lui, iar primii doi termeni \u00eei consider\u0103m 1. \u0218irul lui Fibonacci arat\u0103 a\u0219a: 1 1 2 3 5 8 13 &#8230;<\/p>\n\n\n\n<p>\u00cen acest articol v\u0103 voi prezenta 4 modalit\u0103\u021bi de a afla al n-lea termen din \u0219irul lui Fibonacci, de la cea mai ineficient\u0103 la cea mai eficient\u0103. \u00cen continuare, vom nota al n-lea termen din \u0219irul lui Fibonacci cu <strong>F(n)<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#sol1\">Complexitate O(2<sup>n<\/sup>)<\/a><\/li>\n\n\n\n<li><a href=\"#sol2\">Complexitate O(n) recursiv<\/a><\/li>\n\n\n\n<li><a href=\"#sol3\">Complexitate O(n) nerecursiv<\/a><\/li>\n\n\n\n<li><a href=\"#sol4\">Complexitate O(log<sub>2<\/sub>n)<\/a><\/li>\n<\/ol>\n\n\n\n<p id=\"sol1\"><strong>1. Complexitate O(2<sup>n<\/sup>)<\/strong><\/p>\n\n\n\n<p>\u0218tim c\u0103 F(n) = F(n-1) + F(n-2). S\u0103 facem o func\u021bie recursiv\u0103 care s\u0103 ne calculeze acest rezultat.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int fibo(int n)\n{\n   if (n &lt;= 2)\n      return 1;\n   else\n      return fibo(n-1) + fibo(n-2);\n}<\/pre>\n\n\n\n<p>Dac\u0103 n este mai mic sau egal dec\u00e2t 2, atunci \u0219tim c\u0103 rezultatul este 1 (pentru c\u0103 F(1) = F(2) = 1).<br>Altfel, F(n) se ob\u021bine din F(n-1) + F(n-2).<\/p>\n\n\n\n<p>S\u0103 vedem de ce acest algoritm are complexitatea O(2<sup>n<\/sup>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"588\" height=\"528\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/06\/image.png\" alt=\"\" class=\"wp-image-413\" srcset=\"https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/06\/image.png 588w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/06\/image-300x269.png 300w, https:\/\/solinfo.ro\/blog\/wp-content\/uploads\/2022\/06\/image-500x449.png 500w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/figure>\n\n\n\n<p>Fiecare cercule\u021b al acestui arbore \u00eel vom considera a fi un apel de func\u021bie.<br>Primul apel, F(n), este r\u0103d\u0103cina acestui arbore.<br>F(n) face dou\u0103 apeluri, F(n-1) \u0219i F(n-2), adic\u0103 cele de pe nivelul al doilea din acest arbore.<br>F(n-1) \u0219i F(n-2) fac fiecare c\u00e2te dou\u0103 apeluri de func\u021bie, deci se vor forma 4 \u00een total (nivelul 3).<br>Din 4 apeluri, se mai fac alte 8 apeluri (nivelul 4).<br>Astfel, num\u0103rul total de apeluri va fi aproximativ 1 + 2 + 4 + 8 + &#8230; + 2<sup>n-1<\/sup>, care \u00eenseamn\u0103 aproximativ 2<sup>n<\/sup> apeluri. Deci, complexitate de timp O(2<sup>n<\/sup>), iar complexitate de spa\u021biu O(n).<\/p>\n\n\n\n<p id=\"sol2\"><strong>2. Complexitate O(n) recursiv<\/strong><\/p>\n\n\n\n<p>Putem s\u0103 \u00eembun\u0103t\u0103\u021bim algoritmul de mai sus. Observ\u0103m c\u0103 multe apeluri se calculeaz\u0103 de foarte multe ori. De aceea, vom memora rezultatul unui apel cu scopul de a nu mai calcula tot apelul degeaba. Aceast\u0103 solu\u021bie se mai nume\u0219te \u0219i recursivitate cu memoizare.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int f[100];<br><br>int fibo(int n)<br>{<br>   if (n &lt;= 2)<br>      return 1;<br>   else<br>   {<br>      if (f[n] != 0)<br>         return f[n];<br>      else<br>      {<br>         f[n] = fibo(n-1) + fibo(n-2);<br>         return f[n];<br>      }<br>   }<br>}<\/pre>\n\n\n\n<p>La fel ca la prima solu\u021bie, dac\u0103 n este mai mic sau egal dec\u00e2t 2, return\u0103m 1.<br>Altfel, verific\u0103m dac\u0103 nu cumva am calculat deja F(n); dac\u0103 f[n] este diferit de 0, \u00eenseamn\u0103 c\u0103 l-am calculat deja, \u0219i vom returna direct f[n], f\u0103r\u0103 a mai face alte apeluri inutile.<br>Altfel (dac\u0103 f[n] este egal cu 0), \u00eenseamn\u0103 c\u0103 nu l-am calculat pe F(n), deci vom face cele dou\u0103 apeluri F(n-1) \u0219i F(n-2), \u0219i vom \u00eensuma rezultatele \u00een f[n], pentru a \u00eel memora pentru alte apeluri.<\/p>\n\n\n\n<p id=\"sol3\"><strong>3. Complexitate O(n) nerecursiv<\/strong><\/p>\n\n\n\n<p>Aceast\u0103 solu\u021bie presupune folosirea program\u0103rii dinamice. Codul este foarte simplu de \u00een\u021beles, nu are rost s\u0103 \u00eel explic.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int f[100];<br><br>int fibo(int n)<br>{<br>   f[1] = f[2] = 1;<br>   for (int i = 3; i &lt;= n; ++i)<br>      f[i] = f[i-1] + f[i-2];<br><br>   return f[n];<br>}<\/pre>\n\n\n\n<p>\u00cen general, ne mul\u021bumim cu aceast\u0103 complexitate. Codul este foarte u\u0219or de scris \u0219i simplu de \u00een\u021beles pentru oricine.<\/p>\n\n\n\n<p id=\"sol4\"><strong>4. Complexitate O(log<sub>2<\/sub>n)<\/strong><\/p>\n\n\n\n<p>Pentru a \u00een\u021belege aceast\u0103 solu\u021bie, trebuie s\u0103 \u0219tim ce sunt matricele. Nu matricele din informatic\u0103, ci cele din matematic\u0103.<\/p>\n\n\n\n<p>Din ce am \u00een\u021beles eu, matricele sunt ni\u0219te chestii inventate doar pentru a u\u0219ura calculele.<br>Exist\u0103 reguli diferite pentru adunarea, sc\u0103derea, \u00eenmul\u021birea \u0219i \u00eemp\u0103r\u021birea matricilor, \u00eens\u0103 pe noi ne va interesa doar \u00eenmul\u021birea matricilor.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><em>\u00cenmul\u021birea matricelor 2&#215;2 cu 2&#215;2<\/em><\/span><\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-8665251761dad3384ad2d9d34ce44a0c_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#32;&#38;&#32;&#50;&#32;&#92;&#92;&#32; &#51;&#32;&#38;&#32;&#52;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#53;&#32;&#38;&#32;&#54;&#32;&#92;&#92;&#32; &#55;&#32;&#38;&#32;&#56; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#53;&#32;&#43;&#32;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#55;&#32;&#38;&#32;&#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#54;&#43;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#56;&#32;&#92;&#92;&#32; &#51;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#53;&#32;&#43;&#32;&#52;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#55;&#32;&#38;&#32;&#51;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#54;&#43;&#52;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#56; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"42\" width=\"378\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><em>\u00cenmul\u021birea matricelor 2&#215;2 cu 2&#215;1<\/em><\/span><\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-7c83d4e0b477a4a2ead34d914f250cb0_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#32;&#38;&#32;&#50;&#32;&#92;&#92;&#32; &#51;&#32;&#38;&#32;&#52;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#53;&#32;&#32;&#92;&#92;&#32; &#54; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61;&#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#53;&#32;&#43;&#32;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#54;&#32;&#32;&#92;&#92;&#32; &#51;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#53;&#32;&#43;&#32;&#52;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#54;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"42\" width=\"236\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>\u0218tiind regulile de mai sus, putem s\u0103 cre\u0103m urm\u0103toarea ecua\u021bie:<\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-58f8f88defb8fe16c65371eb08e215b6_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#51;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#50;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#50;&#41;&#32;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#49;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#108;&#101;&#102;&#116;&#32;&#40;&#32;&#49;&#32;&#92;&#114;&#105;&#103;&#104;&#116;&#32;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"42\" width=\"229\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>Pentru a demonstra c\u0103 ecua\u021bia de mai sus este adev\u0103rat\u0103, aceasta se traduce \u00een:<\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-c054c9184398c8e09ed92af786c1e13d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#51;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#50;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#70;&#40;&#50;&#41;&#43;&#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#70;&#40;&#49;&#41;&#32;&#32;&#92;&#92;&#32; &#49;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#70;&#40;&#50;&#41;&#43;&#48;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#70;&#40;&#49;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"42\" width=\"245\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>S\u0103 form\u0103m \u0219i ecua\u021bia pentru matricea format\u0103 din F(4) cu F(3):<\/p>\n\n\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-c6e951533077db7da47453be622ca74d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#52;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#51;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#51;&#41;&#32;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#50;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#92;&#108;&#101;&#102;&#116;&#32;&#40;&#50;&#32;&#92;&#114;&#105;&#103;&#104;&#116;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"42\" width=\"229\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>\u00cenlocuind ecua\u021bia (1) \u00een ecua\u021bia (2), ob\u021binem:<\/p>\n\n\n<p> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-b54271107bb0d2f89cd0a6f77d92b8af_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#52;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#51;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#32;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#50;&#41;&#32;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#49;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#32;&#61;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#94;&#123;&#50;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#50;&#41;&#32;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#49;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"46\" width=\"435\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>La cazul general:<\/p>\n\n\n<p> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-59f34e520cf5583b733e3928d18276d6_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#110;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#110;&#45;&#49;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#94;&#123;&#110;&#45;&#50;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#50;&#41;&#32;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#49;&#41; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"46\" width=\"259\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>O form\u0103 pu\u021bin mai simplificat\u0103 este:<\/p>\n\n\n<p> <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/solinfo.ro\/blog\/wp-content\/ql-cache\/quicklatex.com-f17821764fff1091e2b181632735a020_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#70;&#40;&#110;&#41;&#32;&#32;&#92;&#92;&#32; &#70;&#40;&#110;&#45;&#49;&#41;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#61;&#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#38;&#49;&#32;&#32;&#92;&#92;&#32; &#49;&#38;&#48;&#32;&#32; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;&#94;&#123;&#110;&#45;&#50;&#125;&#92;&#116;&#105;&#109;&#101;&#115; &#92;&#98;&#101;&#103;&#105;&#110;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125; &#49;&#32;&#32;&#32;&#92;&#92;&#32; &#49; &#92;&#101;&#110;&#100;&#123;&#98;&#109;&#97;&#116;&#114;&#105;&#120;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"46\" width=\"231\" style=\"vertical-align: -16px;\"\/><\/p>\n\n\n\n<p>Singura problem\u0103 mai dificil\u0103 r\u0103mas\u0103 este ridicarea la putere a unei matrice. Pentru a ob\u021bine complexitatea O(log<sub>2<\/sub>n), vom folosi exponen\u021bierea rapid\u0103. Dup\u0103, ne mai r\u0103m\u00e2ne s\u0103 \u00eenmul\u021bim rezultatul cu \u00eenc\u0103 o matrice. Acesta este codul:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">struct mat2x2 {\n   int v00, v01, v10, v11;\n};\n\nstruct mat2x1 {\n   int v00, v10;\n};\n\n\nmat2x2 multipl(mat2x2 a, mat2x2 b)\n{\n   mat2x2 c;\n   c.v00 = a.v00 * b.v00 + a.v01 * b.v10;\n   c.v01 = a.v00 * b.v01 + a.v01 * b.v11;\n   c.v10 = a.v10 * b.v00 + a.v11 * b.v10;\n   c.v11 = a.v10 * b.v01 + a.v11 * b.v11;\n\n   return c;\n}\n\n\nmat2x1 multipl(mat2x2 a, mat2x1 b)\n{\n   mat2x1 c;\n   c.v00 = a.v00 * b.v00 + a.v01 * b.v10;\n   c.v10 = a.v10 * b.v00 + a.v11 * b.v10;\n\n   return c;\n}\n\nmat2x2 pow(mat2x2 a, int exp)\n{\n   \/\/ initalizez ans cu a, si scad exp cu 1\n   mat2x2 ans = a;\n   exp--;\n\n   while (exp != 0)\n   {\n      if (exp % 2 == 1)\n      {\n         ans = multipl(ans, a);\n         exp -= 1;\n      }\n      else\n      {\n         a = multipl(a, a);\n         exp \/= 2;\n      }\n   }\n\n   return ans;\n}\n\nint fibo(int n)\n{\n   if (n &lt;= 2)\n      return 1; \/\/ nu ridicam matricea la puterea 0 sau -1\n\n   mat2x2 def1 = {1, 1, 1, 0};\n   mat2x1 def2 = {1, 1};\n   mat2x1 c = multipl(pow(def1, n-2), def2);\n\n   return c.v00; \/\/ c.v00 e F(n), c.v10 e F(n-1)\n}<\/pre>\n\n\n\n<p>Av\u00e2nd \u00een vedere c\u0103 termenul al 46-lea este cel mai mare termen care poate fi calculat \u00een tipul int (la toate cele 4 solu\u021bii prezentate), aceste solu\u021bii pot fi extinse pe numere mai mari folosind aritmetica modular\u0103.<\/p>\n\n\n\n<p>\u00cei mul\u021bumesc <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=EEb6JP3NXBI\" data-type=\"URL\" data-id=\"https:\/\/www.youtube.com\/watch?v=EEb6JP3NXBI\" target=\"_blank\">indianului de pe YouTube<\/a> \u0219i <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pbinfo.ro\/articole\/19411\/matrice-fibonacci\" data-type=\"URL\" data-id=\"https:\/\/www.pbinfo.ro\/articole\/19411\/matrice-fibonacci\" target=\"_blank\">pbInfo-ului<\/a> pentru c\u0103 m-au \u00eenv\u0103\u021bat lucrurile pe care vi le-am prezentat.<\/p>\n\n\n\n<p>V\u0103 propun urm\u0103toarele probleme de rezolvat: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pbinfo.ro\/probleme\/3344\/fibonacci2\" target=\"_blank\">Fibonacci2<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pbinfo.ro\/probleme\/4028\/numardesubmultimi1\" target=\"_blank\">NumarDeSubmultimi1<\/a>, <a href=\"https:\/\/infoarena.ro\/problema\/kfib\">kfib<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un termen din \u0219irul lui Fibonacci se formeaz\u0103 din suma ultimilor doi dinaintea lui, iar primii doi termeni \u00eei consider\u0103m &hellip; <\/p>\n","protected":false},"author":4,"featured_media":446,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[48,47,51,50],"class_list":["post-410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fibonacci","tag-exponentiere-rapida","tag-fibonacci","tag-programare-dinamica","tag-recursivitate"],"_links":{"self":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/comments?post=410"}],"version-history":[{"count":37,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/410\/revisions"}],"predecessor-version":[{"id":529,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/posts\/410\/revisions\/529"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media\/446"}],"wp:attachment":[{"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/media?parent=410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/categories?post=410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solinfo.ro\/blog\/wp-json\/wp\/v2\/tags?post=410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}