【问题标题】:Index of a really big Fibonacci Number一个非常大的斐波那契数的索引
【发布时间】:2014-02-06 02:34:58
【问题描述】:

我需要在斐波那契数列中使用 JavaScript 计算斐波那契数的索引。我需要在不使用递归或循环的情况下做到这一点。我找到了以下公式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);
}

请注意 .times().plus() 函数,它们是 this BigNumber Library 的一部分,到目前为止它们非常有用。这很好用,直到我想要找到索引的斐波那契数真的很大。

问题:

我需要一种不同的方法来计算这么大的对数。如果我有一个非常大的数字,例如 2000 的斐波那契,我会得到Infinity,原因很明显。库本身没有计算log的方法,我也不会写这个函数。

我从来没有想到任何具有如此小的底数 (phi) 的数字的对数可以大于 JavaScript 整数的最大值。你们能指出我正确的方向吗?我是否应该将其保留在获取小于 Fib(1500) 的数字的索引并称之为好?

【问题讨论】:

    标签: javascript fibonacci bigint


    【解决方案1】:

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

    【讨论】:

    • +1 费尔南多。这个库确实有 Log 功能。我会检查一下,看看我是否可以用它创建函数。谢谢。
    • Fernando,再次感谢您将我推荐给这个图书馆。我已经迁移到它,一切都像魅力一样。我将添加一个答案以显示代码。
    【解决方案2】:

    对于寻找此功能的其他人,这里使用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;
    }
    

    我仍然使用上面问题中解释的相同公式,它返回任何大小的斐波那契指数。

    fibIndex("35522938794321715091272953991088875073660950670711879743399900326436254083421380378927750257524675311447286915610820861302904371152466182968261111009824391725637150862745505342130220586979511719255023895335108709522075314248260664483166479670588221585277069887873168196490963561219694518077864879100421788205515385380434545975662001723555342440392621808579760295648531141638822913590607533540054087452041707826153271185259107394199852367649618298517093117009455894918353503525076230125819543123779319167440820789626564459764725339684808290073756385496248142195843240135064507885354877296572024804408624272941753639812538039913142028651903030529871116793317789757893606550341466951324756526825899737667945813833853722262630433262780974915425005732866591818868174705546087022106127052877310847951571707582794820376128579789767721485109492542287764348615868723395725124814856415577763540656765591673162724146048330852788081439178288706881889502843933839383437965572895385440792960391702268984769357859686271266574632871727046024303184663919395401465801528726015901456333025573481247959101652204602988035141532490361245742139050819433077833707742246312835208439293469725777437940254819086871672146128972238328251414589544434435170261367824782155103657578194196270111748570034449297964612564456266891635499257186520205662004190179581465184858273590634696557067719668344569716772604494379268256417559005989196664062339943367426392267549671696091620704483335705235401024668972377058959013548701899237423163317609813480075906438821567501678027453981255872940165896765562906948275888682233026018398591561683968279253311810352982216449990605138841279476258998291555393112171672512247299540528273985304628059093340049555047981741901553118436996372565143437092164040501385121979087826864836002852441013290435451405818936965791830088594057993174801701555239838033825491101182302604693483923297155552732646664230339899386949247469662146601783799159535265663192798622519600080199294778264021930327804674406845390858689361183645138036024622999759181149374409868339056190354930762438018253181839721998646473911299168577029520666199783681191268719288387969624745653240780708319950931159323616116725759084631179863296728766212415593748082930558151101350076376704295363472805637813559350925898715117938481138744212886965977892516525139040863376874438253015614485120277306681922196720541898193702570355885540352668267759850827312025869672621201575016416207760471674541668295376322809412095582968275396449970226064500618788480102243996614437085271546164050332641040829307354667753670012241015315160013952802535500838629086649248253271677865717482331893600871123634025348607623548331397239596180750809096946397974233223417735790158178612741331748855629088340732705900553246041710742016160018303725512211509204034880759596775427996675371964469431717567054234107252511625358715489171574578479304777517899774723598872665991091538945488811618222438651723224465992160327444696552759313881273021480919406887970238509074105071808066821703115066838126027585207922256205186141921352880657758551963602504587265334948468963725795943612659061581738118921217900480358979991209140061985794462152498458564473369295078153567296201818251720281822962062936831573631653751528074225190111823253702351177610664803940345503699699208037095784870495785646943997234474258262569998608041243140247674073513323374199936066218946098722092264140092669753657824017634461763981521997119226219136508584203375683292957948563073632975937642581947768042371117470198355444599517718979158713784804470849343173517943800269775988799065209263727016757620989100649249277790139290067789688270481157537247255077854388424596882337360026236416764073030845206282134294301701605369452555608749844089881840152464688185413471165531348083450071936767808847178828505212544681448346850412422392584457798023562617507156540143036586660455094150665003248778589943633804236061867787254092465761897721097498706848304838082130151573830146281598905862080528755999259386441406295844212093958532689277331339576745477613093048842162872506248493879631984787279577095875465635013803960469019743694441996546910736934590725390122252181310568062868015617422771375425422209106466232597689466636780861666245204430735375550444974466951762888881642801337840709202391876433786768647147807880162471534334272202034098411011768290957484345424507121327462388443014612800575348423810123382495642833743034606424879522789397956839996920113680951463518836156462019057063161795046895734075593501902084338246542048532779483281408634769806186279989881229648075555962086774926497206070780542404761166097604241890965888018873735027199940548827053350115337885438800728312460914286268127990478092896975620706029422142841447344514680046143167682001640750053397540223424322177217456434741847020047763710403144096996427837529811812126999093061373016438435440619803496909856986800826405322182728111872725881192065183612822832173197471616932926246556344247662468294551754101114527143077792003917544284111176961413199426663155326179333146951914261328112918116870606040456416800180399145364936151721824514256765308265696290759951243242140057433018143404698921069198350343599629915865217541917472815612277351716569260985624821969133328022587501");
    

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

    【讨论】:

      【解决方案3】:

      改用这个公式:

      (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];
      }
      

      【讨论】:

      • 嗨。你提供的功能是获取Fibonacci n,我想反过来,获取Fibonacci(n)的索引。
      • 好的,我会编辑我的答案并添加你想要的。更新:您自己提供的公式没有最佳答案。
      • 问题不是说必须在没有循环或递归的情况下完成吗?
      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2019-12-19
      • 2018-05-07
      • 1970-01-01
      • 2021-12-01
      • 2016-11-28
      相关资源
      最近更新 更多