# On Exponentiation By Squaring

I’ve been continuing to read and study number theory, and subsequently one thing that I do a lot of is raising large numbers to other large numbers. `bc` is a great tool for this, by the way, and it is able to return numbers that are many thousands of digits long.

Interestingly, prior to studying some of the algorithms that underpin some of the cryptography that all of use every day, I didn’t ever stop to think about exponentiation in terms of its computational costs, both in time and space.

## Exponentiation

For example, let’s use a common base for the public key `e` that is used frequently in asymmetric encryption1 and raise it to a random number (and this exponent isn’t even considered large for cryptography):

6553715451

The result is more than 74,000 digits long!

```bc <<< 65537^15451

34182049150723957875465592527997715909292967051739754938690558613047\
34593722995403148659339161722507712790878754551494532872308330982704\
69495520665658430384809938588898945881698360030787195207538772209924\
54540464801938843765662470558564696254945206619771843638185692618529\
59478172434208079763919030203625670099500190007799644385710218673657\
02879352905961567391248030214904289497690549384151353365747688638257\
06982312681152386199001988230656410368317185213085441672206017188574\
48739528479732797665300383760325817821214192716672847365032606905168\
19875574700683401608807310716977304425115528185639367826726871470735\
94118644833030763194113157030096241127061942397521398624377196688771\
36603409916694385788389512266530333055214376888977334094369984769663\
43191215037469056400354116918130240391274565890076671145236941265406\
93787233325071482622971067543285540081335040498929277784198584286138\
32491804419124136290406315407262222870778252290229434994911682053099\
81252641873521782615755226876154659644487478134892253478695310727900\
30062378783572678857157490616852540881237866353940854805453556406518\
27892648934719104438189064978741046887416746826721240376853179810555\
53069809718699436055101380876926215951219049347033324412128164357943\
57352802839436979460432708418015113461868782962075318848520188603966\
74508668481606352945974388811441568122300618798354111272310014505445\
45855601920483791188471822532145646789103672237746898181082954241839\
55245801724370542925833811988190403636446642757175445623997662315938\
36132483769873282947205462688474081748326706499112732650051134604934\
75886586293663720883904751455708384890336088526281236433202422564424\
58321348032894830031829817166230546130091295167220373810665987833735\
29686589170713023445122105170755644940115417370042155546740656917177\
43772616831078636639414271302090809206683359224530046156574557457098\
03480907653298897787961914572696898104038950414825988287448505048592\
05144262910595163720773312982518742169389816360739828762848649952698\
64100672670145860396668179035866834521615662700585541515649808568394\
64247851152057656246817363760607554283640163551747485235623250368893\
59363668121179466076984018601298788756731999401133741199165543508622\
79708494742452791709523044792333626881924753532595835228644924685488\
72193991943894104751743263731229820556224879150787855663360179149000\
32884524053659243398030586157621360367296657526644837027439207355479\
83289140434933567244069980510402087693018842718257511248154794038144\
78391236392330040642985155539780297565847468325190848135255012426914\
50366142434712244246013219678764890742344197828954260080246160475962\
60648048122044421993438783441130360868023021677431466661517835513337\
43081608226745324134711831713743953696094809499784135842358771187768\
06215624015517693257903007860539604917488846869862382354872712398873\
37349902941133365262608240726545894182035805776041565550265889913623\
69946653726463042509536950280014691673096489058621727832355849119874\
03992604676987699141617731785997792944524637148064473260282341488109\
27115764188746636740851415181439013291359702531306518017707457529199\
05566885210459474636909084922283157370478247089238226975682693966650\
06147709477827845772094951056381773092614006352208745398145478770209\
96170460068868382819270175793723008955559460146800547537082832825493\
99625416887203018517357980700332348608070879574311115280067442197236\
57947076947358929601070074756428178297491147216359172645328532270364\
07701793274203075141458771221185434015470515479319772651784042833067\
40328585213941515324150175759173021012217539944775353783678691208625\
45571071250104084459947563509283404647380593783271675344526292126190\
20892978662957357305795564025819114637987486848364572748373159397481\
67983790375765514260964273428565162713527722931663764636862559006733\
18441223843455953369116616505454742297253792495629557830809212291708\
92776786244578805219453034513652429144584301419328709361587650084516\
85217271882306376593194527709047125470945577570641106244394861100444\
46699505251210230966092549870883478014458407740198186556898302634068\
17347851941038344723477630314883752463184314136144842940691397834831\
96210904867916108549572261635912824827117366179287084164963039909610\
30312381005773278523624132891721089803025594397585379215622009137837\
55853287257766368108414253348939728656191453040873676286460524549107\
56569098231189257510652155357880994569396472419433792439872506195821\
34846783115223689102172446567333098868955619171926478873140327260214\
86782595843011752237992694850681200425992552313399578651785343158027\
57026503127509861625333377332329793682188694638293353348770978710930\
74044940536406340565602472334813002603691735199722087966808806649380\
99422838016465612426804472669013656105644850894712405932598624527508\
08359878555463754730249738232316945718465325636584265550131819136118\
41310584405384439005813734051618526129860119973876141025189566214644\
52228564223771898298074603169446259130900063066422874367914547971340\
73801512396087882566104765115094769272965145753873383446688067693993\
28754921824545466457520429031050518257098332323875204848020758348378\
20577167152862649411601574351315230578680410553330816258405372129742\
00598298500014291866585118367636171826310568468507461033966690011348\
05713249053794082429493656231835015102215065585912978101065376696950\
10626078218835603408472679685091912731656968046219979343765159660075\
45415535934664111980966806907314488613781077527972958935042739236292\
78579476439510404121508732558705698597241382670572458599595920970849\
20581160030603288933684320848985573924544145621889904594947597375095\
33925048931314251374141699402210115883472156576693320208903826415172\
66541411066097911686705324936634159920544556249272273123821554841242\
03120679586016475291717930627473393049703577237735172768900074231354\
70561877563935766044825295555599785788153236598676149801965618760779\
76351216489792996167652558515497283076491374818180637688244510534332\
10458056123006930614235568319397972707986870021815844516666018824874\
23598873183527230006673808067525168021848312074736571931827804979813\
01581668243770529983378334688977885111411209396488070202879824584953\
80548337204510015557240338153696654430730355068772378951156114924159\
30031430362516158229495588913114873886377433369250381741844606805090\
85775628142050569277076463954141928489016197039398196434550049425359\
84258463227242027515803207951530628459189669531330800906754854773087\
58983664933859765026526964954658812890928171992227245536837839999646\
84330289750198570585843076270608761914103577905713062516137739022472\
16579130177965140305067468588711553079650991330151145095970828869290\
44440625194668469267773021754684349916736311635439660285363298427400\
77708933801858984299785402020995857682542822824391073973951375418769\
60353950597570301298866118794663441275260796611069401577557022446880\
33174473476947011810033064171608052382982030069327933547194099202828\
68186554987174120101557965751381243319394660359954322575422847900570\
15974517607750456866661988911332392045602992993693283817053366708764\
99732612514103578789667080338624037936171161637217335807215907756701\
23673979719752467333169561999626691906409810080646922953871834903403\
91367513435873060199172834357463170521776453618319335491043959634255\
56339158242576926290554252854740874445036596516025881955655006583111\
74984816667177344089832892273859566229062196655019823158731581411223\
06213247355402252599496335440936716470104267728191504329182023036254\
32789325733877499968439349628933663359543605816951458764339987365188\
98352984048534486979875696946419386128071414036087201207433569280428\
81690446442200082079554231864968874496147213690097198194456975437335\
10617914831720236932458466997557071296271464054697532888922837332357\
21804068102190040278040361506346162896979372922815415223357494843765\
65413386214283525697188767487963050894612749190085532854919411992224\
30862280862996415466860955096887799988135141549022084779153972104031\
80866244940919994442381652396052026761553557857248488051128388392664\
56677606501863504410411052302548209446829869568278573321564648692909\
14181431489692134969518459075395094318394393233547245982152507540486\
91920774187250802073370190581059256107842581660883624965856311250916\
93518554760262575265891603328945898884480872641089949884602272932305\
61044089502923157754752700135626660872047071090432788245083093603361\
02592726988503418321721628904144812991932523941086591502572335040179\
55590471071029676160965856982497843416936491372279233127201324546518\
66279670221181316659112432254819170381814366390754615847240991648427\
64758442661619828316405162221994038733706755021114881835360458013215\
32635262312117495506409684030818642041184246764724729592972500305745\
05017946926292411541286196112618645525038029911657949570827649685452\
13021179299298195698461812494905197676300026072476795431507759893814\
96656917667523624856302961795930154911891228396083107577800416536577\
89173873578576366368167459691960639195550123657223516969726980715790\
77504258960524770408595293650722307914886071222176192427418181668754\
88127419358554340269112775579159478151649793189104378983294026086686\
86649775280618810430808805831642700873253716073644841258448272073782\
85707142248254800884653563696984971684679033133957301356385365929861\
20297611041905043500852488954989103936029172409412654623382595421774\
50777413793310324324843031569648736193040668355311606861831656295352\
00797831872321412709756558511232037034896784288941329471667231564954\
11425652090487426345699729135573431669304806547195014528004234310430\
55667737724831604922917353808087259554360729643282172555217706753266\
16603201969039954014898421055037855463090986955805796986106688131974\
21617023056655986559945704479238207830079774673326947192884438049105\
26420221817949958996267092825223669789912855266365987966786275626044\
77594647131429526710814020160491104686643652914607476995841762341080\
91376345054234219461499150201904387299458224759849094718447153363680\
11828822893347669997802416207651313067328683448633787994257191412651\
22777644318260759586804312142119271892259689943576110626975404190432\
27634174970504181642138198321244635697790287600829553787034150030532\
57478337037247265602817893429181806721240242744188741247302930120065\
45842937545999016116475561199534262170121563113659180943083565389915\
65959033352942787629415509657076879874020509725414491072965075714188\
28846016617781109408158255548066194648820724750178062801433619601253\
10822448938797784823620215252216210411773442441355924497859892960255\
37356843752623335997167972949272664229800226406892621411564561120854\
62146874584790794133529074676590228257415983041008918903684063956105\
20861119395764734650860369134722748473398219674839818689679967543255\
95547087069738793739244042798063760868967587281165925500208278263202\
16760808485435821443059446745545953337252998262627042789367141756304\
24575638290341215752510801552400739044210851226165624811427144123588\
91099844056649310631875757930022982953883400934372808247933100392416\
24021395941784858767595523963682981400643452933542560951632621764001\
39440628164702260002204395783042104483381111528445578738499036500805\
14558942664938153721188539639273256722184896596739690974295444698771\
59675540619818444782852504977033651574197479743468488394387770169292\
14680675777832866372728304319217272583849437756726235155597755258029\
20294196132008068093872725625852291850655764692814646573811211468268\
35128122946331988946764662718340824552718537833690496646732133890307\
18907433882971552156117234922601850743836847799721091163773052479637\
55524997949070471770548499663556750140258336723154044818658297949278\
77132017870181656705634848593020194253874128269428883385593706681156\
91879625070329763347255879890677227736741807937341602541683853482419\
35106933015939687406185521856898928121210684158951759809726805230193\
88058002616746119154295860258746149347636289287582515843092393522341\
91234787015161646589869361243515568878308278834821264537826584206120\
63650173039768084118856826387523641332158903458036303242555758410771\
76250681988049967519862937424993921392832848279772076384395014314916\
38770457636308307148573277281180539256045150779930886283968794818474\
02517713869170907322073594463205823652438689162382231170141742626850\
82629976625236907175791293254414337098668357964035645111766111383014\
12487960041583493386171676319913047357683903035240312291737066061165\
56871264916109870697105053293729873114693037290651595435136208582565\
14643616629655705080786596459170045204799541907661515642072240505072\
11184420421699249367151103912608434509184439030930076149753956586872\
56453899912149317693135086276725121519904124366831183087258379040767\
64688838403016989596152630008209942522242701139041660687775470528767\
56471668050914245834932825810362575341500552514460822332297841025116\
94239295130284601960728068547388930907385661534588915230238454687199\
51677727002106722389046805712478599270089103660722788450906927727528\
01246471687328905183079178539146604627743607096829669355360342585887\
91260166970327980849619812329383897695112439030234227747943757933535\
14506866881776098276594933460402143811687341625199659887053673341533\
18906804731322611113618023496987137931210383776737253399977786005552\
92018925739923796516142316087971814805526900871886504491729348761884\
61056381031614260825983288537739697936946872848879291769543903846140\
20185052461893704128109391369358356532684181637414896008288957487570\
80542765100897534347114258468900946226469556199420013651604865238236\
74280633395582143470541286699872835239811434244915587762711822535184\
38462901082826265400410456229585342127787772323156408442276874451082\
76518304598150919814844488218797999701687901859414354615793415869982\
63843263736634411494904812081538825059040632845811125028876098719338\
77660390119037297609026146435533397941400250704462425644252746634198\
89800313536183195168720375195219327265574030925522789529378805169247\
53623324906466915574608730603933053099486603782733879251778216115118\
11632743245426015142904960080677221616056005249912596299881634517929\
31538703789302749785811355088857299729417023679235883935303808512942\
60617286652385286788761682057598171159313536361302512724789143506274\
79249442207282329247466268957408400411642363869897860472531319707103\
58358317396513269161713174747896214932122218130111100003342109111667\
10823691489731645844852706645267335155432355751083807679674130944660\
39815831276125494586941750183094144403959750972168851762719636888934\
02692487502778308753768261640085375407548473100221750641538802920103\
68475971545547757516127222042591900371439999785765380320157688202022\
09722070074294499849981941064569653006595538917831617491429217058012\
60332775666432216278566478471300381497277182576776411314075241736570\
40993263429984045901656554703442813360332396849151471632631910916593\
90203683835051125705227084965974465545799169563674987701591266039109\
38499679321291749042989933975105061988404670603841082178053227437549\
19594097592338575689845361298786239931321674023727316770699592003846\
17430452426656744777501158607516538698530187837020121409829831657396\
82172558315757825928690240817818412603645268704187439303243549011767\
93859131491712218060241685913411266431001820236910654527708402129798\
34184522889199826292110175680829103934926492854889300069392856974536\
40896331144813853154112323083536587565236477547346760651620758367868\
51537101869625020546595097272705204756293602987230058521617713931793\
88831209112424734174099838193699267696886993616902004594642299853335\
00445765276487893280171053120286380690225180392547647789267231220849\
83452253499324438543206419628890693521795805368881609722972252773744\
28233932434209681576807767267356890734678981903773246942947327253958\
78567802425959906535410777678344771472361783330010534891576299474274\
88601139471774218990255135009752760586976356850271744773417917574065\
96572743949254884958301659783346937827612332518664598118207572172027\
62557511710250801142611761583366490316021554219333795496026411561362\
32209731241784050726959350311067121495174726139018115099714126470623\
83375736956223521419189296434044026362221989604475510248630125626254\
43120030217534996829966958220240623756360413780554853947034754866831\
78269129917068829885590212245630689995143007414374863948131022341363\
36862129241020811989343972569915137632543850058765480064686131191008\
63378837453026459445326104767337124140794133827802123198968516515678\
99625161820282504902275600676675936047205021495402852631544590126752\
23643918258982910633443227706817439615891934483372263604100593933372\
47937633185247689735216490565063162842873447669856375417859920025948\
86174457454120195063204508935524359553827358773580060453288227166344\
75269248422338479455722696117627931445585763920244338647780087261486\
90374173302867795954817919287166636123457715679058406748774383117480\
49020625427212800291139441673771797529873191875912161900323840980375\
58788868503252787022027122061136156319068962261873797485415847026850\
53779294041691123812652110788925882191248549180336885274164711120610\
08179461232455475118778954125965742547851238378371840204081410509201\
13518369050013444592482990428519177356080780826272755600555785667855\
05182877243716754580612898940764092730077777367235223638655294903764\
38237458145331631098702262022306631958221940244590842601086791195853\
53238897709934038376411887480548080019768981786139038196117616812593\
02753511961407624907359763876329260212335965097611278701571741610677\
37169002709076701946811431035995294139026018115582278540801651372212\
95182793279036436343290056178805697764010199345733448648193698834115\
03288247135799903495390023446413622815378807450853578488581047581631\
87512187120493425383007229176007086939558751591756568565380650159892\
63292726886684492975810224521879472036247550078330755918665559830224\
89792675053746958826663469655227581754156807667040371216431773662066\
31908575685868960203428281072060169085062769600143663063526643475665\
79714210762138718523743608252010180843233013344836098244648692813474\
17799340035660777411059137184636734651228477514628507295285751497934\
98977363621442931904682029661299978734586516626722250853270155735194\
49637491757457342394208254571006596996978185755746961852978357142128\
16861378723921795661591165226803642355485222914212704279470170093405\
63763975989123648772758418876074363106164101868633877866222738444222\
49952118711715239951992361360391762697868776166048109031642935007891\
13361312807440929108519383870191952961089195500183123312422688447487\
17617032902031929650689345542296907137964945682394822084154952751304\
87943849087560945821174852609610476184195026434603264970048313739355\
23326319813720846433927065995725619490060297201540394683036671668902\
82983165929360933495473331722674937952109572339849597430573219386013\
17597678504590917448840730351361017981522964111026663302106376913180\
82965363838013353870500113704238571296192190598378726871490224463274\
57985372557950809408674877498366182024806256606843522069539706522556\
79844261294704948697694415341776382208821703170143291411748852780147\
34430043988721126017511330780847534182997702356634746797239762222439\
51364796713325145254325780860677778153929849536803098548818366711648\
11748259616292285205637601189014680147228604457607441314577393139154\
84988574865116771348142034310094082531396180744248637237296690011097\
34748534271834417058050289271415279852049775991241294247405523166291\
79994165161630830634931111759637125770253567037583484374610282019381\
12683908508149959941020464337842138738002314180545255064332636623547\
77852034701548602523493835095533063977720569030960896083032169139200\
10050607304521977384896743183969100636238127928637522280107406603490\
99420859633424435451563007272176035710481843941708533686317193331766\
63906342742376155096162582594656220402988052296529751671869701819957\
17216488128192384495960120113989710968113876204113733558439377913203\
22175052303570127426639006744859869832445770400793255333254282348775\
23668729164129866493304425976631705495066136264587066377986650894284\
72939011382484978553265956947394021162658806845657448252970973450178\
04556958347253522416221979324219981887256677753746995047708887768071\
38308086766321039624145608849691775319771617293348174230360066160838\
04692031269190636939349831043800566881204327133453855036306135912699\
13163119942505635420563593054468486863156022899830066448228809934688\
26939650338403344843299734612618787308675583276576422651336359903303\
73293223373688417810677546042292707304120412153570919184221505481192\
02710353079197514057500628147035435059183667085995176046368971217522\
13507337105394754885637556635688743349916402219106558621947878127542\
58912055022627998602678140598983114738768808273302575479483533879398\
63491366418836978863368904825489027437553113316234414136059869552200\
01082726319165089996220213608007577676339212662736706791549027822515\
23943419247324991880724227692556454579217580552797211862349559481236\
09510950678667160678750733551686446361509766630536059711149984345399\
64924649345091804576866933710643849219574267778770129727456637810393\
66220498759089106308327801281615783466850121728828804700396007955607\
21379108544287239844142382446481370712238458486585377971980116108710\
60293883518795980217594014121158675507215265727221325405765018791206\
40114986117533271763498715634526567536693454021468905651024254263572\
76190997232330277179721780106629940483095579218091900042211052049983\
14493033275177056182299098315323484805097969523427540860895102748854\
52150392435646400616175061701823684051974548879917324134831022376564\
96519458050199430630924391485077064428929476579425908266071712946988\
54174401413543266312701392209211096299114039166692902547627087219123\
88429105808382169837074266764709232326693966569193438623300433159357\
77815530588172375914087840288601576370137573063194447121398002895191\
51717878510351885134386061428051550106472334405002702410581968054059\
56044244724340291476018389893282277124251625471918239900390306137233\
35222542642176783514948786835058619396653409293033952979866675570956\
76835348595910140860877615078863277487569254935962242472872446898195\
12172147309669364055434161518460218141826920002660515603049321619123\
78795418076050722205217557896138465885030927745739328064257812260853\
55669770455406986255248234107073654417303453733630003364978180031345\
51831906421269573428923103507364026233761693206416308471760715645879\
43433406199006370419351551188710881518689329516073682947948145207167\
61328332746958237616166295024759180521405846719365766103346500297351\
17441915489850010101098217786855012258185704269641553661329395271911\
23786914166551847896270418468188074871695618372622819022847236517979\
39078033136850512674138868263281605473071310283235874420701031447543\
10276715970569962530307017009217798684074590957276472353502440651432\
21920493107575718521808454030732862961128227187584547602663959585313\
02896082943909326161205765507880230813494103797962341945107747149379\
68667775065162659928937820470050778116248701580482546759247383022620\
77621491177661247843603907276393545725699473180876071199744337300477\
26983215229790183485846224244443767967513184476876319246817201943687\
79206258965417709569600393402086348652704546263170844362745194623444\
13704687209713699701556979682585707116857507665195733543493291905403\
37045050555568908737607436045326948056597894780645686003906599500405\
19927589800495861766909633515843898330643375930462637728281393195250\
27951391347278215788825008117245919463058459946121576746655154191704\
83622209156162948831795026906657569547591774519101121976720411413849\
88776463728591152420385905234559450707898490670440278558484778338376\
73703829963881613625587653244619837140256088583473658182237235060037\
32889722797444631179373163207709388635896740840276265375594941419707\
34556118533231020609954808714390629266430879312141980621510082577939\
63838191176767895378678015521111322662645627694687876883705236228185\
28205553910342666239205776460752090661517027078944863072961969152558\
13354897268350162000057673114668666102041220156963952467524520893093\
52336843576257194217415856880263916073715197444361411779801477085434\
48840883318004208089631523985062823070850453326948503137671209000293\
29248078560127981987603018462332169440004175702020542440679528673846\
18794222332302851755736294340711124959055309333205765770931856376100\
01667008861204881145052346999220178823348979512029452419170589148952\
56240719782884932109648185370747360158301559696451856635623873459374\
88526200231635904438796479935905497798491357453972631129852698517067\
78186253525314758719519810270982654998380224720039404535302158315775\
99505871818778975876440951787717697621893788740643730799561375521701\
20749758735541659496780286279761125717663758926811264437244743681086\
94551627357608267857642279988809273969922877395473300571954117657505\
43622727439013433108683975161347709328594757533199947822759654652425\
99482452414540487004160525502506255616289003242312480842944474727986\
75313162622204586884038974906429943707397598632113418994104506481830\
50754566218833313413165340723914785142480697315867579366408082986138\
56028063124026413697320812732768112258313889520489598602857731225411\
32525793071961979793074831829353043256366590794034534197198016143609\
79372596787112036314812057604937194898111623852993773889435790850057\
51665294433521302029610784480445947014816198378709951594796874988282\
16211906855849459450748629729023424058736996425639976128079470794847\
21736138029701208203130638142221022466627737672752834590810252880154\
66510172646524581508345770960212623899001733666220800964800665832524\
81197094779212620798781066080024857018455501602873300415874487116152\
50186760592636723208349392942453908272837941290013279096420421567777\
07486424865993473557485080074754685743478339069499597608515483113959\
29662224490856769156913719263778712271822598161808928624360457219996\
73524579126075049113462780754210027435213713642188622744343310014615\
06716978205341071630586236430029075761911215939096108545778606361921\
81191418349733474951359225696201278753566998258120405699880835760728\
91472375366835010642143791084185732357063004956409420853609397661048\
19474241237730190918644436256797863127521819064198350734925170456558\
13038161282520774025353153917331879876697141032200397586000821183909\
81719246181727672564084132703609852679029862546774415481818496583236\
09212791110534140715304011769774299707712270364464989553758004787683\
87890711171804272543580634754339610009826294935051898615768401279541\
28554725134870862830551298334535864105036870857206020630393922795439\
80860261696426197221381903497273701359467396332601502103728736269557\
75431484139677509275810102192831893292965701092810914945225360505037\
35531492971801211253761918050886922809580942147297471338362939565531\
76410044426348920874045979385093094543501398915530714789960595066124\
24444842480742372785910782947955635791304112373769547589944438728266\
22403998010879946136289331546511063819776237734489738941470085826217\
52969917093684134448425045002810164107868358886777320720746381526199\
89706028388320364196190314390677878041928741355284717743028693337870\
14678512627477469175601755509291179380989024782134815134120481218784\
18095122034541065704286770102961618450910313355427697943708014173106\
09020051776592500727949428929048440275565984330251574812747922300540\
10893050166330449799399263805761634920181479353388627729277868874677\
68986738203975711772796099579204438314256651700037880743778688152494\
17995897255197659354689880422324657364172664268415520110072742716691\
06024156878867253729568609704978831678352794184711320193431476740776\
19341906506754271299431337347962184147407478358217345690962348306012\
88556063056990104883703261122442038842479725058626570173290967324505\
59744324404793058305818903196099781304998958728669015475229236234106\
18254087424889078030649102744319793795491601482586854129458494918557\
15228105532225161914682897647864135538380282953553062998025465675032\
48740638088452590746080068397063649311539886880775696012712765062458\
38306643216672049507411799568212341464428335940372242711073715321302\
59679343164216511795049482511857742003787533311819845875146669382687\
40737687959349450565353587697211317669650729315774696041944450461121\
93475817526033816795810470003762362361974684370553918098370851444217\
83381534149857957121030516467580958950860889957129864868202436520584\
35749011925360693744494458848421316284980902414135387053515708416399\
40952169147893351027930277823901585301695374455489709708729802567482\
24467060339281166772872678121256976169821974584174855682938585425030\
47953096011422644985641941509041426828246514453652541046784579337080\
38476058906095826295335686483340615849441352669118173198796321187178\
08359620702419811467788399758634291183646058707522508915032282975645\
71518511453840674704516672886738001817858770180406414127731369897686\
97767843735838262444985001111555185095559295453284431872944321988769\
23251116676779017559752181973848824349519789192072978740718039982534\
07848376187240450090903100078714108132038001769945242491195875720878\
10542324678980519234779482626810626603192727915721702400726518928222\
64183147350521041300875526778821720044225919725587224551015641870206\
56138822213573245410226633390963093160775129255319654183030807271464\
88357726116948815734577774892083840601013237425110617930793251947504\
99253797078412699557405581287412168734996499722799156390917156650485\
85032464857326937480587103620365379770825261803912123684437188138603\
01395928212277244870795207062486838543530700903297914816284131396249\
53828255321048318692548480311935847805550417210099817804363655315373\
68513074162418453818434015535220645427369284444341964768479795691132\
22685112710706324560830147638839452981843138075689456856061244772275\
46083151612323305429979752071834737660976930170695898674548281753160\
77504228409587539057107850660392359623135291472512979064205819348842\
70846763099444222981611590768130713764306358573723203895651492372130\
67897959132877174522504364519305046773320613409145750556147854484786\
79221443532946258526130458382569950783705013840218239463274802589043\
32047366133907275889736869058265407191681761897728453547263633426726\
93722840808838759090662400629125210288367181410892504802422928730071\
55607112790165447779527757589159053777178067501163395825255522408298\
47839621025106809675356033035166392167954565259961218427457044624808\
60589560049344195034132762529834658968696812289611284818674397951110\
14864897803036573814428547945451192599852038360030904103610391217808\
74941777505396938405543934580002542986191794590736646180900788238591\
81715348739684236456090985413777212475006681158462966034147968949583\
95907686851964153675749456758254113455144962648258709956588907619253\
86243288860316218591032346035926685756022165583499011720631405244017\
28597896906450233536112601366735995088501614794538513923196042511544\
19987740253420399827538075532751979645782746419291604410805672407669\
75811463760688442349876030943825232988525052460193985265330229887862\
06968485749549198449369446387108606684263825373770833793395543555423\
97943353104477556258175566935246656297536271730198657305159384757722\
00920277138689640956485084415470341244516758593822518366021357980513\
89960438318951008032554890902588345523258568852386469081152239116384\
93837411531167768293895163058463581855308718902581943043909493721963\
15936055171088290674357016933830347229924418903787862756017045645129\
81458348618953300131168657129015574441159960117890229414592773474815\
29024223146451289749063167774796595301173178032395923506808012718446\
80173561578938506728613354312789341175940298335665412567927177218031\
32584847701131483573429024837778241415943674163122555617994964412112\
39408094282986342288788939120899502511083373953054458660049337382590\
75904335433546743910072260743011106593075722460118518836164693425743\
95618981017876993753484272061048907936699400142949904016446457704603\
44801753186232126097484000737001609059858626391460851450411836996358\
65708840259882900063142090673523684296667835095882516567033144529095\
53459904476688864668445932604723386547421955160862012776848674549586\
87345319095163036151964442210259029835827511250463845006779575021817\
70724373755320536624682310881487396951207836981166276856990720407040\
49301186317225843833276206780948006987721883489978093890091845466657\
97048246365621129262904523695322898773672533656025043410027913611594\
92970609029047226081094537006098429638915779412714163397001628978244\
81664452412678820641965715784940830580622688258396876418399971350779\
26061697682994034672483098065656905356435370993509519531973653427084\
81120917319262331742449571235832119649804478575225004226855780163636\
69944281998804066465685330355104325433472595466836723282000274359770\
47002375091835931364033352636674741732550883445936259148114683516795\
11932493131594274224327893569608507669348538658820436787403886017362\
46911654578882902285228278733452691411819710200160523025521666841595\
35377570963758016875241326495642770408884080378632461409483241767414\
20950646906340782168512534450595146581429414838807261033348283910880\
58824469221466418703729953561550949713554128338771532241659248284261\
37599424023942692103929843622859339715007626526018032042665502169993\
33482254373221723072909726541132133027803620299904753542000444428504\
02384559543391635031166020798460390916713079727511819323866764240589\
86724030439553505773924230436583900040965350693697359825781096144647\
83644319613905592880162690618507275418745794589472329737829704199922\
69101504636183474382210423849864473605218842630478113117025733115513\
35399269940355786068593825188328608049944542208239651635448666040133\
41290231479308242496748385240090764121698854350627726491317417628544\
45185268100074726198671882781531219677510318347114431783702431825973\
84523913107560183388007646258649788734224456384855578791741838619337\
21049916238698683078272305039751780678328145904051698194601578500795\
94720580578165859328588838401983388637646123365628272841971642756613\
73700750664012229059881248983565718362511767887364291550166718766572\
07134546660201293707812894054306260038739938667915832391577638258085\
93105733850090210519994507170453980923131147706777551421195644514408\
93471576509631033199380644294477776814614925798652339393448181791875\
05706726461678371072951163527391859456046183797300938090839939668483\
00221893469250238737462170104595726372148167032581875199700278493857\
62724886313373171982524513240123220751606721133359564951141281444745\
10627712031645872099537696778417610561439865005308598537924659915669\
18708314772068561930645233077090503786656918719207705278516113416891\
41270426010308295720769310572334560082312142093208879331461635677230\
51356541326391570761873346467289031517670456266915855779033677799469\
00519066055893609920701663761425717995396996825312139194066163356199\
56883951310778256855363125930123140515727846931852397148175748654874\
76671023779514512809913415223303317259084239077300563295062803297338\
37633726830615293555503351734984090243738521559632291365581076761863\
25125266136630530763072484572858100161733073234957461257417179402205\
02839939729434992989735664349002652580111178795399485864133005513154\
44440636457866212174324038390782593986765324531328905546607894358773\
79537832252580379929568120745913856039025359432022540477093243219437\
21193066391215628684694673593524268875099606451212666634790229088394\
48741315299016080531372184294241347575735750699326482883408777175232\
72552839229619196308567211140181867165865393104499794645258290959749\
81404688646607143375570300034285760483734528281148650642399819417220\
89757967061396645436536438867165767119487251969680437724293141711886\
12711625887000805648280448506442595890072030852071005557053054170340\
17867884178177422201835679034365966897182215553650202320539110964948\
22639504212630346895455462370631034219560108109442478202259615765810\
26671802024127397590889872370407867721260758610113468808238096963515\
65140964170772071462697771903721989199088946339281704854726647499248\
12213693606631512923061285027127948789624065986568183718428483846783\
25800109936565345491906193605065802058134388538743540110904679391297\
41999962673335106466137132404902744695188568826533826107801799274218\
98962779135858066288712644680580593381290483228298187587105297819028\
98705862145964418974205461838366169340260200289289123518655742214796\
54334582883388858446936949464882536266958371222181532815033306592838\
06269749058657171384041312357715378865687175607843898055066242889708\
87757342942669192818087428814400290956801003205790088518099036221704\
38179935392063188451507984438061959649439576349669589266595399808686\
13185568992643585879973547784086210347171111670461392177295242179444\
08330969873323970681416808105689952368447945255924322674684204193926\
89393856099343483081554382792067479714519458179838197790585253806293\
93491111058417501775424453555429532709754029202388709214139994805879\
45757197828434279851008008511797355139547432790751506386400630046442\
40464833701922942789691397717416460026142727705581959617824634509565\
02588362418534699516156644465986314993185336054292492330842607734703\
58244017820469820685176578187710796379338018044009703365473415559354\
94916845849251281615888622509739757123908867305504696219432640470000\
69128325688564044507609338592615639786164966421602220301116567551578\
35823205492073602438420810474396286241235565658966158245181691360869\
88173276977813510731350256056931755766561477578780954375758506307002\
92768208599435063446782610450254971655399818278992801538186802572543\
05532972028137335848425884420833670744220730798288694233131180117147\
96732215529964803216082752281037155918649848490880987361901868122797\
45940661283256774241146257706989026179224995305633744655788253758863\
27518037200363587035967973850637550636817433926550173891135897234772\
32771337241034092581598820699799152589231559942177443917588019749128\
40224959944158593719892580757680293836888288093583893739132988745970\
49369467645904942237424268870241792095308384637052184163700999360132\
37630041000686623076914569957521094315375740887712493032005278521585\
91355191183635744256731513921833812620300787934807682352897293504452\
02377766793691114681079448604170529521929098809147477455153620008799\
25146743391623354328292107396003014920521663006545071047979688881011\
82987744430593678216785938816891538407132364526727634196150673017813\
11583981878813958591735493668986157135651089053737706149093714564057\
74627487214069002120540258493024886067639274725935200868559504070337\
54337589361861874620470946669387274997632786869857181598619500991190\
37133610642395926009677845811452251896300391082506471975149373951886\
35391931036279942235464489775682153071095250712149407205548907278498\
36369758785154839682420877221306105973915064163181557668903153522830\
99232324842270147588618106962618371953451168733131144454384565163802\
96800147165846592090296144385357650349318259783406896576389266179805\
02541409749648734054986982307172388443025929860232164926917959733581\
43845087848116086271504982379129988033676067884101451372689290752270\
57968536308076621892953855791152303820371476634286705850142713659771\
80315847964848385789554613011695151075584570705835693933043511386550\
16400171810403346170348852727890060309756373662304160633139942790800\
08537377351530067015508771513392662376723399452757083014910124257178\
16757866760459881769542617008422218792011996887550506773089730448130\
46459353685391204883376790523284160857248504395557528547379645036496\
40117722800524388797321183038896064511898062014183268982566095307889\
29458648646098567061673961114206938921990605256743750371538409657867\
66215371249323454496804679517790081214094365770617645274698829477953\
38832993041859081006736316297877219115058776024983126348658354664590\
88060766793520513875187058584122307493293773691349736949700982897263\
56458338535609695879971511086987954586918940355908361622625845541085\
59353778351607833101477160164075406093114516193336670744678180591549\
50218185380611518487778459203647061356085806216375922686582343989739\
11654317498806783413456437806443243141154985305633591678317078127592\
70692766753962196095461313221236655418925894163995295567866101174529\
83163606786028375032614173449655200505676695008670379079915911385549\
62564862032857321764852125908446021656252911908628230982329409639189\
37744056857155917046607281907254678638466251193856922497187930947790\
59508440409475011594474618501159288568969695387292677188800095786434\
77383536281221000310512980741477717082311841994273639349774552708045\
93115512820536995352668155024714986828485364820651669330121913380833\
32877814703415641880526681019207254247731662290255389710124566557419\
67619018499353144374943610589085398941288084764362368939266701940148\
44687566482020818511825073146186798213080550559852043907941206992873\
64696223718556990166034871781932425923748422901945168089144729436737\
23965703289791471173720488798384669980680014447168158212488229265941\
91704505625996237140388465209061226841418004756155943248510264785276\
07363579292648082761455395841542290624406274824934426027602808038365\
53107168260307917382552739498829456963984167490203141226740896297197\
75359739806023432907521526608333467315832334702200562532987759940489\
21938596195208335009258351897776370598563740154599487692374920459634\
97185692414245323388444874548307354873575359281623033173081630781992\
12465588940403163390984132539497721024093038372086985730673545731616\
26645853273048778806523361695870806802344374016526660026713566510928\
11236033838585906549324914728836807429473676902684142223184452681163\
12955914680915201562982938653240260963459714250984203552496535623463\
38610985059162645500319776951613698621467038109615191373376631977220\
39479145280111008840433322971471342197048265446223431989848543386341\
70949638160484785366052285956546940966147408934976564159743517127125\
51543348953888309671228166875698033853485707473361408642002858549621\
40217527494357894016988227365361102675346632149797022515415250543700\
62042722060990363781471822686952589214399606766634255148371809325563\
65512507724061356730869055652150118291264991261477942895373633926664\
22217046628247699505458683055326984636827309919467120766152557930211\
37892299926273423024829611144285460363362902983219215384107051406507\
96336533176552698716280025343492884436809840187662244917259364232494\
41036771651364347287729387668205173489411730297895507789711667339862\
92921595717031386352302872926000459104046680543556259354530617878693\
69995789703229907775867050063378036477579143723274200534312293530819\
06443109561709187824155406129958369130417198123120139763215941580323\
52329193394653651500129412152300212317086107609425171288759330790815\
55594602393781790912947830737885233407122033092828606641459301002987\
21810613359186229763897768295893971256950065362248705773188017277788\
86073573878959630952939763160597314145904811870065772595182423756150\
26036478252842800878135219844655424744624436244791670864354967366641\
79290169133290745799458082349963385508124553983691313342857191556630\
65555216415525972625856426893923247031950199663178125315131441007664\
98058944264568363671297314116596867510248735363250172272021838301325\
02224859679281959257572467262052012603141714884826316239544743044818\
26762523138878591797124886091757613462488516699440575112994120714361\
10231615938078397825178673589470764228959082840230070814851168944981\
74589513221324896304366931060185314245746189097423275216868184875677\
41846807594713243501384310348574080569315336043211885306076370023038\
68474839294586879728687759551170712757732038442265108298771675012609\
98164580598756776318775353595934440717177702535739116140920594583931\
52706114427035732881427396242773072139191680994069969849506826323790\
66447568673664771507109845502810001947860859933767101575542060521642\
69879742703111875904255160245316989036915454206084599409054880985878\
65450627861129300480126470418575418373880792713332980461232271291499\
09270823625268188051061687457641854115210682622315103491225125808570\
47802187895308610874206395673054828177495634051923635725965603080292\
10633805288170847052200889290768018714647282996388617284509344533881\
59050532796536595920024916539305237674145795536540847374119878715631\
98167952592955980968124911795931105127329840014471730454831409044424\
02529334301540210165252371754704075328977198031750482729296902442655\
05167892888730848884020872153763872322640774265378136655147562035296\
19509567294372765073190554776294780977382894224272679241929783601000\
90452517352856360189217506957557300966023455889679410773495646403304\
19182901826069100197944789500838998878281462421100751934331962026330\
67430379371307694649104182977929261660821807029687178123627324512943\
82923936254794834140345817443335882002771089955787215004246114674747\
35447088250139744942173355870708283810028752381229451453393208860394\
03794979409818617485036210576471358794831588994002435448820166956933\
77420267023658680126900130974288459609400733914193207950458123628730\
37727230733880905531162465419699901973689213324658241653347658498185\
49264211310891610055979832580175002439597509371817565089330618329710\
59880188314419388031319794091957232287784982850558119116767793634754\
05036606997719813619059447644304968270373566564030762688387334356891\
90775688842772631989045727646672170622708448664597653168793279821345\
02137605713921253352880791005466853402160652910545856966220779037123\
12374624376651643790375878299619369140330099966701993625698568959453\
77668532305908804360678474428278934680334201960612461928700479405730\
09714187180018389989348659431592461214811964780159270537891572560744\
24304409936855184234847839798666063726074336811125743943188002075437\
17067790052832130974038217228847152016072558528530732304899619432879\
48505417163768444504096499881168376627671589063940334681267076186203\
88038267048981073602870675157385701776268537879219979386739897431300\
90746058270973698059352046350665195429434554106540758110827212758945\
17885398967920853603981870888418925941534537939648481616999105478757\
96456117364804375797983556246863502571629834752431712241622478176440\
15659859720873306584264155270151378315575641960483299626489649460388\
15455751951576089546881956547541070168357062128350244229515330673659\
71579984868149805760417210210435929260990182165757749414783609608295\
81226511857050325317646752457534199979419278912537293600640239839136\
85357645144529109660503880940580161177757819465069540529421536747827\
47865494295244340284483289407345168827455452729417613054003386882001\
90933368676318906448600120808564401549327131941085776865463453608082\
95946083577544980413327635048823071784878981792158590318222596197833\
36756993256975287522389630411025913240165795088773372510651673966911\
15068844616491990939145762848293550346818679359246244146397512508889\
58764295566637904819339947129262284388407991319577625188879130246744\
20359194988117420681435320583007051229015522272309455948743661443553\
03020457298206360572269448940666870495254540848388833249766884497853\
09775137125454376310613108337391933003461665053246334235730345325931\
93103734405993666557182099376177180286211544658726103791513375176695\
66313029133504045029445865515296792398537129869151555182700058750056\
72928987647613945509656450319999990820127468734139236030774099662480\
07252882619905788306743755777445725687564847608476289679878194543600\
63286163503033065445858096593820060972083005465542331517943434661338\
25880082375365627242817665074960229414757916660113784489816415568624\
90574738836354519495170189082306707887345302790897678488066607307741\
96712052734509849005068942551976702466266003548260802518433507884870\
60870737400203450720555982074815806534671564389975850921524116958327\
07980152384201472079519814171590249989143156784192520786528786256673\
47220190336916066557746518796682439042461735578344063934917519432777\
88515789758015566842267702723719626725942078493725849334886642299947\
70030679468287120051262729039717871969678460059934994249474391411714\
78278008490896995322935819876793350803375852915554004211740165840964\
58980973700884900486243646094922098829698772607089905777239647767010\
28189341944069984381627954788829500808206910447964536841718625763251\
75886560221128687943749533966130359055198784552381931843249842998351\
44583050786817248493383162254969694615418250109380538361146251022506\
06401296384006416133384871139055031090707739841146158958324065062495\
02830620418321422399004694258430111804598209265532260093459532094288\
05603345924024305329898011813123546099972716996397667359610863833008\
31645340046212846393336511305414924626105766287929742523461580999754\
73606018253856458837654303254400856860363472580347281769471032284585\
48369052513310899114765447112665846694879805233280120712927163065777\
48413139497879925010315388162232443947123028694957195354494582605410\
63462487875788651730988734054006617660475561459605599980375228315431\
24524537564131863965083801827055062127771998655580552281650602555824\
11856153917894676910298758333836613331945779213054812530103373706836\
54385555713539435067285061015954092646934020249189942088000772029152\
24537359859646047540204272110420703327417866377169384652469720921324\
71224439865888287253961613024228836503763548771749063095434692077744\
23182965654650394905406975900212640428709095696828885407794645198220\
10128744522173388069891144515618685700698613469536352975852207894964\
64633176634726604735208014543005030064492365102092189549305455165180\
39290704896319481520354863038986410899970631874319911557417562070037\
04010033595752234069579291978775531721719761997732447977062169674530\
64766537931725646392782167276683648603674322330063664618113989127152\
63430105324901166966208945910872391996827827102145540739562789245744\
35289004966359073409887586441996926373406430494465011842161858793176\
53598129221445850617568698019709155369056212127091025126872437377686\
62010345232326362305485439848468003068929818208876746913562701457397\
46213000705047577010358878261531852560222079788341486932585878376481\
95316935034227426175555534243255684853140093339742891376713439221437\
61346027955376747542500529511463598287812319945463956151482458746543\
52683493298570668346095303919013272765161032321599391982645532700840\
68483304855084647228094831182111924325833534274359203473573704034206\
78755726484973414364307765840610767798153230869912446354247862204792\
74133010059138704910591904683680101791281674547437365592155176005011\
74191383359059849296661608561839669915015114387121546152884448633032\
69020677573286742027305838963364096189652561990851786191745618181887\
63189009692479603828759832370301135236572737887983067915401784834614\
30936774609681944912871350586902281195459114757170116737649582260086\
72030360200951519582431623531916401863363431053125730846149928541912\
47664100712944702889402417034434290006279085504095775929419006149633\
63339135805938487302900395023261338546968005808602865359698904087169\
00875725475113991376066084590456483326905747081538094226256402528473\
15435257200183038805653016292263978867754585196720256542483442991056\
66466902738997087989919314496049615444982488743463582907753411873713\
45144086010643847713706900764580699909664370205300506864564210058945\
35251334861042350797380249524131856514685634100519628063628139332018\
07974989624813148456039235765710904668331099189134893473028468866909\
77146037958840683532213712143433463947713294737159285160933919048706\
08947587806418059723961386832404821845919982122291828385356406812444\
15210236282868789029978405161828416915090131988696062641163839028361\
80632377080666067477928811093937227105254674309443875213419556862159\
38668620270360204433195995506694136777939210507909155718990430197994\
43977365792066079472779802042021124883814953590182590774342147964456\
92503526377460176411536433832944039036686117571587253006742679136208\
90457427824842319098211497326072259260241712543814133407470530671464\
74720226894711289256934081190289884393270429218011022780561886306599\
46496941828759001039285509414430327709471033639005177526104538372596\
39242818951241554509995995347200307510892209924299469675814573650816\
22346607174423765479393147695339066402237387272804207464629731716244\
06927105386658974737589773224527604236729809651088716843090247625797\
32638239896178984667829151850811992283017801341327016792287221943506\
04949391493655904757510489432151312712685809239347273621085782811909\
40513578927312829185174005232394446615793433535633878734492933402481\
22694209986323418703006572491409310346053061408023639815249053115728\
74734056701822197142653724824344343057760622141342508264239679629583\
21849838243819403906720652122249909280313224274306888240007232333981\
11133745526652499801755408458599600153820677994745431457123452615052\
62699314454712079636596418315347692808754335348736117809767566088521\
11984573898004609207629999041585496887836094559924048860974459366341\
30591767936529832864283186323250974295671890529476170943408714260485\
83734278041421367975656199955291041882704742197104449519595373169608\
80201143442634269486362253838196084416575193023228750573981650736829\
47276136671578204267262562307104253134899383921997261551089380804076\
14185562305899056376747556259978773094036586849520228919818075291293\
19330811476714230715467619538652132604323168779004970366847568716625\
50352610002725165707195763553408451848550789690086695192715145569426\
79016561996356042443922372490976265653186488526802362995811122602587\
79973599066763513055127846641395609200674076671304219386344059772561\
07764359683080636811389413145202166419673706441932514679080496409097\
45761777976211401415971393470264445513638414592870487899968382588669\
21262964828112558450097881006521786963402293516021429442921349218430\
82153739044469757461823763514811329753227697159313580007692755796287\
04245010666525195931323357634323142506389600495878548972911537119065\
69706055668883444120945244062432889015677706172206993302413261601709\
27111635723993867995650062541385740695559659064380490168576090505432\
79422638792618715418496874990792314325306697294464867232549657326275\
86196012901557771641160492247912407094302071148504071834685333596259\
44290129895544200695001804712654418830358285615083777827679188812793\
27757905208057843206058831645061648912174967511105356710437674044432\
00144826011339930920419520744684205867858745785383702286731111489897\
21714858585280774939387054378912210863742934573628211640003759482803\
00465475059788542400561813182353465215314514864252998226672328290106\
69087652351297894577524471188473831276467715237795322834668956778423\
69369920694645516431635258442491273645684146941832510459596744803904\
21969936764154029957057877193853096946324564112572377834709748766010\
39296539203885164607930181598026394977263551550128945501631588150624\
73884295007951969540385123441636636296359392576835370494542185770704\
96428083741811157071484408901124751608049169310396855812855000026845\
93067391357317226207689806198576439509398577644979157838580898170859\
55671186695359783629161573354141025878978043588820600607312065810951\
77259062769889578340530386710742497497259235751935523845586948533106\
05309953424566358631767978759406755414766772322424724120374965858237\
13805574325165232398329646236435748069435380752191512632337380695244\
86368145134251020375433068875119066645028599008877873515799687300810\
38292135246041515334140132518913022464645020112236246371704518817384\
50263928826075641375631871343776290092473085310812580831886248310543\
31241915267078476827290171564099613754956123414765300472437545219060\
73682406544008993012399378497731404768984926337129776515381796814838\
63261555514746881927816239735590717397487135452476135457336380037423\
60911092244913178673831964433534747136892081883236014902762835816804\
37978997531598419253868700740734199129166717870149750439365635561531\
40290474595690594146610181551803944594236066890956263285187378221519\
14101095742466917046740928578577667995756715528032792873405279446693\
97396611926637717096505111293480325163031238735387227136461896746783\
51806994108714167682822984838315640120070423379339650393041435957381\
81494430483222351072083087648944890542442753025870997946182476309772\
72175793412673448044093949326943665436966499862347028404084017115399\
18921108126605764403546384675655254946991399631450793107025057763311\
21440849789598556587676716466196152927878146604491024750029854777808\
19275222024907692994943360900237267255677551501353219377440049640820\
79252080916012709301717732264771342238814753234774617798847066989178\
06748768245839074726243483937991907833629183513636477619778424127722\
81475500074427394942652163464579987377892295397668952934431453224938\
52114336570451717160571005701547096610111123055039570818881436437598\
51837110000577417109549561492336521276932541228915561276189976813771\
41068315208665692138723139719457655376924417978389874453074145792409\
48298991325265800866748370586498193331143940440481434150468066452767\
27577893910460312627249347495744678156455772919153412084433924889168\
58110590025482837924528318491634254567504574848451854558952658041715\
91928432607055862004076873515528361533409036296982292415484889651798\
35733470726882046809887713452905089205314212826908295035000799986878\
11410477639222358986185149129041469164355785052062067194067428641675\
70291008520017486272926333741446851794555836376424504723265498519409\
85718111278928275749351610698765943368495595080503896678905553061585\
11210780816539822911680548457740353831585473143691029142123822032373\
09923557946079793283747221518608468508514252578799158651767654051904\
14465366016222693395455657478671854609365623938245685066025869202077\
81118972398288461328894471245504588541348351626032711905120529068338\
72033159140941564436061574362160831970828316905759197166209001112458\
79238711550818341047843163748963708162889972678450380466393607177974\
37132243878857248850861682784453307480051358252535782433306020767193\
59073461485076604650404465532607980921310657026470654488059430872905\
38334871015988087990795062756028213310898497571784848357177996351420\
60921575035335093649726694609424995550898119170431417088129016322195\
72616616581467642210156698508197888528249819873738930209233300220415\
64210942164958325906487717625950580785612541790059012769199153097854\
65503905249926706685136286575235498828554332807829834049023112509298\
76816519617406537058105800500008439122913260837925764508487322508726\
13663779319392844021774618951614638089441484842298528393746228985211\
25599169138902292280461215332399010402406331516036346396383372788388\
01709410705702615904906493035157584508836832525577911208074273021207\
63803710835596438944469147066438413397171714201875204105049912948536\
75856657039698439451579888346297065435556464676918846367782782892661\
22320786787988397200573338349176521735336573982466168902888041866322\
95207836288322908947494322394892951589710599506105176388370707991305\
53019366622722670570577581488331377458281356498842827718272550371799\
90781641058398768066879357438562098337860278586801882842994736523684\
99137864328838841623721476437479748326395056434962209270451714810743\
49483369566423761857662406005156278943750846413721577203497844143077\
20991409712694200325011419832000035762217584621781009697162196167221\
51334971482957152166469122168529146846256732033151871353520163321541\
92187108131740377590294067172715668448292388927590154400633921607101\
21551971057868736695911242827136688430092425145980142597734180561712\
20255300188106819616077779609967522134593793365736596653859300201991\
51996227838633536090789107078185122922680630735173317981692699358753\
80913865492657434989846578822073239359674999003673965564061709733563\
25897075587446867043483933113884898202662189670087432716498139598205\
45886497751475256057498060905080129633633379449401040285222672165223\
75551624255371101998948212413518758785531132975586203603005454440530\
21303198572434683743976889593610150264476075503030630369626828025686\
24016180114830459893688123399849738916731166866031746166878443388485\
00371594207540454263963208716496781908981052280586804222280556686090\
81110144184446419910302731253311729634881886531606091290821814763187\
39103748870438252999997085762658915720176173478251478195594453276301\
60418151540083033390534914038897518802397854335643623455116113738194\
58273712639249145523128528480528205706257705932504088240472661496409\
53845719973913648719692420749570623292377724971727735177231881753154\
22420265434357931838909604235215707486529961815871128342599203714129\
53481450991094662825815787810930197913398605280715438821229059677440\
72748457897134153238806337455039954269093048216374025212569197667186\
38824393724621502653112066456523394587372605811686111993704283306051\
63424913215367770482336126668887012264518555160566170203492133332323\
44517717795130624515911830924800838519907910099462791520337334383712\
23975691471562701925600184678888343102317559483707719658221246902063\
66035813305544810467709303012164462159606585638580366172848812592761\
17801458900605579867592195948123794585886468183552634659931723347429\
45273698331158380047855372988396852428327693660368114763683535274030\
21856694944754352301139600790837422760918710232657239029668648790911\
43017474055705565379345395577557923475206542816163738835163039160588\
13861590619897318816048572795138772752870548498208079463887313369777\
02556011176343549594492069193801073965208149559103091169436959808022\
09245164705277597631406321350914522120374006734452898148421031379024\
77950399491170770718192172456823857513465345866300603373905926270921\
86145975340788004549023198044322973234659023137761214891428468735267\
77693512836310341417717041793829552969636267012503043578397025173956\
43897822616533185443171457765035146469119495144892465160484852473381\
95373738131475920046885701131111885161124646416332865814888953189337\
03950531348471598470380102569084892188936803778666938195519108757310\
80983397214178106014613233145023524876249935915009163316849107767082\
47920457999344860299414100361654068761383021350076888688174374304539\
89258447825777841436608922760614029588391597599518446766486451408266\
96164309579412453182721057851386185507870752052996035890075577697097\
08694354225069274587175123873585967269335775050373982808012891037094\
71760538113985418499057000368900232934691277908043473994626331191653\
77159096915273884646075721552029187928991473756442761640259603076780\
23262131166078233817960093457915901693364919855336555748190667876596\
83249716468134003023909789059318500059617364991255751735988809177271\
93537844951586319168329074698264318995398568147834610289940477739924\
98264221501380467902515787042645286595656995163308958532044759872699\
47469710556382835405046460733849575651873637419400007891406414054768\
29917725385434373108248853247765437102226150016229666096198442928263\
55606606482341191428837960004275626891833619126697959749285404760639\
07498959269540297816769307112725214443759744293436019134256934870060\
04402380679905665948053886960320462737462131279670309436752463172850\
40252475280265147464245261531341894412123498708381566276510315345865\
27752329930592985265691246029574916925678389067306925157414399084880\
72304382745857096039269017383708648008344107674996310281578775698036\
03177168301212524587425911196547367390343089487390722924188231943259\
82409057469319586567556394890297128814656224507065085746170072501515\
38996349187991479565092992109969742934231899862192354768785653945136\
38125735724703715968608385204165549109301869685960257400108281208684\
66816932968957052350363255114614568661238903169153013289363128325034\
31797283742182888220050220654469903114689032205586541531164337335835\
06999259642617173992723613530768981212589737620473095423952002883764\
73557472799053100843891658821739522968236218921381895810750788989640\
21367871085475696921794772336826442632598374319498229131560952717572\
93000778709053832543191586383442855942150758054034257325612042621725\
17340197181814357549054137767248213417850922142031870600311930954340\
08334537527384206294828318410224794644216404781715932237233161557521\
60916273456707758913025831218426148520594961926518449010108153226434\
02503581979782448494386378454913237605408944158228947721080824307905\
68474219590889143577262038974968387397016375092333490610467399710931\
12052418803741796167958887083732460396377118978749100773586805308767\
10853586684803025140408671017019697102056959133769211872302216160099\
68514326179261663073827654352533133228058902337526633181004843752073\
17772765663692903777439642247353399883440269917889598755088977630278\
21605676810850045480583048872642540013759482752995021932893571248372\
62699355691808875614966253078445654384463004804268285428510291641287\
18557953753513007106182922019523475676872430182069999800365566560322\
83104569977255946845053608833381534339200998827369084531401728549025\
18281740849885983796867013336201641798107034759228287084372984626450\
43321111263581671858774398564343156846621946545221101692544536904387\
76665052816867048383710207149035678860058721210064557053391370041597\
19631456947631157081987088042554528114626367694729678686113718751373\
17327920827144485359748263881352533469226775198709061750172006030338\
75346124447692731383380674102282701521012848885305128740474069324986\
66834257243068917699808567496664537552745581043414042423757045717650\
19828285007523705103637459741647922999032322290519619497529760345731\
57270559326244424644756009530928298961257328249021113653868634200489\
64761096382071841888503932255103474980573697274206519652113739929565\
92337923863636090378705350786689024079543668323015228656565657078827\
36948165708154406554386829797776509124407792948204108270231450488897\
55907450295821492096216260707897699771405582843478459635336973132082\
43359686618712811434832656068881714968481591765058320301237808660016\
50964239924126065706351031417920472496672616886391656790272074286379\
10132552012372000650706329831116885980275152757856198784199505989312\
10049079900671500209628967463802099030523724283902413040244262470792\
04588311055234710076910305456263466660023862915380642564008451895627\
19207955557558798197414206034549419278509250356221483645287742207601\
22596379442581214008521211588596793183073258914089261104462938640148\
17244858487385797443091328170524979040521772754461054353395042296153\
16357143994248468016063369687261865225336588807350258949776707621501\
53457577024333836880142573016537081752104996342158456343293438980433\
29333395875891070701158695741755154594002595985611384319217767156983\
64536125493620982325068217898856163747134141531817095924783422940357\
98547603826108033579624963779390860655453937492710891466400340392795\
80619923213828509345379687295846906693517980073215981949455492530604\
28451141345328205508134950585093590401939179812826515830167233673037\
87722541333728241795926433793403683727809149015052597602780823815294\
32592514415477705132292024113507461198355059670349631542983123864375\
88650871188109221515246018818051908909469479047666120235703295420870\
37851416408456875442410034951112262237573714950033274300432961070974\
78260331177215375413912623153771375598964393749241167291416054302044\
47604044849052538558086439326251278380478334387875331896755272880887\
30203270111802777406548145257184131178066422261172748796579877771803\
92036729326559544670821412888334285520990587040594671779555531474390\
00077578877582210757225162543098357903651968850845275008386298270857\
74417448140971626612118719882361417532130632988401613141359712105436\
31850013492463334774780524116700614339521435432061970655764419612990\
68535007795795633795363477126869812707061740876790580241468575304771\
54814276769673666436202595713344677989221729976966727420207154610368\
82632484730284642692144378171542130171336809710985957898710489377884\
30192707300642040414947052567290636453198405062964316624693344243196\
24573916487214649036759380836381899745534911325426207929917885765663\
59591318183112213565327289583571542835146851454009729176375081497556\
16765706526920859277227980897462107739757262918194344216986045098297\
30628925852451100187350571135547021326682125060535198459545611916308\
77046167927981811346222353371818349264357043608643707652296760165807\
99412326928695050340648975377371934955423954813526697753929860580672\
54286138641580308426720817079871900588845628441205296921167971291303\
11825920132479691378770452026035964600654300216795703160588467249515\
27656119799404790604680345587435137248071722415203938472602236108268\
37723626520049840928136315204891736547348252521746707826274588643312\
66572290508527790080675296785816164749532509491392659843183488310137\
36567869923662335019111489288392182627564105384240238113297501005570\
65033496984911623244237673307287576392494806499499946013011213484213\
05660178080997411624058274910360058024752584813061155080255905847238\
65892507431103034483073988821602735990647461598672220007688105101191\
01112997420384311222899123630121930024437674527980270578768366847906\
99898368514034914421743360982337429582488530412093053806534904917214\
21752379179258455830983860956211930622153372167466631249616895187502\
28842810394459980038352704088394480612155590916662393937210121024709\
81085737844843564119342008684787135255941287283402322251300655905728\
99530852827209725904898209967795220965196773892536211615016908023272\
10022793431846684904588307221749222113070579233044797394399378648885\
10590749148650964064808725714945895344880957001801285527118405125480\
07412107745127577690338345804490467000600458132667616899717518454986\
10989492262565895873144138563067461205944682635295669151585146258214\
89523163802994739248968378376192093092476885206657581966886270298160\
41665869383181674580313258068233005674405095869158353050035249217957\
20357510022392851228774704537767663559582275405100113528974463817370\
05433439827148947110962675773538806697926482121680279823000883990403\
22785704726237974239247062105099473653029217081754089975587537998137\
25338042850036515660727354079486150074947674400276955021266683377314\
57110159335324908994937636335557050414325130268626903092877189226511\
90183071212354045303734261658961028319841677984545079242414664631924\
73451061579382612500438768458585716274363907099790352514219884632036\
62534982769990559135638622838628046574855809693018553747285811538190\
49176236092627702661262133038062638410603561155047694509784541351622\
60672570891556237859872995158676134234248827363749634045553320637592\
68247083611536672162312358296436136923411421313141339748089884124931\
98832110717297897827456867342731100646439903556412160468953191175051\
48160069109449420025943977625038354832890541527000871455474801949825\
84349415629617096261202636602359524959118727620670543206855473543528\
31761304778945255285571949750828710000985549624167690012319891051894\
60983936888529944189560974732324530254605362668047902777188542778764\
38215750945008425540663127646790625513145372046516704300306431922410\
17613583214764962318342863286145271326119705679260448659317975805446\
85751957483328983357054571604330781341501211261485929905337202197619\
08335629440118847652578589878123335912644325206927004138410033559003\
10255628782451092418362135187396556223628757843466952637594463455496\
07446666943369638113089962257154005920385242347106656206388491977211\
16890215238137077887217115470614911635384390416286083860272149256132\
31373290064952559841222913471553791773633659681391044447638344283324\
61192114789897405918054317137376784082707498004879235638906082072421\
18329645513107768894539024271234001331208519476475911162207872603440\
30659508556653762996813568437935121041846872767593620056700717482459\
55500499427745811580026882559399112445904336754809101832917271722991\
63606346968406218373839712895072521370715049157357645985217085105661\
79981822615731013599356280371430991664284649068723422882909424756493\
87611887398165859487488183885860070971944183382000951729831900350120\
58010043298271260006766406114223045337323105008142775626826690506066\
17339932847209465512530114705285104492621211051312158184429247651225\
29714917583857195622774740744095506131129233538820237564006647804027\
25433185688659772329382409801758343511073615679149635570126751068722\
34750839764815870454018619103116493478601532730665683028659495488608\
75698338199303417161532467970142151321662032205342003014995178047949\
59391722812365872301741178898489395481565397664693242655750272840017\
11444533321322706274220674278576473239438341098961914415485118979332\
25789244363218777695093802685280296077904264616602448431326000491647\
25629315775735335890493610615707845441575992985830482973063121209452\
38761730609149954770944900569105756823891945464001912805200419317968\
32632852233717475460276503840771545063380277571833857514096541140467\
96087827756498994725839554586688211608483405330334516228156063684808\
53073929896971233600471717617297834846022460532695433236401094393633\
03868519428508826247006209439832272241638789010593554060553205549096\
62703404212519714518075038161584969044510542645128838207398659475263\
93163946087579442564775650159800509347012129300733969911798283196927\
02738952749135143742975729368641376386557331067990637315541568254307\
24172863302201529714010049737614628881017876160399664629468659974667\
13805638863573616308045038941985131123211890002557344589040603223828\
21031191150359008832414959509273703919720554503898642778213737123543\
64756903212956761601333529968598272488656557343050499063203460614496\
92886612766383062741664346638008017510721717433922175701123934740814\
42531772818875303708145109992832225185435148817170722296376399883563\
90313829577547785285270586909368156233760253889149983371773728774565\
65366441461277091749325061306678938229397876104302119421702543641538\
21597089234318401319176337978902099049430392709210386052599459653722\
33785609037693790732744615343742798804492983844847517804759239296514\
41053200253230927611006289296866688082672077421557726893453143031284\
02795702425385930684833908976685112356389454440293816542537039500557\
06568632901116293632450301066967524415946553271690329270844146813764\
50920081904955001458630636200147812102240578752607358952968971812098\
23459827302752003597467455983887345198092069235334258701164975855137\
24095840636426580024857680023935718285434511735532621992583170949281\
89989431910439093859171827605306382126108137284406039641570236315521\
52893625809299663569935790785972066649722200106813692930587599650244\
28650152993853890283976090384810149242135184003171537640152798717255\
48574213322881920353726606477341871324298197389372506178509412986316\
12732446796463674148392733879842021641420018133113901523986115345395\
73053630279791220533159671256253090406075757561273126620133546478019\
69128369344329895756298389862521117054149512277290358219495780327057\
48313728186319519119291793489310977243037432087001051342439361351199\
29834583475963343978876562124921726890768868768844358605718546715195\
00946142043115390796839642538018181495021120796636913250103756045268\
26819620150476820479155334947039251299709202437427557625260355138752\
20000279048067301418352315724207086801574364734768454656448809503912\
67170705790715265508236267053700162012947323058757707100009906883561\
27662294098345840359955668926591864239769164759337348240356524861637\
49920493857389406224243864249180617348415231534126031946015421308147\
70459906527343565501233297993388660838045570969071619270022724038667\
36275978152005096477326049244444675220196452356228863661488108210650\
48888938551877432822064204949131971735321330427761654274014481170984\
32950787590125470624251849090108659577003394834733662124113881017708\
27920086397409223486197997238047442368283676957986526186434429871652\
60243844973908589636278220327455572315080389853193896393051882675116\
24077293260880379196950005138962940752368683552134554009227167766146\
85122546449060026211465432350135833103995315980281553405918869316484\
01016977217352925614934523764747650277032487289037965354376423027611\
40732187299064778947193985080707755266090292878187376174123694673626\
70206140952496972477833456296346863423687600061250473256218862375058\
29850498789465971165745198240949077990186742066226067853556968987171\
9325372141858119131848179713
```

