今回は、立方数について考えてみる。
ある4桁以上6桁以下の自然数nがあったとき、それが立方数かを手計算で判定することを考える。
もし自然数nが立方数であるならば、nの3乗根を示せ。
どんなアルゴリズムを使えばよいのだろうか。
まず、1から10までの立方数を、予め求めておき、立方数の下1桁を抜き出す。
a | a^3 | a^3 mod 10 |
1 | 1 | 1 |
2 | 8 | 8 |
3 | 27 | 7 |
4 | 64 | 4 |
5 | 125 | 5 |
6 | 216 | 6 |
7 | 343 | 3 |
8 | 512 | 2 |
9 | 729 | 9 |
10 | 1000 | 0 |
1列目と2列目のそれぞれの下1桁を見比べると、
1⇔1
2⇔8
3⇔7
4⇔4
5⇔5
6⇔6
7⇔3
8⇔2
9⇔9
0⇔0
のような写像をしている。
よくみると、
自分自身に行くのが、
{ 0, 1, 4, 5, 6, 9 }
(10-自分自身)に行くのが、
{ 2, 3, 7, 8 }
と2つのグループに分けられるということ。
ここで、2列目の末尾1桁を3列目に示す。
これが下準備です。
記憶力のある人ならば暗記出来る量でしょう。
ある6桁の自然数ABCDEFがあります。
1) 立方数かの判定として、まず下から3桁で分けます。
ABC DEF
2) Fを先の表の3列で探し、1列目の値を一の位とします。
3) ABCが2列目のどこの間に存在するのかを調べ、1列目の値を十の位とします。
a^3≦ABC<(a+1)^3
aを求めます。
4) 十の位と一の位で2桁の値が求まりましたので、これを3乗します。
これが、ABCDEFと等しければ、ABCDEFは立方数で、ABCDEFの三乗根であるということです。
試してみます。
195112
195 112
2→8
125≦195<216
125→5
52^3=195112=195112 立方根 三乗根は52
17576
17 576
6→6
8≦17<27
8→2
26^3=17576=17576 立方根 三乗根は26
123456
123 456
6→6
64≦123<125
64→4
46^3=97336≠123456 立方根ではない
手計算で、結構簡単に判定出来ますね。
実質4桁未満であっても、そこまでは準備しているので求まりますね。
さて、こういったアルゴリズムを考えていると、
人間的には簡単なこと、
コンピュータ的には簡単なこと、
というものは、違うということを再認識する。
今回のアルゴリズムは人間的には簡単な方法であるが、
プログラミングでやると、これは殊の外手間が掛かっていることが解る。
つまり、人間とコンピュータでは得意とするものが根本的に違うということでもあります。
私が数学で解を見つける場合と、プログラミングで解を見つける場合があるのは、それらの守備範囲が似ているようで似ていないくて、アプローチは案外違っていることに他なりません。
まったく同じアルゴリズムを使っていたとしても、
私が始めて買った30年前のパソコンでは1日経っても答えが導き出せなかったことが、
今のパソコンでは1秒も掛からずに答えを導き出してしまうこともあります。
ただ、コンピュータの性能におんぶにだっこというのは、プログラマとしてはいかがなものかと考えます。
限られたメモリ空間、ディスク容量を使ってどうにかして答えを素早く導き出したい。
そのためのアイディアや工夫に満ちあふれていました。
今は、マシンパワーを使って力任せに解を解くことも出来てしまいますし、当時のアイディアや工夫なんて蹴散らしてしまうほどです。
だからと言って、力任せのプログラムばかりを書いていると、なんだか負けた気がするんです。
ハードウェアは進化し続け、コンパイラの性能も進化し続けています。
だからと言って、そこにあぐらをかいていて良いのかというと、そうではないでしょう。
それを使う人間も、進化するべきですよね。
ではでは