一个非常大的斐波纳契数的索引

时间:2014-01-16 22:43:23

标签: javascript fibonacci bigint

我需要在Fibonacci序列中用JavaScript计算Fibonacci数的索引。我需要在不使用递归或循环的情况下执行此操作。我找到了以下公式in the Math forum

  

N =⌊logφ(F⋅5√+ 12)⌋

并用JavaScript编码:

function fibIndex(fib)
{
   fib = BigNumber(fib);
   return logBasePhi(fib.times(Math.sqrt(5)).plus((1/2)));
}

function phi()
{
   return (1 + Math.sqrt(5))/ 2;
}

function getBaseLog(x, y) {
   return Math.log(y) / Math.log(x);
}

function logBasePhi(x)
{
   return getBaseLog(phi(), x);
}

请注意属于this BigNumber Library.times().plus()函数,到目前为止一直非常有用。这很好,直到我想找到索引的Fibonacci数字真的很大。

问题:

我需要一种不同的方法来计算如此大数的对数。如果我有一个非常大的数字,例如2000年的斐波那契,我得到Infinity的原因显而易见。库本身没有任何计算日志的方法,我也不能写这个函数。

我绝不会想到任何具有如此小的基数(phi)的数的对数可能大于JavaScript整数的最大值。你们能指出我正确的方向吗?我应该把它留给获得小于Fib(1500)的数字的索引并称之为好吗?

3 个答案:

答案 0 :(得分:1)

您可以使用BigInteger。您可以在此处查看如何使用它的示例:http://reallifejs.com/the-meat/calculators/big-number-calculator/

答案 1 :(得分:0)

对于其他寻找此功能的人来说,这里使用的是this BigInteger库:

function fibIndex(fib)
{  
   fib = BigInteger(fib);
   var x = fib.multiply(Math.sqrt(5)).add((1/2));

   return Math.round(x.log() / Math.log(phi()));
}

function phi()
{
   return (1 + Math.sqrt(5))/ 2;
}

我仍然使用上面问题中解释的相同方程式,它返回任意大小的Fibonacci索引。

fibIndex("35522938794321715091272953991088875073660950670711879743399900326436254083421380378927750257524675311447286915610820861302904371152466182968261111009824391725637150862745505342130220586979511719255023895335108709522075314248260664483166479670588221585277069887873168196490963561219694518077864879100421788205515385380434545975662001723555342440392621808579760295648531141638822913590607533540054087452041707826153271185259107394199852367649618298517093117009455894918353503525076230125819543123779319167440820789626564459764725339684808290073756385496248142195843240135064507885354877296572024804408624272941753639812538039913142028651903030529871116793317789757893606550341466951324756526825899737667945813833853722262630433262780974915425005732866591818868174705546087022106127052877310847951571707582794820376128579789767721485109492542287764348615868723395725124814856415577763540656765591673162724146048330852788081439178288706881889502843933839383437965572895385440792960391702268984769357859686271266574632871727046024303184663919395401465801528726015901456333025573481247959101652204602988035141532490361245742139050819433077833707742246312835208439293469725777437940254819086871672146128972238328251414589544434435170261367824782155103657578194196270111748570034449297964612564456266891635499257186520205662004190179581465184858273590634696557067719668344569716772604494379268256417559005989196664062339943367426392267549671696091620704483335705235401024668972377058959013548701899237423163317609813480075906438821567501678027453981255872940165896765562906948275888682233026018398591561683968279253311810352982216449990605138841279476258998291555393112171672512247299540528273985304628059093340049555047981741901553118436996372565143437092164040501385121979087826864836002852441013290435451405818936965791830088594057993174801701555239838033825491101182302604693483923297155552732646664230339899386949247469662146601783799159535265663192798622519600080199294778264021930327804674406845390858689361183645138036024622999759181149374409868339056190354930762438018253181839721998646473911299168577029520666199783681191268719288387969624745653240780708319950931159323616116725759084631179863296728766212415593748082930558151101350076376704295363472805637813559350925898715117938481138744212886965977892516525139040863376874438253015614485120277306681922196720541898193702570355885540352668267759850827312025869672621201575016416207760471674541668295376322809412095582968275396449970226064500618788480102243996614437085271546164050332641040829307354667753670012241015315160013952802535500838629086649248253271677865717482331893600871123634025348607623548331397239596180750809096946397974233223417735790158178612741331748855629088340732705900553246041710742016160018303725512211509204034880759596775427996675371964469431717567054234107252511625358715489171574578479304777517899774723598872665991091538945488811618222438651723224465992160327444696552759313881273021480919406887970238509074105071808066821703115066838126027585207922256205186141921352880657758551963602504587265334948468963725795943612659061581738118921217900480358979991209140061985794462152498458564473369295078153567296201818251720281822962062936831573631653751528074225190111823253702351177610664803940345503699699208037095784870495785646943997234474258262569998608041243140247674073513323374199936066218946098722092264140092669753657824017634461763981521997119226219136508584203375683292957948563073632975937642581947768042371117470198355444599517718979158713784804470849343173517943800269775988799065209263727016757620989100649249277790139290067789688270481157537247255077854388424596882337360026236416764073030845206282134294301701605369452555608749844089881840152464688185413471165531348083450071936767808847178828505212544681448346850412422392584457798023562617507156540143036586660455094150665003248778589943633804236061867787254092465761897721097498706848304838082130151573830146281598905862080528755999259386441406295844212093958532689277331339576745477613093048842162872506248493879631984787279577095875465635013803960469019743694441996546910736934590725390122252181310568062868015617422771375425422209106466232597689466636780861666245204430735375550444974466951762888881642801337840709202391876433786768647147807880162471534334272202034098411011768290957484345424507121327462388443014612800575348423810123382495642833743034606424879522789397956839996920113680951463518836156462019057063161795046895734075593501902084338246542048532779483281408634769806186279989881229648075555962086774926497206070780542404761166097604241890965888018873735027199940548827053350115337885438800728312460914286268127990478092896975620706029422142841447344514680046143167682001640750053397540223424322177217456434741847020047763710403144096996427837529811812126999093061373016438435440619803496909856986800826405322182728111872725881192065183612822832173197471616932926246556344247662468294551754101114527143077792003917544284111176961413199426663155326179333146951914261328112918116870606040456416800180399145364936151721824514256765308265696290759951243242140057433018143404698921069198350343599629915865217541917472815612277351716569260985624821969133328022587501");

将返回25,001,这是上述fib的索引。

答案 2 :(得分:-1)

改为使用此公式:

(Fn)=(Fn-1)+(Fn-2)

n是一个子索引,为了理解我说...

所以让我们的代码:D

function fibonacci(n) {
  var f = new Array();
  f[0] = 1;
  f[1] = 1;

  if(n == 1 && n == 2) {
    return 1;
  }

  for(var i = 2; i < n; i++) {
    f[i] = f[i - 1] + f[i - 2];
  }

  return f[n - 1];
}