How could we determine the number of digits without having to use a tool like `bc` to print them out?

```( log106553715451 ) = ( 15451 log1065537 ) ≈ 74,000
```

Let’s think about the cost of this operation in terms of computation and space. There will be 15,450 multiplication operations (`an-1`), and it will take almost 31k bytes to store a number 74,000 long.

How did we calculate the number of bytes?

```Every 3 digits takes up to 10 bits of storage:

For example:
1002 = 0000 0000 0110 0100
9992 = 0000 0011 1110 0111

10 bits ≈ 3 decimals:
log21024 = 10  <-- bits
log101000 = 3  <-- decimals

74000 / 3 ≈ 24666 * 10 = 246660 / 8 ≈ 30,8333 bytes
```

Steps to calculate the storage needed for a 74,000 length number:

1. Divide the total length of the number by 3 digits (since that’s the basis for calculating the 10 bits).
2. Multiply by 10 bits.
3. Divide by 8 bits (one byte).

Ok, now that we understand the implications of the costs large exponentiations, is there anything we can do to improve it? Exponentiation is, after all, just repeated multiplication operations of the same base integer. Surely, that can be optimized!

Sí, seńor!

## Exponentiation By Squaring

The good news is that we can greatly reduce the number of multiplication operations, the bad news is that it will still take up the same amount of storage in memory. This makes sense, since after all the number is what it is!

