Help us understand the problem. What is going on with this article?

# 【数理考古学】常用対数表(Table of Common Logarithms)を使った計算

```#剰余算が指数関数では添字上の加減算に置き換えられる。
> 8*32
[1] 256
> 2^3
[1] 8
> 2^5
[1] 32
> 2^(3+5)
[1] 256
> 2^(8)
[1] 256
```

この考え方を応用すれば指数・対数関数(Exponential/Logarithmic Function)の計算を配列の検索に置き換えられるのです。近世以降の科学計算の急発展に欠かせなかった「対数表」概念の登場ですね。

```#配列が整数を直接扱えないので工夫
a0<-array(1:121,dim=c(11,11))
i0<-c(1:11)
c0<-seq(-5,5,length=11)
for (i in i0){
a0[i,]<-2^(c0+(i-6))
}
#-5~0~5を1~11に変換
Ind<-function(x){x+6}

#計算を配列検索に置き換える関数
Culc2<-function(x,y){
a0[Ind(x),Ind(y)]
}
```

```> a0
[,1]        [,2]       [,3]      [,4]      [,5]     [,6]    [,7]    [,8]
[1,] 0.0009765625 0.001953125 0.00390625 0.0078125  0.015625  0.03125  0.0625   0.125
[2,] 0.0019531250 0.003906250 0.00781250 0.0156250  0.031250  0.06250  0.1250   0.250
[3,] 0.0039062500 0.007812500 0.01562500 0.0312500  0.062500  0.12500  0.2500   0.500
[4,] 0.0078125000 0.015625000 0.03125000 0.0625000  0.125000  0.25000  0.5000   1.000
[5,] 0.0156250000 0.031250000 0.06250000 0.1250000  0.250000  0.50000  1.0000   2.000
[6,] 0.0312500000 0.062500000 0.12500000 0.2500000  0.500000  1.00000  2.0000   4.000
[7,] 0.0625000000 0.125000000 0.25000000 0.5000000  1.000000  2.00000  4.0000   8.000
[8,] 0.1250000000 0.250000000 0.50000000 1.0000000  2.000000  4.00000  8.0000  16.000
[9,] 0.2500000000 0.500000000 1.00000000 2.0000000  4.000000  8.00000 16.0000  32.000
[10,] 0.5000000000 1.000000000 2.00000000 4.0000000  8.000000 16.00000 32.0000  64.000
[11,] 1.0000000000 2.000000000 4.00000000 8.0000000 16.000000 32.00000 64.0000 128.000
[,9] [,10] [,11]
[1,]   0.25   0.5     1
[2,]   0.50   1.0     2
[3,]   1.00   2.0     4
[4,]   2.00   4.0     8
[5,]   4.00   8.0    16
[6,]   8.00  16.0    32
[7,]  16.00  32.0    64
[8,]  32.00  64.0   128
[9,]  64.00 128.0   256
[10,] 128.00 256.0   512
[11,] 256.00 512.0  1024
>
#関数のテスト例
> 2^(0+0)
[1] 1
> Culc2(0,0)
[1] 1
> 2^(0+1)
[1] 2
> Culc2(0,1)
[1] 2
> 2^(0+2)
[1] 4
> Culc2(0,2)
[1] 4
> 2^(0+3)
[1] 8
> Culc2(0,3)
[1] 8
>
> 2^(1+0)
[1] 2
> Culc2(1,0)
[1] 2
> 2^(1+1)
[1] 4
> Culc2(1,1)
[1] 4
> 2^(1+2)
[1] 8
> Culc2(1,2)
[1] 8
> 2^(1+3)
[1] 16
> Culc2(1,3)
[1] 16
```

# 常用対数表(Table of Common Logarithms)

ジョン・ネイピアが20年かけた対数表について - Qiita

コラム 三角関数表 | 江戸の数学

コラム 対数表 | 江戸の数学

この方法が便利であるのは1,034×2,213×3,256×4,378のように掛け算を何度も繰り返す計算がlog10(1,034)+log10(2,213)+log10(3,256)+log10(4,378)という足し算に置き換わることです。

（対数表に関する）正確な答を求めるには、1.000001のようにもっとずっと1に近い数の累乗が必要となる。そうすると表がはるかに長くなり、累乗の数が100万個などになってしまう。その表を作るための計算は、とてつもない大事業となる。しかし1回だけやればいい。誰か自分を犠牲にする恩人が最初にその努力を割いてくれれば、その後の世代は大量の計算をしなくて済むようになるのだ。

ジョン・ネイピア「素晴らしき神の数表解説MIRIFICI Logarithmorum Canonis descriptio、1614年）」序文

```#常用対数表(Table of Common Logarithms)の作成
Ind00<-c(seq(1.0,10.0, by = 0.01))
Log00<-c(round(log10(Ind00),digits =4))
ToCL00<-data.frame(Numbers=Ind00,Log10=Log00)
plot(ToCL00,type="S",main="Table of Common Logarithms")
```

