NUMERI GRANDI DI FIBONACCI come trovare velocemente loro esatt valor numerc Crstano Teodoro crstanoteodoro@vrglo.t Sommaro: n questo artcolo vene proposto, n alternatva al metodo classco per l calcolo de Numer della successone d Fbonacc, un algortmo con l quale, tramte l auslo d un altra mportante successone d numer, quella relatva a Numer d Lucas, è possble calcolare l valore esatto d un numero grande d Fbonacc n un tempo molto pù rapdo. Per numer d Fbonacc molto grand compost da mglaa d cfre l tempo d calcolo rsulta essere almeno d 3 volte pù breve. I numer d Fbonacc sono suffcentemente not per cu qu s accennerà solo alla loro defnzone e s llustrerà un algortmo per l calcolo rapdo del loro esatto valore numerco. Per una descrzone dettaglata rguardante la loro mplcazone n numerose e dverse dscplne nteressant sa l campo della scenza o della tecnca o dell economa come pure l campo dell arte s rmanda alla lettura d numeros e nteressant artcol compars su St Internet. I numer d Fbonacc scaturscono da una successone d numer che obbedscono alle seguent regole: partendo da due numer nzal che ndcheremo con F(0) e F(), rspettvamente d valore 0 e l successvo numero d Fbonacc F() è dato dalla somma d F(0) con F( ), coè F() = F(0)+F( ) = 0 += I successv numer s trovano sommando sempre due precedent numer. Pertanto per ess vale la formula seguente: F() = F( ) + F( ) dove con F() s ndca l numero generco d Fbonacc che nella successone occupa l (+)- esmo posto con denomnato ndce del numero. Pertanto la successone generca d numer d Fbonacc può ndcars come segue: F(0) = 0 F() = F() = F(0) + F() = F(3) = F() + F() = F() = F(3) + F() = 3 F() = F(3) + F() = F(6) = F() + F() = 8.. F()=F( ) + F( ) =?... Ora, volendo conoscere l valore numerco d F(), se non s hanno dsponbl per tal numer altre formule rsulta evdente che per trovarlo occorre conoscere e qund calcolare tutt precedent numer d Fbonacc. Questo metodo d procedere rsulta adeguato solo se l valore dell ndce non è molto grande. Ma se l ndce ha valore grande, ad esempo = 00000 per trovare F() sarebbe necessaro effettuare.un numero d addzon par a e coè centomla d addzon. Realzzando su un Personal Computer n un qualsas lnguaggo evoluto un semplce programma per l calcolo d F(00000) anche mpegando un PC sofstcato l tempo per effettuare 00000 operazon artmetche d addzone non rsulta ndfferente (ved Tabella n fondo all artcolo). Sorge po un altro problema: quanto può essere grande F(00000)? D quante cfre è composto? Per rspondere a questo questo fortunamente la matematca mette a dsposzone la seguente formula per l calcolo del numero d cfre ) ( : F() = + Da tale formula uguaglandola a 0 s può trovare l valore dell esponente da cu s rcava mmedatamente l numero Nc delle cfre component F() come parte ntera d aumentata d s ha pertanto + = 0 da cu = log + log e qund Nc = + Faccamo un esempo propro con =00000: svolgendo calcol relatv con la formula suddetta s trova = 0898. Qund 0899 è l numero effettvo d cfre d cu rsulta composto F(00000). () - per l calcolo del numero d cfre che compongono l numero d Fbonacc è lecto trascurare la parte con segno negatvo della formula d Bnet (ved la formula a pag. seguente)
Ma pur conoscendo l esatto numero d cfre d F(00000) come è possble calcolare l suo valore esatto dato l enorme numero d cfre mplcate? Dobbamo nevtablmente fare rcorso ad operazon artmetche che elaborano numer molto grand per qual non rsulta pù suffcente l artmetca che normalmente vene messa a dsposzone sul PC dal software utlzzato. S presentano pertanto due problem da rsolvere: l prmo è quello d ruscre a manpolare e potere fare calcol artmetc esatt su numer molto grand; l secondo è quello d poter n qualche modo evtare d effettuare un numero grande d operazon artmetche e coè 00000 addzon ad esempo per l calcolo esatto d F(00000) Per evtare d effettuare questo grande numero d addzon s potrebbe pensare d rcorrere alla formula nota n matematca come formula d Bnet [],[], che dà n forma concsa l valore d un qualsas numero d Fbonacc F(): + Sfortunatamente questa formula, nemmeno usando un artmetca a precsone multpla, s presta ad essere utlzzata per l calcolo esatto d F() n quanto, pur prescndendo dal grande numero d elevazone a potenza (dffcoltà questa che s potrebbe faclmente superare) nella formula compare l numero rrazonale, per gunta anche a denomnatore. Per rsolvere l prmo problema come s è accennato, occorre fare rcorso all uso d un artmetca a precsone multpla, messa a dsposzone da specalzzat pacchett software o come s è fatto ne programm realzzat creando opportune struzon nel lnguaggo evoluto utlzzato. Resta da rsolvere l secondo problema. Per esso bsogna fare rcorso all mpego d un altra famosa successone d numer denomnat numer d Lucas prendendo n consderazone partcolar relazon che legano fra d loro numer delle due successon. Questa nuova successone, ndcando con L() l suo generco termne è analoga alla successone d Fbonacc, ma con suo prm due termn avent seguent valor. L(0) = e L() = Anche qu vale la relazone L() = L( ) + L( ) Pertanto prm sette numer della successone d Lucas sono seguent: L(0) = L() = L() = L(0) + L() = 3 L(3) = L() + L() = L() = L(3) + L() = 7 L() = L(3) + L() = L(6) = L() + L() = 8. Come detto sopra, occorre consderare delle pecular relazon esstent fra numer d queste due successon, relazon che s possono trovare n opportun test d matematca [3],[],[]. Da esse s possono ottenere dopo adeguate manpolazon le seguent fnal relazon che nteressano l nostro caso, e che qund prenderemo n consderazone: per un ndce d valore par, posto = : s ha : F() = F() = F() L() (p) L() = L() = L () ( ) (p) per un ndce d valore dspar posto = + s ha : F() = F ( +) = F()L() + L () ( ) (d) L() = L( +) = L () + F() L() ( ) (d) S fa osservare che per un ndce qualsas valor d F() e d L() dpendono solo dall ndce e da valor F() e L() dove rsulta: per par = ; per dspar =
Consderamo ora un qualsas ndce : posto n = s costrusca a partre da n una successone d ndc nter d valore numerco decrescente:,,,...,,,..., n n n + 3, tale da rspettare le seguent regole: se l generco ndce è d valore par s pone = se l generco ndce è d valore dspar s pone = S mette n evdenza che tale tpo d successone è lmtata e termna sempre con l valore dell ndce =. log n Essa rsulta composta da un numero d ndc uguale alla parte ntera d aumentata d, dove con log l smbolo d log s ndca l logartmo n base 0. Ad esempo per un ndce = 00000 l numero totale degl ndc è 7. Partendo dall ndce = per l quale s ha F ( ) = e L( ) = s possono calcolare n relazone a var ndc della successone valor d F( ) e d L( ) con l mpego delle formule (p),(p), (d), (d) adattate come qu ndcato: per un par F( ) = F( ) L( ) (3p) L( ) = L( ) ( ) (p) per un dspar F( ) = F( ) L( ) + L( ) L( ) = L( ) + F( ) L( ) ( ) ( ) (3d) (d) log s arrverà così a valor cercat d F ( n ) e d L ( n ) con un cclo lmtato d terazon par a n log log n vale a dre al massmo ntero contenuto n log Infatt con valor d F( ) e d L( ), s possono calcolare valor d F( ) e d L( ) dove l'ndce se è par è l doppo dell'ndce, se dspar è l doppo d aumentato d. S arrva così, partendo da valor d F () e d L(), a trovare valor d F ( n ) e d L ( n ) effettuando sulle formule mostrate nel rquadro l lmtato suddetto cclo d terazon. Un semplce esempo charrà quanto detto. S vogla trovare l valore d F() e d L() per un ndce = 73 Innanztutto vedamo d quant valor è composta la successone degl ndc log73 S ha = 6,898. e qund l numero d terazon sarà par a 6 log La successone degl nd tenendo conto delle regole summenzonate sarà po la seguente: 7 = 73 6 = 36 = 8 = 9 3 = = = utlzzando ora le relazon (3p) e (p) se è par e (3d) e (d) se è dspar. s ha : ^ terazone: F() = F() L() = L() = L() (-) =+ = 3 3
^ terazone: 3^ terazone: ^ terazone: ^ terazone: 6^ terazone: F() = F() L() = 3 = 3 L() = L() ( ) = 9 = 7 ) F(9) = F() L() + L() ( = 3 7 + 9 = 68 da cu F(9) = 3 L(9) = L() + F() L() ( = 9 + 3 7 = da cu L(9)=76 ) F(8) = F(9) L(9) = 3 76 = 8 L(8) = L(9) 9 = 76 + = 778 ( ) F(36) = F(8) L(8) = 8 778 = 9303 L(36) = L(8) 8 = 778 - = 33388 ( ) F(73) = F(36) L(36) + L(36) da cu F(73) = 8063309393 L(73) = L(36) + F(36) L(36) da cu L(73) = 803368079 36 ( ) = 93 33388 + 33388 = 6309960786 ( ) 36 = 33388 + 9303 33388 = 60687368 Da una prma anals d tale algortmo potrebbe apparre che esso sa pù complcato e addrttura pù lento ne temp d calcolo rspetto a quello classco che s avvale delle formule rcorsve F() = F( - ) + F(-) per calcolare numer d Fbonacc o L()= L(-) + L( -) per calcolare numer d Lucas In effett, se c s lmta al calcolo de prm numer d queste successon s può realzzare con le suddette formule, mpegandole n modo teratvo, un programma molto semplce e con temp d calcolo per numer d Fbonacc F() (o d Lucas) con ndc non superor a 00 paragonabl a temp d calcolo ottenut con l presente algortmo. Ma se consderamo ndc pù grand ad esempo per > 000 temp d calcolo per trovare l valore del numero d Fbonacc (o d Lucas) con due algortm rsultano consderevolmente dvers. Per confrontare fra loro due algortm, quello classco e quello llustrato n questo artcolo, s sono () approntat sullo stesso PC due programm entramb scrtt nello stesso lnguaggo evoluto (nel nostro caso n Qbasc), ne qual vene utlzzata per le struzon rguardant le operazon artmetche lo stesso tpo d artmetca a precsone multpla, necessara n quanto s voglono avere valor esatt per numer d Fbonacc (o d Lucas ) compost da molte cfre ( anche decne d mglaa). Ebbene, dalla Tabella sotto rportata è evdente la notevole effcenza dell algortmo llustrato rspetto all algortmo classco ne rguard del tempo necessaro per l calcolo del numero d Fbonacc F (). In essa con Tcc s è ndcato l tempo d calcolo relatvo all algortmo classco, con Tcp quello relatvo al presente algortmo., con Nc l numero d cfre che compongono F() o L(). Il tempo d calcolo Tcp è comprensvo anche del calcolo del numero d Lucas L(). F() Tcc Tcp Nc ( second) (second) --------------------------------------------------------------------- F(000).3 0.06 0 F(0000).38 0. 090 F(000) 0.93 0. 36 F(0000) 9.06 0.76 80 F(0000) 7..9 8360 F(0000).73 3.08 00 F(00000).6.37 0899 F(00000) 89.79 3.8 798 () Non s è rtenuto opportuno rportare lstat de due programm n Qbasc per non appesantre troppo l artcolo
CONCLUSIONI Con l algortmo llustrato l tempo d calcolo per trovare, non solo l valore esatto d un numero grande d Fbonacc, ma contemporaneamente anche l analogo numero grande d Lucas, rsulta molto mnore d quello mpegato con l algortmo classco, come s evnce charamente da dat rportat nella Tabella.La dfferenza d temp è faclmente spegable se s consdera che con l algortmo classco per trovare l valore esatto del numero n esame occorre effettuare pedssequamente l calcolo d tutt precedent numer d Fbonacc, mpegando un nseme molto elevato d ccl teratv, mentre con l algortmo llustrato è suffcente, pur con calcol artmetc pù compless n ogn terazone, un numero molto lmtato d ccl. S rporta qu d seguto un esempo d rsultato trovato con l algortmo llustrato: VALORE ESATTO DEL NUMERO DI FIBONACCI F( 00 ) F( 00 ) = 30787373767990870308607879337609938676786 03788039383890387968689937908899938083709360960373 80069903997333789783037368306039783387073866983 37738397870996780690633373980736370676760079667683730737 3963680076908800666763833866676033866373088688368608988 60833876809636730767603088086336679603988 8830860777788887936778978969778697899907607306390873837 368033099880793883670963930789737768778870309009639 9393306938897767807698837309697087330993677870690736 87880307860900837967387373689686396700330399 88833873876739070608377773066399689079373798906097687308 0800693803797676073838677338039000689793930703703076 78097389608608300386938866090903897073833707 603066779066390889787876630067803706730809986737079 7369989896780967973038989308638990809830793099388703 3099708773869869630897768888833603 00876863836683677088078776867707736939738830873600 678606996096637603698968897008863868698789970078 89790090768369393009960736987973373307783696868 799879309708009637693777986838689036638900870380 69333888396977837898080797698990633367366869777 937868807906689697038967078989399033606873039998 939078608999833338760976999886073967939870 686399907369869707690003889978760363099896963998 09868707390976633803880309387980938703333389 7839388803396063086076977836037096070377899336300979077 738700036363838330786778799993709668887638733766683 38907667399883006776078809878989973976086370080 3670706693667039777607398993367907876097737806763 90873639066837873038760090970363630678887999080 83698676609378903990638976983073860788366 93873930396009979068868393606897307609667378833088 87837669079033898380900773669966380777369996398 888038873378986830769996906770737083707300309760703 96606369066868807883908988803330989366783639380683 66830370779969000076388098738380367839603070380069 639896070607076668808369700098837883830780098770 689789690883376007733678607089680080797979869993 07938063688897773696908660003733903760086790307770 6990077039793379839707063079307 F( 00 ) e' composto da 36 cfre
VALORE ESATTO del NUMERO d LUCAS (00 ) L( 00 ) = 683876369687836079878970088767097708036 068360776876660789603300708987933606996867698977 393993789633930866939697366937378797030930779 968397933869768076968093897760789083389036868009880 88788376868677997003037683860663806066897667909 706388808739686096866890980079086963090090889 338368063088698938090690097996776380 0308366090707798789608606399709390039673838 8897379736686709908833809690739889378307886098370 9093738087079090396839987600388933806976997008637 7639036688839709397703373366888303973636339003786 677330309707307807668039693689300303989683368993 7700930036660780303330793870877309707890937993038 8890600896087367788673666060937768763803976008806 066709777670679339673938679979386600909378893780 86067678836603867736373063373080698796066033997686769339 8780869680993986936890077076608798088983767803999 303639700706669077689383788893697338838760 9008908998906793333038690767969860397088368 939936668376093000960936767997633996698987 393980980793399967969808799763907078960307797779 368887760807966898783963638086933987898608783037979 03380083989008660637309779030337069988389367086776 6399038706930937906899767378897988369730703939887 309790637363336739393368889906633908309776686 360379738733030383869070837600839906988860783738839 93787866989038303968097809968388069697897877966706 0309030770699783678886803873038973698689008000638379 760393930767003390039873788778733766990033309 099708808360036087703773698760980007690600838860688 6967030897808009863679837008000688607333879066787906 68733878030838976677963396793889798380966779996778 0878780887787986708837706363960998376076393666983 3699970936786788373873996007088606968003 0099306979709867390669776033889687897898833668338 89776890770660773700609608383886699376036987333067670 088009768707698639786069676873786686399988097 88969379383066963936773099760909380060089636963 7839769693969600008696808808808870883989 667993696787697788967863603373060037 L( 00 ) e' composto da 36 cfre Il tempo totale mpegato per l calcolo d F(00) e d L(00) è rsultato d 0. second RIFERIMENTI [] http://t.wpeda.org/w/jacques_bnet [] http://www.matematcamente.t/cmoln/formula/formula6.htm [3] P.Rbenbom, The Boo of Prme Number Records, Ch. - nd ed..sprnger-verlag,989 [] D.M. Bressoud, Factorzaton and Prmalty Testng, Ch. Sprnger -Verlag,989 [] H. Resel, Prme Numbers and Computer Methods for Factorzaton,Ch. - nd ed. Brhäuser 99 6