The idea behind exponentiation is that you can take shortcuts to achieve your objective. For instance, if we were to calculate 28 naively, it would look like a brute-force approach:

28 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 256

This would amount to 7 multiplication operations (`an - 1`).

The better approach is to simply square the result of the prior computation!

Think of it this way:

28 = ( ( ( 22 ) 2 ) 2 ) = 256

or:

28 = a2 * a2 * a2 * a2 = 256

So, using the naive approach, it would take us 7 operations. Comparatively, our new approach only takes 3 (`log28`)! And this makes a difference in the orders of magnitude as the exponents get into the tens and hundreds of digits long.

```Just For Fun

The following are all equivalent:

28 = 22 + 2 + 2 +2
= 22 + 2 + 4
= 24 + 4
= 256

28 = a2 * a2 * a2 * a2
= a2 * a2 * a4
= a4 * a4
= 256

28 = 222 * 222
= 222 * 24
= 256
```

## Explanation

Essentially, we only need to compute up to an / 2.

For example, if we’re computing the expression 332, we only need to calculate up to 316, because the last operation will square 316 to reach the goal of 332.

Let’s break that down:

1. a * a = a2
2. (a2)2 = a4
3. (a4)2 = a8
4. (a8)2 = a16
5. (a16)2 = a32

Five operations versus 31!