```#この表を使って実際に計算してみる。例えば1.43×5.93。まずは計算結果を確認。
1.43*5.93
[1] 8.4799

#とりあえずlog10(1.43)を求める。Numbersに1.43が収録されてる列から0.1553が取り出される。
> ToCL00[ToCL00\$Numbers==1.43,2]
[1] 0.1553

#次いで log10(5.93)を求める。Numbersに5.93が収録されてる列から0.7731が取り出される。
> ToCL00[ToCL00\$Numbers==5.93,2]
[1] 0.7731

#0.1553と0.7731を合計すると0.9284。とりあえずこれに最も近い最小の数字を答えとしてみると8.48が得られる。
> 0.1553+0.7731
[1] 0.9284
> Results00<-ToCL00[ToCL00\$Log10>=0.9284,1]
> Results00[1]
[1] 8.48
```

```#次は1,034×2,213を計算してみる。こちらもまずは計算結果を確認。
1034*2213
[1] 2288242

#「手計算」には人間に理解しやすくするテクニックが盛り込まれている。まずはlog10(1034)を求めよう。
log10(1034)
[1] 3.014521

#log10(10)=1, log10(100)=2,log10(1,000)=3, log10(10,000)=4だから、まずはlog10(3+1.034）の形に変換。
round(log10(1034), digit=0)
[1] 3

#さらに1.034を1.03に丸める事でNumberに1.03が収録されてる列のLog10から0.0128が取り出せる。合計すると3.0128。
> ToCL00[ToCL00\$Numbers==1.03,2]
[1] 0.0128
> 3+0.0128
[1] 3.0128

#次いで log10(2213)を求める。
log10(2213)
[1] 3.344981

#同様にまずはlog10（3+2.213）の形に変換。さらに2.213を2.21に丸めるとNumbersに2.21が収録されている列から0.3444が取り出せる。合計すると3.3444。
> ToCL00[ToCL00\$Numbers==2.21,2]
[1] 0.3444
> 3+0.3444
[1] 3.3444

#そして3.0128と3.3444を合計すると6.3572となる。
> 3.0128+3.3444
[1] 6.3572

#log10(1,000,000)=6を分離。表上で残りの0.3572以上の最小の数字が2.28なので得られる答えは2.28の10の6乗、すなわち2,280,000となる。
> Results00<-ToCL00[ToCL00\$Log10>=0.3572,1]
> Results00[1]
[1] 2.28
>2.28*10^6
[1] 2280000
> 10^6.3572
[1] 2276145
```

「コンピューターの時代」が人類に与えた影響は？

チャールズ・バベッジは機械式の自動計算機としては非常に大規模なものを設計し制作。1833年には数表作成用の階差機関の開発からより汎用的な解析機関へと興味を移したが、この時にジャカールのパンチカードをプログラムの表現に使った（ジャカード織機では、カードの穴は経糸の上げ下げを直接示すだけだが、これはコード化である）。

1835年に記されたその解析機関についての記述によれば汎用のプログラム可能なコンピュータであり、入力にはパンチカード、動力源には蒸気機関を採用し、歯車や軸の位置で数値を表すものとされている。元々は対数表を高精度で作成することを目的としていたが、すぐにそれ以外の用途にも使える汎用プログラム可能コンピュータとして構想を発展させたが、機械製作を担当した職人との不和など様々な要因が重なって頓挫。プロジェクトへのイギリス政府の出資も中止となった。

ちなみにこの頃、ジョージ・ゴードン・バイロンの娘エイダ・ラブレスがFederico Luigi, Conte Menabrea の著した "Sketch of the Analytical Engine" を英訳し、大量の注釈を付記している。これが世界初のプログラミングについての出版物とされる。またダブリン出身の会計士 Percy Ludgate はバベッジの業績を知らなかったが、独自にプログラム可能なコンピュータを設計し、1909年に出版した著作にそれを記している。

それにつけても、どうしてコンピューターの発達速度は現代に近くほど急加速するのか。そのヒントは以下の様な「障害」の消滅にある様で、この事が話をややこしくさせるのでした。
ゼロックスの「Alto」は、なぜ成功できなかったのか──パソコンの歴史を決定づけたプレゼンの舞台裏

ゼロックス社長のデヴィッド・カーンズは、のちにアルトのプレゼンテーションを「テクノロジーの祭典」と呼び、「テクノロジーの未来を見たと誰もが口々に言っており、非常に印象深かった」と振り返っている。だが、プレゼンテーションを終えたPARCのチームは、幹部のそんな熱意などまったく感じなかった。

それどころか、その場で実際に体験できる時間を設けた際、アルトの前に座ってキーボードを操作し、マウスを試していたのは、ゼロックスの幹部ではなく彼らの妻たちだった。キーを打つのは女性事務員の仕事と考えているらしい夫たちは心を動かされた様子もなく、腕組みをして会場の端から遠巻きに眺めているだけだった。

Why not register and get more from Qiita?
1. We will deliver articles that match you
By following users and tags, you can catch up information on technical fields that you are interested in as a whole
2. you can read useful information later efficiently
By "stocking" the articles you like, you can search right away