自然対数の底を求めてみるよ!
ネイピア数を求める時に用いるマクローリン展開をどこまで整合性の取れる値を計算できるか試してみた。
マクローリン展開の公式がこれ!
この公式通りにプログラムを書いても良いのけど、そうすると階乗を何回も計算することにより無駄が多い。また先に分数を計算することにより、浮動小数点の演算の計算の頻度が多くなり、整合性と計算速度の面でも良くない。
ので、先にn!倍した各項の合計をを最後にn!で割るという方法で行くことにした
C言語で書いたソース
#include <stdio.h> //nの階乗を返す int fact(int n){ if(n == 0) return 1; return n * fact(n-1); } //1/n!まで合計したネイピア数を出力する double Maclaurin(int n){ int sum_val = 0; int val = 1; int fact_n = fact(n); int i; for(i=0; i<=n; i++){ if(i == 0){ sum_val += fact_n; }else{ val *= i; sum_val += fact_n/val; } } return (double)sum_val/val; } int main(){ int i; for(i=0; i<20; i++){ printf("#Case %2d: %13.10f\n", i, Maclaurin(i)); } return 0; }
#Case 0: 1.0000000000 #Case 1: 2.0000000000 #Case 2: 2.5000000000 #Case 3: 2.6666666667 #Case 4: 2.7083333333 #Case 5: 2.7166666667 #Case 6: 2.7180555556 #Case 7: 2.7182539683 #Case 8: 2.7182787698 #Case 9: 2.7182815256 #Case 10: 2.7182818011 #Case 11: 2.7182818262 #Case 12: 2.7182818283 #Case 13: 0.4952754305 #Case 14: -0.6399285410 #Case 15: 0.5754160728 #Case 16: 0.5752868802 #Case 17: 2.7182818143 #Case 18: -2.0622273375 #Case 19: 2.7182818115
from mpmath import * import timeit import datetime def fact(n): if n == 0: return 1 return n*fact(n-1) '''結果はfact()と同じだが、再帰関数を用いないようにした''' def _fact(n): ret = 1 if n == 0: return 1 for i in range(1, n+1): ret *= i return ret def maclaurin(n): sum_val = 0 val = 1 fact_n = _fact(n) for i in range(0, n+1): if i == 0: sum_val += fact_n else: val *= i sum_val += fact_n/val '''浮動小数点の精度を概算する''' mp.dps = int(log10(mpf(1)/fact_n) * -1) + 2 ret = mpf(sum_val)/mpf(val) return ret for i in range(0, 20): print("#Case:%2d") %i, print maclaurin(i)
#Case: 0 1.0 #Case: 1 2.0 #Case: 2 2.5 #Case: 3 2.7 #Case: 4 2.71 #Case: 5 2.717 #Case: 6 2.718 #Case: 7 2.7183 #Case: 8 2.71828 #Case: 9 2.718282 #Case:10 2.7182818 #Case:11 2.71828183 #Case:12 2.718281828 #Case:13 2.7182818284 #Case:14 2.71828182846 #Case:15 2.718281828459 #Case:16 2.71828182845904 #Case:17 2.718281828459045 #Case:18 2.7182818284590452 #Case:19 2.718281828459045235 #Case:20 2.7182818284590452353
メモリリークバッファオーバーフローを起こして停止してしまったため、再帰関数を用いない_fact()を使うことにした。
オーバーフローすることもなくて結構うまく行っている
折角なので、10000桁ほどまで求めてみる。
#Case:3248 2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170276183860626133138458300075204493382656029760673711320070932870912744374704723069697720931014169283681902551510865746377211125238978442505695369677078544996996794686445490598793163688923009879312773617821542499922957635148220826989519366803318252886939849646510582093923982948879332036250944311730123819706841614039701983767932068328237646480429531180232878250981945581530175671736133206981125099618188159304169035159888851934580727386673858942287922849989208680582574927961048419844436346324496848756023362482704197862320900216099023530436994184914631409343173814364054625315209618369088870701676839642437814059271456354906130310720851038375051011574770417189861068739696552126715468895703503540212340784981933432106817012100562788023519303322474501585390473041995777709350366041699732972508868769664035557071622684471625607988265178713419512466520103059212366771943252786753985589448969709640975459185695638023637016211204774272283648961342251644507818244235294863637214174023889344124796357437026375529444833799801612549227850925778256209262264832627793338656648162772516401910590049164499828931505660472580277863186415519565324425869829469593080191529872117255634754639644791014590409058629849679128740687050489585867174798546677575732056812884592054133405392200011378630094556068816674001698420558040336379537645203040243225661352783695117788386387443966253224985065499588623428189970773327617178392803494650143455889707194258639877275471096295374152111513683506275260232648472870392076431005958411661205452970302364725492966693811513732275364509888903136020572481765851180630364428123149655070475102544650117272115551948668508003685322818315219600373562527944951582841882947876108526398139559900673764829224437528718462457803619298197139914756448826260390338144182326251509748279877799643730899703888677822713836057729788241256119071766394650706330452795466185509666618566470971134447401607046262156807174818778443714369882185596709591025968620023537185887485696522000503117343920732113908032936344797273559552773490717837934216370120500545132638354400018632399149070547977805669785335804896690629511943247309958765523681285904138324116072260299833053537087613893963917795745401613722361878936526053815584158718692553860616477983402543512843961294603529133259427949043372990857315802909586313826832914771163963370924003168945863606064584592512699465572483918656420975268508230754425459937691704197778008536273094171016343490769642372229435236612557250881477922315197477806056967253801718077636034624592787784658506560507808442115296975218908740196609066518035165017925046195013665854366327125496399085491442000145747608193022120660243300964127048943903971771951806990869986066365832322787093765022601492910115171776359446020232493002804018677239102880978666056511832600436885088171572386698422422010249505518816948032210025154264946398128736776589276881635983124778865201411741109136011649950766290779436460058519419985601626479076153210387275571269925182756879893027617611461625493564959037980458381823233686120162437365698467037858533052758333379399075216606923805336988795651372855938834998947074161815501253970646481719467083481972144888987906765037959036696724949925452790337296361626589760394985767413973594410237443297093554779826296145914429364514286171585873397467918975712119561873857836447584484235555810500256114923915188930994634284139360803830916628188115037152849670597416256282360921680751501777253874025642534708790891372917228286115159156837252416307722544063378759310598267609442032619242853170187817729602354130606721360460003896610936470951414171857770141806064436368154644400533160877831431744408119494229755993140118886833148328027065538330046932901157441475631399972217038046170928945790962716622607407187499753592127560844147378233032703301682371936480021732857349359475643341299430248502357322145978432826414216848787216733670106150942434569844018733128101079451272237378861260581656680537143961278887325273738903928905068653241380627960259303877276977837928684093253658807339884572187460210053114833513238500478271693762180049047955979592905916554705057775143081751126989851884087185640260353055837378324229241856256442550226721559802740126179719280471396006891638286652770097527670697770364392602243728418408832518487704726384403795301669054659374616193238403638931313643271376888410268112198912752230562567562547017250863497653672886059667527408686274079128565769963137897530346606166698042182677245605306607738996242183408598820718646826232150802882863597468396543588566855037731312965879758105012149162076567699506597153447634703208532156036748286083786568030730626576334697742956346437167093971930608769634953288468336130388294310408002968738691170666661468000151211434422560238744743252507693870777751932999421372772112588436087158348356269616619805725266122067975406210620806498829184543953015299820925030054982570433905535701686531205264956148572492573862069174036952135337325316663454665885972866594511364413703313936721185695539521084584072443238355860631068069649248512326326995146035960372972531983684233639046321367101161928217111502828016044880588023820319814930963695967358327420249882456849412738605664913525267060462344505492275811517093149218795927180019409688669868370373022004753143381810927080300172059355305207007060722339994639905713115870996357773590271962850611465148375262095653467132900259943976631145459026858989791158370934193704411551219201171648805669459381311838437656206278463104903462939500294583411648241149697583260118007316994373935069662957124102732391387417549230718624545432220395527352952402459038057445028922468862853365422138157221311632881120521464898051800920247193917105553901139433166815158288436876069611025051710073927623855533862725535388309606716446623709226468096712540618695021431762116681400975952814939072226011126811531083873176173232352636058381731510345957365382235349929358228368510078108846343499835184044517042701893819942434100905753762577675711180900881641833192019626234162881665213747173254777277834887743665188287521566857195063719365653903894493664217640031215278702223664636357555035655769488865495002708539236171055021311474137441061344455441921013361729962856948991933691847294785807291560885103967819594298331864807560836795514966364489655929481878517840387733262470519450504198477420141839477312028158868457072905440575106012852580565947030468363445926525521370080687520095934536073162261187281739280746230946853678231060979215993600199462379934342106878134973469592464697525062469586169091785739765951993929939955675427146549104568607020990126068187049841780791739240719459963230602547079017745275131868099822847308607665368668555164677029113368275631072233467261137054907953658345386371962358563126183871567741187385277229225947433737856955384562468010139057278710165129666367644518724656537304024436841408144887329578473484900030194778880204603246608428753518483649591950828883232065221281041904480472479492913422849519700226013104300624107179715027934332634079959605314460532304885289729176598760166678119379323724538572096075822771784833616135826128962261181294559274627671377944875867536575448614076119311259585126557597345730153336426307679854433857617153334623252705720053039882894990342595662329757824887350292591668258944568946559926584547626945287805165017206747854178879822768065366506419109734345288783386217261562695826544782056729877564263253215942944180399432170000905426507630955884658951717091476074371368933194690909819045012903070995662266203031826493657336984195557769637876249188528656866076005660256054457113372868402055744160308370523122425872234388541231794813885500756893811249353863186352870837998456926199817945233640874295911807474534195514203517261842008455091708456823682008977394558426792142734775608796442792027083121501564063413416171664480698154837644915739001212170415478725919989438253649505147713793991472052195290793961376211072384942906163576045962312535060685376514231153496656837151166042207963944666211632551577290709784731562782775987881364919512574833287937715714590910648416426783099497236744201758622694021594079244805412553604313179926967391575424192966073123937635421392306178767539587114361040894099660894714183406983629936753626215452472984642137528910798843813060955526227208375186298370667872244301957937937860721072542772890717328548743743557819665117166183308811291202452040486822000723440350254482028342541878846536025915064452716577000445210977355858976226554849416217149895323834216001140629507184904277892585527430352213968356790180764060421383073087744601708426882722611771808426643336517800021719034492342642662922614560043373838683355553434530042648184739892156270860956506293404052649432442614456659212912256488935696550091543064261342526684725949143142393988454324863274618428466559853323122104662598901417121034460842716166190012571958707932175696985440133976220967494541854071184464339469901626983516078489245140589409463952678073545797003070511636825194877011897640028276484141605872061841852971891540196882532893091496653457535714273184820163846448324990378860690080727093276731275819665639411489617168329804551397295066876047409154204284299935410258291135022416907694316685742425225090269390348148564513030699251995904363840284292674125734224477655841778861717372654620854982944989467873509295816526320722589923687684570178230380965678831122893058091405726108658848458731016581511675333276748870148291674197015125597825727074064318086014281490241467804723275976842696339357735429301867394397163886117642090040686633988568416810038723892144831760701166845038872123643670433140911557332801829779887365909166596124020217785588548761761619893707943800566633648843650891448055710397652146960276625835990519870423001794655367
from mpmath import * def _fact(n): ret = 1 if n == 0: return 1 for i in range(1, n+1): ret *= i return ret def maclaurin(n, a): sum_val = 0 val = 1 fact_n = _fact(n) for i in range(0, n+1): if i == 0: sum_val += fact_n else: val *= i sum_val += fact_n/val hoge = int(log10(mpf(1)/fact_n) * -1) + 2 if hoge > a: mp.dps = hoge ret = mpf(sum_val)/mpf(val) return ret else: return 0 a = int(raw_input("Input Accuracy:")) i = 0 while 1: hoge = maclaurin(i, a) if hoge != 0: break i += 1 print ("#Case:%d") %i print hoge
<実行結果>
Input Accuracy:1000 #Case:450 2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354
初めてPythonを触ったけど、ハマりそう。
今のところはPythonと言うより、C言語のソースをPythonで書きなおしただけのものなので頑張ろう