```Again, this is how we determine the number of multiplication operations:

logan

Example:
an

a = 2
n = 32

log232 = 5
```

Remember, logarithms are the opposite of exponentiations!

log24294967296 = 32

232 = 4294967296

## Implementation for Powers of Two

The following program written in C only calculates exponents that are powers of two. We’ll shortly see how we can also compute non-powers of two.

exponentiation_by_squaring_powers_of_two.c

``````#include <stdlib.h>
#include <stdio.h>
#include <math.h>

// gcc -o exp2 exponentiation_by_squaring_powers_of_two.c -lm

int is_power_of_two(int n) {
return (n & n - 1) == 0;
}

int main(int argc, char **argv) {
if (argc < 2) {
printf("[ERROR] Not enough args: %s [base] [exponent]\n", argv[0]);
exit(1);
}

int exp = atoi(argv[2]);

if (!is_power_of_two(exp)) {
printf("[ERROR] Exponent `%d` is not a power of two, exiting.\n", exp);
exit(1);
}

double res = atio(argv[1]);
int i = 0;
int e = (int) log2(exp);    // We only need to loop until the log2 of
// the exponent since we're squaring!

while (i < e) {
res *= res;
++i;
}

// The results will always be whole numbers, so format as such.
printf("%.0f\n", res);
return 0;
}
``````

