↑ 前回の記事でフィボナッチ数列のイテレータを実装しましたが、Int型の上限により、92項め までしか求められませんでした。
今回は、”任意精度整数”型を定義して、それを使ったフィボナッチ数列のイテレータとすることにより、メモリと時間の許す限り、何万桁でも求められるようにしました。
var last: (n: Int, f: BigInt) = (0, .zero)
let startTime = Date.now
for (n, f) in Fibonacci(upperLimit: BigInt.infinity).enumerated() {
last = (n, f)
if -startTime.timeIntervalSinceNow > 10.0 { break }
}
print(last.n, "項")
print(last.f().count, "桁")
print(last.f())
自分のMacだと、10秒で(22万)229160項め まで求めることができました。
なんと、4万7千桁です!
229160 項
47892 桁
181198535374715613310982923979187752235946695179552019365231599560615188291751634851883089007222781653106348892078398153264534991536655304737730618755377586688705199225002956761940811188629978437046845413854497644299963326625683649544480131674223244630632134848151276517966544853993037811760025954652310530847495040731789220735657362623374745358637155818105535349486914400678513553519357725884721108308800748939938498501915440736646367813733713047334028143606069799110677156559531700881632379765177451998891922887451184441886129090282637881906441191661516709055636762907952221056494787806669255167467922606470073533294914890174449611698419818062968905437138715630833984635189342391265270887442949729599448563931874090360057414766182160638300324128258139998848954173886648383885685282411280152557686755447085466595885854600744199986342144844639566738247958895949368892162770958534957042907597694060500663875320640958399471992047711058659955995718690138845548594670942143653189544759857655137500756312877890620073824364433359001745208991281249898569568492628890935842016832771022412508356634338843597096022846742922377647449096010707192944239282034827529035211058532374952613158969713639210270651037460765644189897811617572583044361577011101952449213399243831208409422212202072455640766388187014170972485893377677151301691663178855374281227342490543813794638239794099278043285448197149456063579947381544723973308656125732374732566475464558102955777976236808584529621547958991652033405761991101201601774264028432626469291918988065611945302855195440426206938694357881671460554134925014267147008778630679067145067778933487125197038566863524352118930771342976107158264916386854920881573524174246390062071574451138328497775752985350760320004530092942385145061031075806370829788721262101860791826790610448669968738087756682679435307450994025313535031431476172442916916909131790187713962552772499125165254791542153102186263885733407280515826523731741127658297892970268186903685338027316458026767485375723261837387105293022062319337774975772898277963400862800628581582541154484290976727536260403428728918171368694358423176666139820123462951985186577699869433858561477163250308113214832519511505040243043757196017614602498929598094161746297372923953785664009422778598743768462973325910014177475715537459302280188222211957850564034646289821348696453576465197231301846178194271597100989562073323674262581702099519387068938817560722088721890979394421977224121854263654608984112937164655921030543976656387383874164683150154992740852558335836105370896354054807258229380415697848319738328686817702581204899352942533397296755966852232088231361516552880057456968849217385792364503658159001890393063441165845055739908643917328144866820426440482161693017876622294982602563443524997827768342986581798014566375253329482452985241069415893895281226044076891310738854275714315689739809281548865303214594247169240649869867219584691046582027976951778746176527990411927812584265318285052709600789011233110673134351352980406312983018306448421477802879970389659234356476930238645382637267923173466428784838577858904201616755625354891345896986303384680972155923575983898290038519843625232170804087518276346277244117050987903298468989197715603988925794419902872804283720094687615002093266465746994625742941768844056563354856573006957626225089775028617687428552431738700025121496387919440562401416854464640307681172475492183917698787432224814251689721510798724185968364424221848719993680018374779894845960552078057845138165830649618841311387828476559068810571434592924781684627719552009200340736435356657892330663491467188959669029265283597174536722609082277814959538361808020943296982239906461255094927781119546677575470379008296519321720819100447945254085200018668159217766106132804199837142629103296712167767350333604315752187312698769866274543308277690776078608565300714436557853407215312419260928375463713591590556129373629817235292661084020538335588461927254568619975188555593388104394684118532603822491930201303097248478043351105313612387899543178478435374124171647882584571104862199814171028240424623002602080620711216945421207657843740030571204763572547352958136053865074178815685002623948075972977118959579687673120317134102004835671574841655411578083472886757425788159216795231982618580030658544883628367155564179338022266883004826366404880078341264330048336806723403762630674583670272500195439677039535084757903528844218931979229988611169275690589378911470436363732649192944767527569402963543305711669281376666907454514122191611376617866412507173643361490638085810134862815052271427848669333215232458590161288573575536166788620457842825180607395159073320552931001745466180161211444863201006009262216492595648614954727798375263805202924881100952816888827888541371901799821806394898830121285704943608650800542687164648744026844197957186355165161967154018601429075713609074615981263210934780380223632176242137060201655999963551608038555223470653067729929306963684596139457906170795893426107061519538270801931840371865688941887001184480652606731560678693951820790442237745323351059294646455189865438443034267361771110337374675763976173112111740452875932925549208949192514040986086756521570435044402846715016322974787923608463393687836806420787157107799941639226400755759143042800547292063431422225396625052126855034812625228442250238927602035923910284682822001617050890359157089758402852960037573183974604067234093068100753884884095147814498844556369967669373407998011124362250814238062369488024977630856935469522694911851478995579687228445305687235701686752263494018794261603537912068943725500701765941320223281970698225333982993648262420592040823942394285802821998363123640078733602153927032820469778099614064382658890262955111617320916612729888983750298201373840531979882922026807270292530448069392885533118604152608990746360250195978683604973147249579435243261176569638010276020040958073898571698134943243297890418701571880339799926905750990270925811520851708120350826465063901560290384135391178597212334629300489747899216174208128403538674335886734485255093070718537773319815976252972875308571667257737660073075245076121198988016942334907625479281334134780434200427527404120000887562898561549887527766397854052426848521306453173889154736954883836102950164708855351172222213938516687143225350294072905985826809825762626838778926787530636616946573191644355759703564862585971101877751734333020356392458838228420196549988899317482972256013546920836812848621963479222864687142474919774465097194275642341706007273141309273380805156420366112598328160881112252477882298555680048046465747483815250156774209807549867363179011692842379600476322475917920984512475011193269950157362634289016432725860326742683212496033094668481435107967770293957294265772577713844179327273379679846541824880124945842349519082830581860385067287496768988748133064564489094444532971834241311177973551118380993319573891471818028181685278733372888839530070897533396292310847479929941692377448008740336393526889749627118124574906847313814665203894049932566349364385007797720856380660870698556631005913674169340058962581862197538613280678748355498059232130038048869517612762392421740714731522562577634990290936708188910248166747067755291772459409347108393309152389310654803351538335208751892436958222250219522807937096486964903418655260133155031291945092199802554512868905490753520530649806395464023823277171566160964660016792779323410562313774109631906329184255794701502425737926207497673778407304554859370865229500245481563027946221644050307330661142402707750373824275243033195084846476319104076387647146970630318618478892769895839885875872604891690405440818757201718085569536813290990610909241961747062681569233646098225244285499279017648536266032363484715517944161648659060344537049124477994038109060740711497867179553946771765860893007782663519955119735868651387347031485276607728915263277322197130998906407340449323703877412956695040234677461406465876825165137983890446255281416865324407426635989955357623965137183294084462428459552930548810135563587732999322828529858491503793431371164178591315358105423071007081840679405623582581705265572394197374389546218587701901831563627298325902541300718207900119958861718074555811034627362473459498755102602512029341796206019579992221096049971377149981908745725426955317027308562740631927859183107808404027354481651790772079328842903595766854989240853461269428345364713204296893177598328088345488867329020687569207210848672834755788495672090241499516769376721994162933547801202194129449090362495912548482425037002867459866393389133459558467924425108929314610288576099668055584400425192939079610965974880092209151904547264406701586668705591538704602284522410646838556373525192731044895587994518255009480943694615952097478517069327019476528650137483824891434881649341989910741573722149990000463744794803671284601394194699522986013711807342277594825831920258148477800469916065387794017201932327190092692146534335303944771521499355376323924261219342641382478657559752853779003238096654221409912676747650079811602116554073247461602819855514867900830699936768348531563462156039891433684538046806859816051065247045312977419979308771984389761072417159764297427341498878320557781461700398145534990103527070485408574300857284339182333083586606896816682687059428110074948082661170498844733291429482464874765189618871990660325512099052185987554726720920260420553732257300507657527618023892197977343661507002761339389228114547594776233601813879088035602711394776985947216169627191174526402663994218824555159697255330174821560058928761525336905566707895497836040172235337341261741935841217791823270811539880584250683034894745255447843395538062144424974462911066067541470757017236313693108214448279207610761700034730674449931405461504428595578135743335395782281057076106724211870244879305944768641982024310109643339747834795715364522763984531709310292719999288868488798118770478755131832192310244792000235021120610375567192517673655647384079898099043557646814566364612784173929219771451658817362249338645611222755556689441087434725411663294639175993652555987300410375935526151864796967970141537812557249990284561796028780877513073104736982821929584901481733082084941824652739372656433424910423558275500968554486069017040507633542609743921447715000482564685730301737860222721866425230474153365807824818446813515847593141995597793008011139927206963972082256924075013126591448227743794146054227380622594985424061818052032837694282144702109379076341141475407727757994858157237371929929911620151892070724175475679780213964587273570482971109889176735361989722044720877788098924422209151254592084322777326853328909686788545134167431375559311341130089172510134165940455072260532286561843131936986816065423447169763339042174568285904088319156666914807773506695505111149906067680121177520899450840267630665572911721111252559954276414546223878997476540953108052633281311950048413517443898742899120585951063490312822935263598887027721287242131741003442739892921220542191584826005400667388885146565089350260587975416124308389127130181896972568817546002998337209833663426947402453389096673081943984856888375093761298106288508978281628666685982807749408331282210874532518096375935435914431332599668853966399763533900600085949183573991816831448557299394097243925463238688903022900377061393885631637676999104822922652949582750659675885215199229848062565899693706478922001057783160086367136337306787902832136415232449621779635447108051612030910988495686734923115575897694618570915393820139363633498231033566107190192981025559422202729502813256787127545542380507904221691130951098369643684120161589776273030665868290292340280726071471052672812484099782612848105496297934674880066287223324085907505934594822786978172238603349771361083650401356593701101860291063734746492077210773898454328295009353281276331679252010644746295809125266892118314463786944964517120329264672740066202011316080554651717732448061044059359280782253639669920578350689549378540067222739266374062010292032666882688443712045930806797532089967486669659364931876399539730248853732620958928478399337930016954184569184308967077379708115633539903650839381395516175329131869080928339894552889943827624876120367161037109348811111721626655494594214171154042518394798235421174948661976071348060632384594567409036272919578270938247005803959673112578494943686740139531203978269965303300176729298891352317745921916090252322596339991266161162017403232994614119164366400009955117013373734941189580218905627933562846136966743559478173665672482163037349020852154397193573785685442796260951236098958975798715468407210684759545773557344213413209121146432860312742374686073073992518722072939706507946338288574146100220239835265705926539420908514876811941660817946476199827984936212188023469789815741879897938589719818359253241579634124250632204499041557606203640748485172621201773629443282964822371367214760783063325488256624247967113276900571711379161601457748843441801226749488101807210694277118941399471591773022797064625499411726142592552079439944565411430051815503848868564653929895857347634816842100451041572537326882200967733858063104117085283080116680748851707841733929752271760796406154896190749124817430786417885550990681981624944978480395182858190344058627425328785687476456844305804320245365130848853976476620567497190477730956637500730658443179174188529134944240027836637954234572192488540725801063884380052187927082917400762900988001928233874574885690986003838772748262287228796834773397111828409488410055834646426885384230449338913653690530573566301413130371448383370810940459618925504367305925850150558788621142583605304399779427663208155796696395839868594411301078513989827283260678901065911547042434504157222414587053869959147661791684549829470584126710127146359476534214958099469903115028760623597917781320624909838375184148079941058443970380958218143236148258220745465009135734442241233588292792861416998565909218047854938346575118504591642324378785617176718686512681614909429715937523155963445636801844008335587073601821076626569535543548643379934531154179686560506843631257140309957860311719582927556812981254773238585612383881654528611616893583488116398857667856880302270263143723738105984824715744580326367379794283966473901452738444882260334020396110817583743282243034091317769557495250728856231768905104647042006666492955892364690592772411647531772506374080374580533684224902432126629573067805259562249875717253782410705877339450812625179114062401757377343486751001168371634780411071362773925135773800233856150090228507614567920019635123206456669890223494674546615299437534970988872546914761390327796671511268707527238922641418077675136012036780453875575727404993735756889066669826643288840125030389568501186681253324255843698205126906503234742372197615418587904063038070626108355255581305252583214682288119375029795447247415107514192315764894101853470054809902085398401791869258184088733859640673923134334566971563129056847278991816678932966242394199687491191377444118362939674544352973074350175266456752486891462538855528721205308839064783588779845472690282909077579633203512239657743070419133209486145991820433965718614840494039380729598870288448360172713278020787848770705222910285565661445639957017503344466461078082865503495171309044185153022162882802479574615349485862061112750352695181926653104476162835648954238242602285303867098794154393039901468944743549355810100356586984649563320894727879254840996205206241980331208704915773526655025859475697384592200710646199852463367601929099543405608969587029319823074857383541002554130992741545843285694869513949362862549937993992638026281604608115511631191285629708682629913179806045980719244195443731532858952649725457981866317029435132461397064753155620264804015021814990820969024545772864470831232375018102143479687443403813071303171401619955367865003094602171751420633000530566797351211514560025889809028016949518941122578026045089377543083507486028035972691901324889111920462315842588180099154907784826453933101602133699182554588076627359693971901797030855421542933479687721475720174098627194260483972430791487398916476688120490070310102675408153131657070338756634541761213428620644238962996940937373744996679195179791455287402957030016462872926557084820729324316247631203929146084645522950774630861995439601916658867805608036882635664795990659935391363793504397830221435862769298386853009641317940622647753552269776191979191819160332832061666357957085371941481943823495783330560746554576277915601064947389432619384113748125482113280694011849093290909111401498724306252520929485967107761460215869051896164572937557572454549357186868494837998186615647765850703785032603703473068053510570439898883359519391329251283005875729657187672403545915419958539355917361035558054942045368191697847702772845648618240982008335205026047890048545580856382967747388938471373718314591391864446401258661978871353519995811484104934014185128729200576228918341840011447566443790949237722553497846542626311319904279411768710319848574244902004758487869165978262699598692756737794318514480245872120222715705706366166687735645002470370142272028713825480097531351118606121980879475395384232189034492169342541441646462642598906993061778398936994705194293271780111260380593801291124617575578513636235131672839210298612896744725414644847114098864603825167555922189001537881089711587217336548890835041289500975500970544337044658682154600141538514030012938506489196843706664096535879059640280119509825352508097716395465904780975876660942495489183388807132002120932013017976701027565752729827400405721287655243323733690655810957977812453830482740039072867022994729212069439784080426072845228665966851319923355012612038689719082001891902361638734101377419860540987603809550134273978990101594759544002366263049438929519158034220051693347741004736281830694809464430414661683277701646570298816781915404557545389116357204570328990790086207525628062022610248796769457553357238952130297996220749820097880632223468580329347818133084606606638620572750399387410688321393902766569714186787678589542907536454355351181941813366546024766949725389939879105032065112495137763725298626397835397009878428778401682702885119004642157810898824315685205984413337832036019780254850172911510004812690996343421356736668609671184105952894544327810126083643375272998899829279948662159683534686820524997153324510957092784597211148442140219244732439169149484107115049783972550964401260537321468923905434626909682770685927104691683703646842411411910413191127841893776941540582512421391728222265607043662240564586802847660240915428811465298895538314644161629076089454175046370105746493136347347303709318783005913947239172244821356047181300329032258857801855411828876501837715452984480652281599948119389910397513943920350942488920952700776302266697928426085027049787700322227808211825370041689366405979177144514388470924182898526388385925018978115166086765141728705933164433047009070607370360681425991282716415796349035960993675266713893069284932640695346673957260930687962657787137152141260876626447836111877344317842272388290139739615375180205563383498930770927889880234187061037352492310775835122677542742270775119724759738061599233539277965868685380806414098103234265708426417184362821840014431417077243748648203533252221365012021020410116940219650971521983372454438122442582374924608107983447420034474610225038022904547986656240003138814568786781199738194908988677166475602920363127249588864166142146930250113220958243193676608660212053825874906080747420234149404901906247212351805251255023746372781625589454249434671523564058087549301205976464576586783601493162129874672496849896847967442449113856990159634153947670197550260439143506604393666916289287225202543051927361531199167637129964905009978860014586354487448037421792776537795233329520756415832055559837227888019433036707466856989273574264986892542276656870429501266413669869198471593252315966088470371916420322084692080075484842909909084807916137460960493630757020642346359584153554894550588330194300847112222893197983910829767037937735543494759116063350046729472617891527038981242383636178679422980573691580237385836083704333906389226411239096763566169541760302467899612285467749399029720393097951544613325258014564009507693506210936125628002177574126188420881490019604958635437874487294665725140325133168507751917333071996447600738490960673765395419211007232998056122532020055993818973937767406448068930954666846395155377327415663822132275635458540598212530118540946565413514757100252101690300694882576894174023290734729169948492215904957074498758154356423205571167390225084422115156372394485907916727626479954314301845845693229338590621093971129311641200852937000063749811347653137480254535335303226672744360372793933782481947639866377570036834749105511276620786379216965933519092718135184425514414572259341381643940991562278527593782946816903284670020704446396321507247688548521773581917950299170038631675753006482295438272423362962498523548555822060324580834928050584564336793926948264113134842592205700547634735019264659605059701353884893030147116253742731080700732417553498159812612256200848119719611205646866585386429873789831587487659241615006226451879965172286661556156327408769342143677474088772446200750097520272876600226074413832925207442501337056865442002905050727462231138040182667309424322796099459028094695019018431386845830112394263930670873068102126246636081761079713801549580732086388874451118207387231262133924783198184420701570541903373845227556800140433026299033101868069652712684551806403284373359035378318675051006731746083660197573530226715840312198969273280668000760654488064598600592930296632011916624878721005532943454484021900348149670487977431464990421038460427177073190921287102766221481900462262512826624781849776715218713532134112283188471146729696494576498095896600539227602232913038327428788088574482206771612801344327417787674504861777468579464056256576294607521416817248343114167157331322867931368328367676306373979828453254927568245629216310970200355561741873741555861648767828261767794615370089406377142388370769916591570083801822845086726447792375685996714960511353932196777017178413885575778203631774044642454530621053778856848985424391395300699553616267544306582054043220250989878831204949172047289102058237868698831083552816982430795432043867519013318764568403800376962169535962802411297968434068862009388670363435464960245833624241978241351600486449030215276338209237929391029153112788023072608520347670160331068381034717953356356566485719179351079244208695346384071940120429113403086767608293672715349208650962611872085351808506427821131120480732951740279664972422043031581936549899509994538198281502963466271295280926497202723109076131048868957130613237933602523578865434483246147620343718280041832593995288613108289741451974549773166639234026825504308899227504137192699003908686799121521087253365701733399102721094055183313941877797614584605869177696308558611525042976634595401725625750452876136088915214038611313229451873672509628950781709664988532547368722246102649491234421904798787350704491580506215690832244071469200666720749286877467624512033942504078105736145441457912820843561836487443090176867374125101114039717157913384933456004015040775862054671180394249725647136823204309469823928509522551890741300424192022401780226768139874081680229969222445755173057556033431884944731541315233729322006287806195647547411560668662859112814651669379283054953565712711270653828232098847317666202083743708611752543142140655651159576135908809544820952832465379959369613946567075420570553011820759865544705970791356416004324614663149621176054791442443011991950611926918496210453946116373913289044676432366848554152232938364116860524512485075011751326187191084662411020684104350126387985066945069204449469454128656623691653230735778444150215974043948238868239124057572749651787341521400832926143283594372474060039974036033961395315829149841706466697680330185509511431396240440654514346666358086474158019684287350021332261717732320837780580225950482890477427506185701854529240289658592804659650016481241155770005033080421387698343735987140398795644370285129576047780805892919121762359765393187970972634859760858526088229082429073269963583444259629372277706248196846205727082172377321703415829978770460115230537593183038479688605693488316869206799479532024659947461368824507661160613129500859878523339855099441868765090968970484732771009496620360144243199048821423028758032654047791813024131571467421921140764367783313388793799627008047913370497691068211167149655593959932818875006847692971651759037610399074396203493222525333414703415970666211689605989690154370621768974806628926733325567768600225220017396230272852972512103946938612927493634444850851449404518066302678610399440496931114994783948366488933984753970267363069006949198564973296431441753470137872663128287642846147687571703979508980688834320203115349978063985644891144471270716524639011051908490544136203737885704868769290668979884342377483282894987232977150773952674282682814653762137724142588321160089994259389958189469949753377669327797459102359141461460669425692705575637436199378826907251350291315570549645348565256627733266502733669025935262272987607754488231575902260368667758354465384922658271748005432686612042222075002069893867373216850765639489952957426072779496026818381417997726078896360688295244618399614930547554362939169624780209725017406194673797353807036148535167527393928394287625737599139489721998279877976869755079576717574716041326732549592438662778384166830023453569450909634954492586548334015084467640299176297414206191541164925682942350351245981418370097625875753429144635836391738464335304171620841495336606033149169500880180916001172204629765298395230094959440920027671758249974369766304109148883469313960828774592468942176832972912500500890098073541047727606740241237830635300785145084010831355217351618209991634942831810089576333414523095139588545353585725340844960473697395527223092851242545186138996538611606381922639579270915669973457561604433389736732453870065391570539870914338652161109327437742333991222938778065154168993924845015432780009113517324796048354685063696092201308468032166921104623560550041116916894512148602356925201534698919722662122127021693019618258052126823239559841220766951216116811317141520599046976262877013829581387846929291152298178260957397641010406170476084656537131143474764319871085409290914083279905644153699079522491735149594871804879677084688367706922619472458563327384301143181690004957549716475843803207414287138277300707809947072589334614914569253537343093453554680854878763325954551299903389837118822024871237016598560767579068658247490932204138399641911772141691858818980188713016058865223847138102245471007457766442028150264837518047825033511156090277810250291542191213525725929618263879550181996884341474117463582681989759031451446640125672250558905963845994450618654084627253154228861481235752692622696934382985407794806720982312061325564497343764592044240731637450908101080912390342663081445963913229812425864203170208668563706710444565384845131703670982154484190943577740231521260799052784996698603602631186011216031886981769800741670324860119145195548517258132164613619066676178700653312116927067814909644412628820459839704978689310639580897596523143938483435602192025719013042929209694981493103752905046971533481252420377786199061158006807630791322667192117619254412939021080212895955511796429985404414748041451737447114895678030744552941683072132367500239211123420981336347721137276311875071872683740625085395103112487851620918846739534680764063083182332253377639824195655673852935846286482481197886358674426702790113278089214245015039986876167572813842076441234806000539611273932309167137504684792292008566010607985014986881466884303320027604700755527439544632025918592322544833743259526715764750782093027037184422925924785714747213658258011495583147216960034880843141829169480875882443651670029778227124467910785221506521900586282093955141514424458823571792137872950405810630841370876541129193891793613544110060406853032792616902549713734170879334237771401339530240606492263024159605749721490787907723863424084407389139408903959980722792562339601543706715240932120500779402670532535566551592881969778338566641309605352598649640784194819237948465213199932296321796740245227798600738068755106081054479875447768752957294431191938100874697364471647507955257859180464578619699951661062082031983847965554235885676048558732534276561237854304056435881039381768598913463566188566879332933931670124932828029243333341598526722734518248637988806288769630705866715923523647825469774251778509034497129688328391750761933743202927153798915088269688830082153423070042592456188701921473885620335393468976792518876630562465338602879918660156148275883439737328205229002346225197800315007397915004932449311247915595365797017469664718231776558561281923395640240056062742857656954966271483581288660762149945443002866078579563521647672866094768566697532628702119517573060141743398486462020038348076166735247312054634311418856065318672993571437924562014272566637888763101320868972692574115949256515611679142975420637940384278666676435520460489364516824547695162405089140851026886049378226390557488232189512470532049226722542063892598746081968483803062463068497467116099421905573445893797811116320882258847754125353911388372378383123670263540609194217077873554003526873781900279764679959597050267912530118136720669875160770588840595817456913560040021080072010369487868750283400965231632722990743964482444208696549227788853369803247512195637062191943799789464141685006229990569038275963442865146276940517389086513731074607998893092508222613449022706601743051370821950243720822812748138464929487258704338028136040393331499890353736944479807450281821747596657392203816808273322668630344126513706215946743090575376098909294051522896862090658172833226333696576176300865111400955572667124406423878533480622040362137767263205885529315307821516163456771749447304157253091592025081710389805605104197677699643651268924613973793996371598280228675374646630454555271319137168722679107487967867550463838421107700460873020680601507554260846298841578337108507153483574414599768698442243624789863634324053922432158586958761793967891290164219474652045410076193109957116819708351090636537978473976097600412883429045433652309264414815299143439609819678731503424475697841920201684811270767966016175441958774733718052856798044345444084114465456680405915208979211004529859927798836363453599308880251405611914465211852448316077005260122755328068024508382862997999475419606721751909532727514452291292545629693557674192368874841114698188320546490380549421019672167487677155681392435027130405323900517002560147385102961510890495754131010481790466097060826789409856745389540275423003411341956142301444498331574112636178514349915320320913233435401402485069633611157425076432493051274804315311691732737646482373027781816896706309822567263366246966067244613737836384722096130962239495402233111617585706034444560416970641275689646053763597235308898815988091194701162426309328372124351380060608962206652521724838329498185393162324670405936044661674280006406631810959050420169646105759625946184752925791867947277061980825095383956893891600946016059205007470628446746428089617264792673734557903383917695820249720085816815663361451376573034563202237351688874920392327822444255925340837224796963833625417430914139551996345274777071871029476033988503848338886700051024851944679636986415969271273393674993535768081596517711638135324374667382418031629677695455938277980528834317955158134959534634776619565225880324092817333045950184744185243172769528649883648102064260974725662315847312651639729559568915293726826886555288988490689346795265117320279072405393346500879819209224272548142931992237626298146951826653263196889352311668629736695595192908370367579872004183672764640535885408712139837101440325037260272169529283490102567349476248439368101024063763007385730384252681887661509097911834212614749143901314758037425416843153672804134583905785469976772125840212853597363059813837163688131446336040597803019442601425483471246818483686843040383695710820023010537065388375027475353360640508791861043183818255835053778498524610897172801310368469475585525721549269992354833762001620166600376139689455841377183187660479151080465905874058741388860198133751393498854820460466130224768802355132895980256293031231758537172201316866971265642932556744991549634163354941281127100469126967458009512412649737266185042059088371976522313703047488280771860541575594165005895815031015656601515417085108079896685341144504382039371456522373512467211017290078004100494164193787638363168753196439714318636144427674161449146406666248753246329186330963402758183370856081131211320890271061358131432237054688228599306862342660012472212263006398674188142002212867626004973405247528185364633134485479344913541219961423995810110971760668460740270452551214674012222659709302479834473886230750565896804024877906846977145570833591636771886197504227929599387545611815641776960461324715907694386261067749533784730899597671951117303243904758959228401579030070487328108863131261719711306134338305941482251297159280105808571591274109554317916688777520264975335639178683426860727106056618924766296755453741384087916080848114183409734652890431650221513340280632486377257195839220759541282768063818791854633835403958552679888449981541345657017495943828900653870345495004606741041023991898387671955773549212308168974148703844012106055186989354691924559061474587446581569245840043874621289574471276992288818099640382822697840121646747288226145961895196594769110841562660667790796339001517583423286416164418548090642432954560811447482844804458684245730671308126848688775475037735048033845255506581407627326365907033938923527467565233494280493866215703079043220183511279067218343131815504247382615741626434355994800523996464209116139821581232355808214606457726014292446177071348619336549432803334907647749224247127567089435662611398145558732403356460968483144543203693040089795224606318324694788796790080122715712735782805270973878775117380598518482078354982129905067411775224043038263352954015549840709242247120317291272929420190732918952966284034363965098653861615906435778306575166497198116605051469072569862413597433325055940630552134511754767380687307364530082022409393492192756984249503682720812575282225123325485735887335172055625175091534503424861499525629852778135805877532174344520603430839731862583704584535084042067777620290446949155445282960665934908110666065122092425177969810965268705779960659001229656173812615542566782574176965614189477765619908333733278167272624698872802211827841101870026422691263664139257460221366870170755725214013840840354274446451504372337171750477695721697070482491771182120824940916828704281764503874007187277126972192884844076812375160539639034811363480070993686124880613004406853165882509872797703105449649805858401515531316964730488117222940813414625685606363431597642359688290790999753968732063997082165207939812317027819858162794931843604799423545019985403787221267518877522769788230668524084691565457817962084911572760449212672959814459224457727913116506319103951682409993686295077182524839136468699697626663393861288085103909968161082440807042715562003133952954315763911963647698652874180046894888881452341830881218348411449736074402323642755687950205388026550057280518081612288711826085940054839921694340857818951743882803174918772999440931507591027575122523265111661517578932785142913303577645962022325261326428642490819302601203717711511163428769553781777666540913147686269980014278102163995528871936331834862947594586440211285419973799533101130495501495290582125735081249925903924735983722294306588224111919679573002516589233663624466963003548185908755415172132874036362973295248102371486385514347170569352877943459851395713291107892138855334938780596895563780852939920303049762377778402763753469837848265895754577638533051511188082795965856937751212716548012814613260262829537374614614032061448307840173187695746539836535142318689867287871045195540120190888915624814123221227584498435063315625413545241515256523811658989666691319557698236298810993427937094019510451341774164942669008548378947585624752354256008889269473779538142448942333583034336152192791992062822546393090178703426824990921927206474040267742119701372087354248765093923389673944942541140180591181754112463663361997890835504920948140193782800293332154239296046609569269769193069827582549851665377308075666514626469412835413330893245970495125806502203075392532607763777398540640094937679507904144394353754828955978059173873337550411134406267334592909545983021645529068459476692618844308979078307570310328089542585349728482007510806134005472509096534995892291020149565180070742031652048985272875238293801457564821486109578002117424689627460315636617490467568910433985369378362971026115480941735030081094933514714184574827265652485223477831053602543495007745480471849756798755717077554559981914067259805481019629668273735452075637341025338644553055070612068166286319543642724439464901038468828087309324245813303533298950971907493181343666317239511414515032143877633407233984158802682676549886463759507840622665673258371268850749064797522051569927131993154028139119235625843369261536747402185649973636404238519203303401604427538679279706263887309418895317787351239666882853676657322728377864476320948742055221748219865614961494926863330847804463390375262701101261388301351684156339543674487126850941345074989063947120861637501447442869985755044001715253944671215522934418175171701552172080360236289397360788142028618844407399860420258489624511532897352338844533975537202997065815047793190760713952484376364075971934711233619427070238689586124781638313464658949528581269161594302040641377045245448931693764819133916816565032569099286339979804424459709874270635000951132191098407010779102054613193012486934775317830000990879809438427683569870233031412669517238535746452754888583002155211843308089842289767451601831852746638809102989844437546495367477195416512288068110384696235871422039431066655888771016577148277187892154913188025293998814169950494429702029605044937963316682248008704293853546099307244852324881368367360742376401267221862900754487240083945388240615757345414905444622052124633857099544296194396583959859095052749733348246838871669322116404082527340192353897713304822586245534725481611404516030706964346836903267462201626184754304444079671862296108893236941127435872961301405375966064456660803603829177905631319353383667209393045420190834381642154842140521006861654174311460874534357865242726595222329954034262657357462695884180273076301593086835670087402807892415720173339913842963508958004264743369188894262229128866125281447175024964602324837366084783990034815087958990500161769615762249345972686819470978895084591003934552040228484289047399274579681311756271043131746365118482515888733140570688252111104682678651335605317950139380766341976581502989090083901775635121824779020594623138573832409794674300072770539476086290587853970815865067798639572548849717686663815577973008803797403295917998826696308358557633667500845117016194295108386914898130023966330940026177738946157537526490553345207332683680897339056487913314824272587457800049866571755541561244410696433804985453537671760670973458607809944537118188156216364250421592513313329709651142606623821728046096028111707996326998475183661317019036535690245418080969902464745263765638238988650320806939976573937707348735703943315653162511304820802760387581090086859475198347075880200143286384480617650536889365259324657758908059062393133604204783650270721677045105278336139047555301867790478594053006097847377838461768929642954778507565076123348377511343767783803956885485399553905383391118748014470102313594511690601314925328194275712864288602082380926841747098592309569886780920453732848752484466935519683282110697624485560286051429335740335578426476651126885986159864920406688152579643436951928316824512489825597361532422044705192175188539733489062050380764591831076801672321153162603230390041224415665114626422476115122956639095170999166931233035021471465702753637351733057113484638811758860375999449194945835950609725691714719741351218403757623947445043891644884522052813681817394782889383834532252298052657094839269616026641197209152259370787737958504355944986074917130170965819817021661195323184923042246668156831318782613473065754768526134314407064755733763517231120697793005125316081093446873807989087201731363318025993793440963781031628974184631121307230694917435318969240366436725188494032850748961669725928240988603278824890836884346130995979469866571583088980963442705941876868184654848747376880919319710139339621694945192895525993274559087375051981088135576614530914416741069967331055524449198977384255092500343677116378654257514638551992325556388985570325966283220276411130117093817673319284426427268950345524945990674835931403281020523805839536406823023387505098816305679626712780330636469756149363361674476269623404735124845344623827739784738181737438618085942481090036264855142653790616373684350227932273837438276651468312472089999956319698845296893212294452099194925137985848422131855445267552642739700498954565154290880389118625996076969431564885199325913294006896460270115162640306118937097265954950760594968589150124220951240372815637145455663707648421538315253485696879665104814866297689777053875428217546878588621501969436198294705668371599899819475995503079313789123391961408945030751762933488748302396226867097649703712067813059621760282913291958670022434444713177984592588181816139303102319345531167296489150203223144538325418244081227465500721976599397727526130089310042439430003161377093516676506030055061275245433985461929857941082404305752424037223362599083723538030547097827835068339347736783340874468782645241578015674456614637783772252954430938764037366400147499433568294168036285898613113791379649909774562057499163992711053966662977181512705988960771991328984521941221142474008183781698413396224170421371555057680496335936124789780592731866005705008293039436298518488421435876914709664477746482224477204588587311051093723624796894483860683835775309821738059933015132838843536767193473199618339055784716341510881812214565926585445992915630322951214743458462292111343754708480198397794014994426229929352070476654911032644614605586405921619268639322893853231953651676179742646870876087387399407518230881334876039751147600812893584366481217033414148549607436544991393688717426900615880256355270045651417516158719344084969940442404959248110307662400754965117006144039277272254508779050880859462403212805200777941098069442359412622330848009733572289634250087290200046730459968808656908906773085529222436243899508176919909416446663617042441003004001859263426807491898289781948742031952830597902061244796330738171032278322448690760879944745715868395417848204090404324930557004245144371294616473929028884465983513774378701248123230527581816397129571101359187273880998552209145399870287606812378648158427857368178190751598897956550867547890061056867996586767662246180158054270524333548269239699144414349594822260969771504794906978222255219293922339854622622746613620975665540167548421080261425221199968514354209144445106784845416459893369678607834401889297514837711877417379383828369453274604035366553666555630364266213647735600645677516111362533541697873831708107188077434129203402315943985379853140916588526723855342707882113789884622583790678540994292944467402324808278919030712701688552509589647280397636320520712506850664073852158918688987629907994828898027871663704949053235927894949164206071605743178659906703481626551850381068251579166541358241056300838639920703359439077318048191055750426536329888409002620555385137996000206808660540980527066107911003647469276087391427071304906082674816507632199221367688625141181520165075099282881506356396446815674505969284667523026589613750546145430434846745426244920683455110444535207818881517564685985343110193173181917014886720883943255989572181571893929802118367274899488133611747933928257897872591739909823719206986069808591839696503092806957639921325257878324018837115218719618011147467458396665892210157535423631533083742150488618905182922507400255333635419475102843424535040157291141992200662941022245389796730861646893892842755364286861733015553917272303475537788432748398379355007769215759950281113964783226978877906162947412272314649262320575814366693599390273553118761427807824799992426324515549323201103015644305026700365515418954238699753519369904740351513198015549116581444229480222900055210804878735841815404753269398384283004444718077829187596958900087876318067067036337754249348473864059592088572392894755685152172078901776757329643302911025079095729605295825678529543203575589585503612755318173017896797113666460870324847199886017682512918117669516034849919011190072068867966603231863044395065744942168356131680582991252537657647051315959002291089333928070993655026999404283770250657937190828186201259746772681094686021998095953965779107236908811118231622583033338227248762412540915845706161073288639181667024933997658548946862630844712004156532243549067567393412874633844994785841627468453300713640981271439506416192042269030828229872719715817022652258972928763499603572706793831389113289933513455964755204778730381029712033873582759124863664458345815068139701511290796057261206206658906482764960783003651048441360887654213973066136567186747028818675084083709943879357529272012107505134416398407053464107139931066005790527519852640347860394485400386877402716427872263280104070732618808448029301662136483923548612880781305107343401331988156101779991745960572385212442879999729507945004517922587006901384133445178730108236144591164603669649618904944910267547729361908880063571387719589162661199420881345519794297745793720234502544810457977742975290609707971030259609626718060516490297505428306210880804575229096352184035254567998769440011160559371218965946365192091495137122562522292940428345707861907940817344879771087386165926597308076179996566741249223511007310910072596288941289951823819875242131599564519889284547293791622281266546654851894077639015175188985107164024508024949718280862770888872719622224211561405359545301671996388491080942440988516503080989853836810490821084489536889838286081157562230754779716984204576950357071167478741970944352993227236471575931747485076889552510172807432262220117765303920323624121301331857845168535306008723608048273970706528293570097870888402435549602024422152523633749566570880992323737991300428417844764802318067865348957492556415613733709135694889097023544682243505097436073114563620722718164819551749255289085293686521781936243977722630713953315792695168154070062000810493451983102083957239580028797538634066814211438800957811171909182880145169893792011851383109196606258486149555649913765383192614971915083639696098840824322320048054926568522853239167150174211628615323016040644783480225969538843167982956570353149062884244328050750449624351043086247762395973595540042652494119685275107077835714320015948909781120557284085352854779454112202641719942591196674551161928272980677309517963651773791406312689056383674922614124480786680706451256656642016660294721280668710628722200029555910397090781080048008457549182437444266715309909411680340552272142412429211741926190529193605084020657499918884695237168379726423257548935068760435552342603266959297874446634712428001354549682771537245860723767229278512111021565596969925758934124544256690220240670972233916604851473737834495919182662292914205311970032719882159367507547043595710157822287834012104831809202480501271779755712054486512624690935668854045785901453713943461524364987755188967557394906666256488838501889781039651699656588911716073632390569756712622641513481233700417698690550556735082452996170424867556230302457435333959766477016387523363916990686338314432612962421231652696933344771490196023169826291165965138842079514678512917087428778636014122549721111570463906605954888039676534153699816933920805690121664977752937426896186631486129217020588295435643287578277417310755796348946372682802732802067164009900644704215933476950403866604204230141180245
まあまあの性能ではないかと思います(自画自賛)。
( paiza.ioは、実行時間 2秒が上限です )
実装
フィボナッチ数列が目的のため、今回実装した”任意精度整数”型は、完全版ではありません。
- 負数をサポートしていない(常に”0”となる)
- 加算以外の演算子(減乗除余)をサポートしていない
単に実装していないだけなので、いずれ、フル実装したいと思います。
”任意精度整数”プロトコルの定義
public protocol ArbitraryPrecisionInteger: Comparable {
static func + (lhs: Self, rhs: Self) -> Self
static var zero: Self { get }
static var one: Self { get }
}
”任意精度整数”(BigInt)の実装
struct BigInt: ArbitraryPrecisionInteger, Sendable {
typealias List = [Int64]
@usableFromInline
internal static var infinity: BigInt? = nil
@usableFromInline
internal static var zero = BigInt(0)
@usableFromInline
internal static var one = BigInt(1)
@usableFromInline
internal let mod: Int64 = Int64(1e18)
@usableFromInline
internal let tag: Int
@usableFromInline
internal let list: List
@inlinable
public init(_ a: Int64) {
var a = a
var list = List()
while a > 0 {
list.append(a % mod)
a /= mod
}
self.list = list
tag = list.count
}
@inlinable
public init!(_ s: String) {
let s = Array(s.filter { $0 != "_" }.reversed())
let sep = String(mod).count - 1
var p = 0, list = List()
while p < s.count {
guard let x = Int64(String(s[p ..< min(p + sep, s.count)].reversed())) else { return nil }
list.append(x)
p += sep
}
self.list = list
tag = list.count
}
private init(_ list: List) {
self.list = list
tag = list.count
}
@inlinable
public func add(_ b: Self) -> Self {
var (x, y) = (self.list, b.list)
if x.count < y.count {
(x, y) = (y, x)
}
var z = List(repeating: 0, count: x.count + 1)
var carry: Int64 = 0, n = 0
while n < y.count {
let total = x[n] + y[n] + carry
z[n] = total % mod
carry = total / mod
n += 1
}
while n < x.count {
let total = x[n] + carry
z[n] = total % mod
carry = total / mod
n += 1
}
z[n] = carry
if z[n] == 0 {
z.removeLast() // removing leading 0's.
}
return Self(z)
}
@inlinable
public static func + (lhs: Self, rhs: Self) -> Self { lhs.add(rhs) }
@inlinable
public func callAsFunction() -> String {
if self.list.isEmpty { return "0" }
var str = ""
for n in 0 ..< self.list.count - 1 {
str = String(self.mod + self.list[n]).suffix(String(self.mod).count - 1) + str
}
str = String(self.list[self.list.count - 1]) + str
return str
}
}
extension BigInt: CustomStringConvertible {
@inlinable
public var description: String {
"\(type(of: self))(tag: \(self.tag), value: \(self.list))"
}
}
extension BigInt: Equatable, Comparable {
@inlinable
public static func < (lhs: BigInt, rhs: BigInt) -> Bool {
if lhs.tag < rhs.tag { return true }
if lhs.tag > rhs.tag { return false }
let (lhs, rhs) = (lhs(), rhs())
if lhs.count < rhs.count { return true }
if lhs.count > rhs.count { return false }
return lhs < rhs
}
@inlinable
public static func == (lhs: BigInt, rhs: BigInt) -> Bool {
return lhs() == rhs()
}
}
イテレータの実装
前回のInt版FibonacciのIntを ジェネリック<T: ArbitraryPrecisionInteger>に変えました。
@inlinable
public func Fibonacci<T>(upperLimit: T? = nil) -> FibonacciSequence<T> {
return FibonacciSequence(upperLimit)
}
@frozen
public struct FibonacciSequence<T: ArbitraryPrecisionInteger>: Sequence, IteratorProtocol {
@usableFromInline
internal let upperLimit: T?
@usableFromInline
internal var prev2: T? = nil
@usableFromInline
internal var prev1: T? = nil
@inlinable
internal init(_ _upperLimit: T?) { upperLimit = _upperLimit }
@inlinable
public mutating func next() -> T? {
if prev2 == nil {
prev2 = T.zero
if upperLimit == nil { return prev2 }
return prev2! <= upperLimit! ? prev2 : nil
}
if prev1 == nil {
prev1 = T.one
} else {
(prev2, prev1) = (prev1, prev1! + prev2!)
}
if upperLimit == nil { return prev1 }
return prev1! <= upperLimit! ? prev1 : nil
}
}
公開されているBigInt
↑ こちらのパッケージをインポートして、”任意精度整数”型BIntでフィボナッチ数列イテレータを実装したところ、同じ10秒で、84251項め までしか求めることができませんでした。
仕様が汎用的で処理が重いのが原因でしょうか。そこで、自作してみました。
以上です
