LOG2(eを底とする)

LOGの級数展開

log2= 2{ 1
――
+
―――
3・3^3
+
―――
5・3^5
+
―――
7・3^7
+・・・}


収束のスピードは、8桁の例でいくと、最終項が、10^(-8)より小さければよく。

2×(1/k・1/3^k)≦10^(-8)

両辺、対数をとって 整理すると

(簡単のため仮にlogk=0として計算しても)
k=(log2+8-logk)/log3≦(log2+8)/log3≒17.4
kは奇数だけなので、k=1、3、5、・・・17、19までの10項分だけ計算すればいいということになる。

           LOG2=0.69314718055994530941・・・
0.
6931471805 5994530941 7232121458 1765680755 0013436025 5254120680 0094933936 2196969471 5605863326 9964186875
4200148102 0570685733 6855202357 5813055703 2670751635 0759619307 2757082837 1435190307 0386238916 7347112335
0115364497 9552391204 7517268157 4932065155 5247341395 2588295045 3007095326 3666426541 0423915781 4952043740
4303855008 0194417064 1671518644 7128399681 7178454695 7026271631 0645461502 5720740248 1637773389 6385506952
6066834113 7273873722 9289564935 4702576265 2098859693 2019650585 5476470330 6793654432 5476327449 5125040606
9438147104 6899465062 2016772042 4524529612 6879465461 9316517468 1392672504 1038025462 5965686914 4192871608
2938031727 1436778265 4877566485 0856740776 4845146443 9940461422 6031930967 3540257444 6070308096 0850474866
3852313818 1676751438 6674766478 9088143714 1985494231 5199735488 0375165861 2753529166 1000710535 5824987941
4729509293 1138971559 9820565439 2871700072 1808576102 5236889213 2449713893 2037843935 3088774825 9701715591
0708823683 6275898425 8918535302 4363421436 7061189236 7891923723 1467232172 0534016492 5687274778 2344535347
1000桁目

尚、

log(1+x)=  x - x2
―――
+ x3
―――
- x4
―――
+ x5
―――
 -・・・        @
log(1-x)= -x - x2
―――
- x3
―――
- x4
―――
- x5
―――
 -・・・        A


を使って、@-Aで 偶数項が消滅する

  (1+x)
log―――=
  (1-x)
2{x+ x3
―――
+ x5
―――
+ x7
―――
+・・・}                   

ここで、x=1/3とすると log2。


!★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
!★ln2の計算★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
!★log2=2{1/3+1/3・3^3+1/5・3^5+1/7・3^7・・・}★★★★★★★★★★★★★★★★★★★★
!★★★★★★★★★★★★★★★★★★★★★★100桁処理版★★★★★★★★★★★★
!★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

!――(宣言文)――――――――――――――――――――――――――――――――――
OPTION ARITHMETIC DECIMAL_HIGH
option base 0
!――――――――――初期設定――――――――――――――――――――――――――
LET BLOKS=100 !100桁区切り
LET JJJ=10^BLOKS
LET QQ=JJJ-1

print "■■■■■■LOG2の計算開始■■■■■■■■■■"
input PROMPT "何桁まで計算しますか?":KTA_2
LET KTA=KTA_2/BLOKS*1.05 !桁数へ変換 5%マージン追加
print "計算開始時間:";date$,time$

print "KTA=";KTA
!――配列を準備する―商・余・Σ・基底――――――――――――――――――――――――
dim SYO(KTA*2),JOYO(KTA*2),(KTA*2),BASE(KTA*2)
! ――――――――――――――――――――――――――――――――――――――――
!★log2=2{1/3+1/3・3^3+1/5・3^5+1/7・3^7・・・}★★★★★★★★★★★★★★★★★★★★

!項数の項数計算 kou
!項数=(log2+KTA_2-logk)/log3
LET kou=(0.3010+KTA_2)/0.477

print "項数:";int(kou);"項まで"

!★★★★★★★★第1項は、1/3★★★★★★★★★★★★★★★★★★★★
LET BASE(0)=1
LET DIV_X=3
for I=0 to KTA
LET JOYO(I)=BASE(I)
NEXT I
GOSUB 600 ! 1/3の計算


for I=0 to KTA
LET BASE(I)=SYO(I)
LET (I)=BASE(I)
! print BASE(I)
NEXT I

!★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
!★log2=2{1/3+1/3・3^3+1/5・3^5+1/7・3^7・・・}★★★★★★★★★★★★★★★
!★★★★★★★第3項以降の計算★★★★★★★★★★★★★★★★★★★★
for k=3 to kou step 2
! print "k=";k
GOSUB 1100 !そろばんリセットルーチン SYO と JOYOを0にする

for I=0 to KTA
LET JOYO(I)=BASE(I)
NEXT I

!★★前の項(BASE)を3^2で割る
LET DIV_X=9
GOSUB 600 !答えはSYOで返ってくる

!★★この項をBASEに一旦保存する
for I=0 to KTA
LET BASE(I)=SYO(I)
! print BASE(I)
NEXT I

!★★前の項(JOYO)をkで割る
LET DIV_X=k
GOSUB 600 !答えはSYOで返ってくる

!★★狽ノ足す
for I=1 TO KTA
LET (I)=(I)+SYO(I)
NEXT I

next k


!最後に2倍し、桁上げ処理する
FOR I = 0 TO KTA
LET (I)=2*(I)
NEXT I
GOSUB 910 !桁上げ処理

!印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷
print "計算終了時刻:";date$,time$
print str$((0));"."
FOR I =1 TO KTA
LET p$=repeat$("0",100-LEN(str$((I))))&str$((I))
print mid$(p$,1,10);" ";mid$(p$,11,10);" ";mid$(p$,21,10);" ";mid$(p$,31,10);" ";mid$(p$,41,10);" ";
print mid$(p$,51,10);" ";mid$(p$,61,10);" ";mid$(p$,71,10);" ";mid$(p$,81,10);" ";mid$(p$,91,10)
if I/10=int(I/10) then print str$( I*100);"桁目"
NEXT I
!印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷印刷

stop

600 ! *DIV_X
! ■■■■■■■■■■割算■■■■■■■■■■■■■■■■■■■■■■■■
! *******ソロバン・ルーチン開始*********************
for I= 1 to KTA
! 商を計算
LET SYO(I)=int((JJJ*JOYO(I-1) + JOYO(I)) / DIV_X)
! 余りを算出
LET JOYO(I)=(JJJ*JOYO(I-1) + JOYO(I))-SYO(I)*DIV_X
next I
! ******ソロバン・ルーチン終了!!******************
! ***商の結果を余りへ置換え*****
for I=1 to KTA
LET JOYO(I) =SYO(I)
next I
! ***置換え終了!****************
return


! ■桁処理■■■■■■■■■■■■■
910 ! *KEA_UP
FOR G_KTA=KTA to 1 step -1
LET (G_KTA-1)=(G_KTA-1)+int((G_KTA) / JJJ)
LET (G_KTA)=MOD( (G_KTA) , JJJ )
next G_KTA
return
! ■■■■■■■■■■■■■■


! ■■リセットルーチン■■■■■
1100 ! *RE_SET
for I =0 to KTA
LET SYO(I)=0
LET JOYO(I)=0
next I
return
! ■■■■■■■■■■■■■■■


END