Even though all of the examples in this article have used 2 as the base, this program will work for any base. The only requirement is that the exponent be a power of two.

For example:

``````gcc -o exp2 exponentiation_by_squaring_powers_of_two.c -lm

./exp2 2 32	// 4294967296
./exp2 3 16	// 43046721
./exp 5 128	// 293873587705571955623086381296639321901703084698483813243829625275718325188616411500511232
``````

Ok, that’s cool, albeit limited. Let’s see how we can raise the base to any number!

## Handling All Numbers

In order for us to handle any number as the exponent, we need to use an algorithm that can handle cases when the number is even and when it is odd at every step of the computation.

We’ve seen that an even exponent is halved to determine the number we need to calculate up to, but what about when the exponent is odd? In that case, we need to first subtract one before halving:

an - 1 / 2

In addition, we’d need to multiply by `a`:

( an - 1 / 2 ) * a

This makes sense. If we take the expression `25`, we need to first subtract one from the exponent 5 before we can halve it:

````25` = `25 - 1` * 2
= `( ( 24 / 2 ) * 2 ) * 2`
= 32
```

Let’s look at an example recursively:

```313 = 1594323
313 - 1 * 3 = 312 * 3
312 / 2 = 36
36 / 2 = 33
33 - 1 * 3 = 32 * 3
32 - 1 = 31
3 * 1
```

So, the base case will be 1.

The steps we’ll use to code this are the following:

1. Look at the exponent.
2. If odd, multiply by the base.
3. If equal to 1, return.
4. Else divide and repeat step 1.

This is pretty straightforward so far. The next step is how to determine if the exponent is odd or even at each step. The best way to do this is to decode the number from its decimal representation to raw bits.

```asbits 13 1
1101
```

We’ll look at the lowest bit. This is what determines whether the current number is odd (1) or even (0).

1. `1101` is odd. Multiply by `a`, subtract 1 from `n` and square.
• (13 - 1) / 2 = 6
2. `110` is even. Square.
• 6 / 2 = 3
3. `11` is odd. Multiply by `a`, subtract 1 from `n` and square.
• (3 - 1) / 2 = 1
4. `1` is odd. Multiply by `a`.
5. Base case has been reached.

## Implementation for All Powers

exponentiation_by_squaring.c

``````#include <stdlib.h>
#include <stdio.h>
#include <math.h>

// gcc -o basex exponentiation_by_squaring.c -lm

void reverse(char *s) {
int c, i, j;

// Let's pretend there's no strlen function.
for (j = 0; s[j] != '\0'; j++)
;

for (i = 0, j--; i < j; i++, j--)
c = s[i], s[i] = s[j], s[j] = c;
}

void getbits(int exp, char* buf) {
int maxbits = (int) log2(exp);
int i = 0;

for (int n = exp; i <= maxbits; n >>= 1)
buf[i++] = (n & 1) == 0 ?  '0' : '1';

buf[i] = '\0';
reverse(buf);
}

void main(int argc, char **argv) {
if (argc < 3) {
printf("[ERROR] Not enough args: %s [base] [exp]\n", argv[0]);
exit(1);
}

int base = atoi(argv[1]);
char buf[32];

getbits(atoi(argv[2]), buf);

double res = 1;
int i = 0;

while (buf[i] != '\0') {
res *= res;

if (buf[i++] == '1')
res *= base;
}

printf("%.0f\n", res);
}
``````

Note in the `getbits` function that we’re right shifting the number to “chop off” the lowest bit. This has the same result as dividing by 2 or halving.

``````  1101 then 1101 >> 1,
110 then  110 >> 1,
11 then   11 >> 1,
1
``````

## Conclusion

Weeeeeeeeeeeeeeeeeeeeeeee