二進法(0と1だけの世界)
0、数字は10個しかないのにどうして全ての数を表すことができるの?
T:数字っていくつある?
S:そんなのいくつでもあるよ。
T:本当かな?
S:あっ、そうか。数字は10個しかない。
S:たった10個の数字でどんな大きな数でも表せるんだから不思議だね。
T:では、もし数字が0と1しかなかったら、どうなるだろう。
S:簡単でいいや。
S:でも、数えるときに困らない?
S:2はどうやって表せばいいんだ?
S:コンピュータは0と1しか知らないということを聞いたことがあるから、2も0と1で表せるんではないの?
S:10個の数でどんな数でも表せるんだから2個だってできるよ。
S:じゃあ、どうやって2を表すの?
S:十は繰り上がるだろ。同じで、1の次は繰り上がって10にすればいいんだ。
S:ということは、3は11か。で、次の4は一の位も繰り上がり、十の位も繰り上がるから100。
S:そして、101、110、111、1000・・・となるわけか。
T:よく考えたね。さて、ここに変換ソフトがあるから、いろいろな数字を入れて確かめてみて。
≪ジオジェブラの表計算で変換する≫
T:このように、0と1だけで数を表す方法を二進法といい、表された数を二進数という。
S:ということは、今までの表し方は、10進法ということか。
S:コンピュータはどうして二進法なの?
T:電気が流れている(ON)を1、流れていない(OFF)を0とするとONとOFFだけで表すには二進法が便利だからじゃない。S:ということは、豆電球を何個か並べておいて、それをON・OFFにするだけで数字を表せるということだね。
S:それは簡単だ。それにさ、計算も簡単だよ。
1、二進法の計算は簡単!
S:二進法の計算ってどうやってやるの?
S:1+1=繰り上がって10だ。
S:1+0=1と0+1=1と1+1=10さえわかれば後は簡単だよ。
S:例えば、11001+10001=101010か。
T:じゃ、111+111=?
S:1110だ。
T:この計算が正しいかどうか、さっきの変換ソフトで確かめてみよう。
S:まず、111を十進数に直すと7だから、7+7で14。
S:14を二進数に直すと、1110になった。
T:ということは、この計算方法は正しいということだね。
S:十進法でやるよりもこっちのほうがはるかに簡単だよ。
S:だから、コンピュータは二進法で計算しているのか。
S:でも、桁数がめちゃくちゃ大きくなってしまうよ。
S:コンピュータは記憶容量が大きいから大丈夫だよ。
S:掛け算だって、1×1=1で0×1=0だからもっと簡単だ。
S:ということは、コンピュータは十進数を二進数に直して計算し、それをまた、十進数に直しているのかな。めんどくさいようだけど、かえって簡単かもしれない。
2、そもそも世界は0と1で出来ている
S:数が0と1で表せることはわかったけど、デジタルって0と1で表されているということでしょ。どうやって0と1で文字を表せるの?
S:そういえば、CDやDVDなんか0と1だけで表していると聞いたな。音や絵をどうやって0と1で表せるんだ?
T:まず文字だけど、それは数字を文字に当てるのさ。
S:数字を文字に当てはめたら、その数字は使えないじゃない。
T:おっと、数字(自然数)は無限にあることを忘れているよ。日本語の文字なんかせいぜい51個だろ。漢字だって無限にあるわけじゃない。
S:でも、数字を5000個も使ったら、その数字は使えないんでしょ。
T:だから、5001を1とすれば全ての数を表すことができるよ。
S:5002は2ということ?
S:計算は5001+5002=5003だから3になるということか。
S:無限にあるということは便利なんだね。
S:文字はわかったけど、音や絵はどうするの?
T:音も数字で表すことができる。音色と高さと大きさの3組の数を使えばいいよ。絵は一点一点の色を決めればいい。色は赤黄青の三原色でできるよ。このパソコンのディスプレーを30倍の顕微鏡で見ると3つの色に分かれていることがわかる。
S:そうやっていくと、どんなことでも0と1で作ることができるということですね。
T:もっともそれは、コンピュータの中だけだね。
3、片手でいくつまで数えられる?
T:片手を折り曲げていくつまで数えられる?
S:片手だったら5つまでに決まっているよ。
T:実はもっとたくさん数えることができるんですよ。
S:二進法を使うんですね。
T:最初に指を折り曲げるている。右手の親指を立てて1とする。次の2は、二進法では10だから、指では?
S:人差し指を立てて親指を折る。
S:そうか。そうすると、3は親指を立てる。
S:4は中指だけ立てて、後は折るんだ。
S:こうやって数えれば、5・6・7・・・
S:31まで数えれる。
T:二進法で11111だから、これを十進数に直すと・・・
S:さっきの変換ソフトを使えば求められるけど、計算で出せないの?
T:24+23+22+2+1=16+8+4+2+1=31で求められるよ。
S:ソフトもこうやって計算しているんだね。
4、二進法でそろえる
T:左の図のように数の上に穴を造る。次に、それぞれ数ヶ所この穴を切る。
どういう法則で穴を切っているかわかるかい?
S:二進法でしょ。
S:きっているのが1で、切ってないのが0だ。
S:さっきの指で数えるのと同じだよ。
T:このように15までの数のカードが作ってある。このカードを順番がばらばらになるようにシャッフルする。さて、これを一切中を見ずにこの爪楊枝だけで1から順番に並べてみるよ。
S:穴を使うの?
T:そうです。この爪楊枝をまず一番右の穴に通す。そして持ち上げる。これを残ったカードの手前に持ってくる。次は2番目の穴に通す。そして持ち上げ同じように前にやる。こうやって順番に4回やっていくと・・・。(穴は5つ作ってあるけど5番目の穴は使ってない。)
S:本当だ。1から順番に並んでいる。
S:どうして?
T:15のカードはどうなっている?
S:4つ穴が切ってある。
S:ということは、15は一度も持ち上げられていない。
S:だから最後まで残るんだ。1は逆だね。
S:それでそろうのか。
「二進法で数を当てるパズル」
T:0から7までの数の中から1つ数を選んでください。
S:それを当てるの?
T:そうです。でも、質問をするよ。その質問はイエスかノーで答えるだけ。さて、最低何回質問すれば見つけられるか?
S:わかった。まず半分にする。こちらですかと聞けば、どちらにあるかわかる。次に4つの数を半分に分ける。残りは2個だからもう一回質問する。だから、3回かかる。
T:そうですね。8個の数字から1個の数を見つけるためには、質問が3回必要だ。では半分に分けるという方法以外にないだろうか?
S:3回以内に見つけられる方法があるの?
T:いやいや、必ず3回は必要だよ。まず、カードを3枚用意する。1枚目には[1357]。2枚目は[2367]。3枚目は[4567]。あなたの選んだ数は1枚目にありますか?
S:はい。
T:2枚目にありますか?
S:はい。
T:3枚目にありますか?
S:はい。
T:あなたの選んだ数は、最初の数を全部足して1+2+3+4=7ですね。
S:当たった。
S:全部にあるのが7だから当たり前だよ。
S:でも、例えば3を選んだとすると、1枚目と2枚目だから合計すると3だな。
S:どうして合計で求まるんだろう。
T:さっきの穴の開いたカードで考えてみよう。1357に共通するのは?
S:一番右の穴が切ってある。
S:2367は2番目の穴が切ってある。
S:ということは、4567は3番目の穴が切ってある。
S:そうか。わかったぞ。
参考文献
「初めて出会うコンピュータ科学1〜8」・岩波書店・徳田雄洋著
5、スケルトン電卓の秘密
S:電卓も二進法が使ってあるんでしょう。でも、外から見る限り二進法が使ってあるなんてわからないね。
T:この前、スケルトン電卓を手に入れたんだ。半透明になっていて少し配線がわかる。これを見ていて、気がついたことがあるんだ。
S:配線が二進法なの。
T:配線だけ見てもわからないな。でも、この数字のディスプレーを接続する配線を数えてみて。
S:線がプリントされて並んでいるね。
S:エート、線が27本あるよ。
T:そうなんだ。この27本というのが何か意味を持っているのか考えてみたんだ。
S:先生って暇人だねえ。
T:暇人は考えた。なぜ27本なのか。
S:そういえば、ディスプレーの数字は8桁しか出ないよね。
T:そうなんだ。8桁と27本をつなぐものは何か?
S:電卓は二進法で計算されているんでしょ。十進法で8桁は、二進法では何桁になるの?
T:いいところに気がついたね。二進法で1桁は1まで。2桁は2。3桁になるのは4から。4桁は8。5桁は?
S:8=1000だから9=1001,10=1010,11=1011・・・
S:そんなめんどくさいことをしなくてもいいよ。2の5乗=16だよ。
S:16は二進法では8桁か。でも、このままいくと計算が大変だね。
T:そうですね。2の5乗でやっと2桁だからね。つまり二進法で5桁が十進法ではやっと2桁だ。でも、この計算で良いんだよ。2の10乗ではどうか?
S:電卓がいるな。2×を押して、=で2乗。また=で3乗。=を何回押せば8桁になるのかな。
S:オッ!26回目でエラーが出た。
T:エラーが出たということは、8桁を越えたということだね。
S:でも、27ではなく26だよ。
T:最初に2を入れているから2の27乗ですよ。
S:つまり、この配線は、二進法で27桁の数を十進数に直して表示しているということか。
T:電卓に二進法が使われていることが少しわかったね。
6、列車のポイントとフィボナッチ数
T:9ゲージで鉄道模型を作る時、鉄道の操車場の配線で、同じ8本でもフィボナッチ数列(1、2、3、5、8)で線路を引いたのと、二進法で(1、2、4、8)で線路を引くのはどっちが便利だろうか?
S:操車場って、線路を切り替える所?
T:そうだよ。線路を切り替えるのにポイントを使うだろ。その操車場の配線について考えたことがあるんだ。問題は、線路が8本の時の連結の仕方が二進数のときと、フィボナッチ数ではどう違うか。
S:二進数の切り替えってどういうの?
T:それは、この図のようになる。
二進数のポイント
1 |
2 1 /\0
/ \
/ \
/ \
4 1/\0 1/\0
/ \ / \
8 1/\01/\01/\01/\0
| | | | | | | |
切替の回数 3 2 2 1 2 1 1 0 =12
S:じゃフィボナッチ数のポイントとは?
フィボナッチ数のポイント
1 |
2 0/\1
/ \
3 0/\1 \
/ \ \
5 0/\1 | 1/\0
/ | | | \
8 0/\1 | 0/\1 | 1/\0
| | | | | | | |
切替の回数 0 1 1 1 2 2 2 1 =10
(1)どちらもポイントの数は7ポイントで同じ。
(2)ポイントを切り替えるのを1、切り替えないのを0とすると、切り替える回数の合計は、
二進数では12回、フィボナッチ数では10回と少なくなる。
(3)よって、下のようにフィボナッチ数で連結をした方が合理的。
T:つまりどの線路も同じ様に使うとすると、フィボナッチ数の方がポイントを切り替えるエネルギーが少なくて済むということなんだ。
S:同じように見えるのにどうして違いが出るんだろう。
T:「切り替える」と「切りかえない」をどれにするかで、違いがでるからなんだね。
7、木の枝わかれ
T:さっきのポイントを木の枝と考えると、どうなるだろうか。
S:木ということは、さっきの図を逆にすればいいんだな。
S:道や川に支流と本流があるように、木にも幹と枝があるよね。
T:そうすると、さっきの「ポイントを切り替える」を「枝を出す」と考えればどうなる。
S:二進法の枝分かれよりもフィボナッチ数の枝分かれの方が、あてはまっているのじゃないかな。
S:図を見ると、下の木の方が自然らしいよ。
S:私はどちらもありそうだと思うな。
二進数の木
枝の数 3 2 2 1 2 1 1 0 枝を出すスイッチの回数
8 \/ \/ \/ \/
\ / \ /
4 \/ \/
\ /
\ /
\ /
2 \/
1 |
フィボナッチ数の木
枝の数 1 2 2 2 1 1 1 0 枝を出すスイッチの回数
8 \/ | \/ | \/
\ | | | /
5 \/ | \/
\ \ /
3 \ \/
\ /
2 \/
1 |
T:フィボナッチ数の木の枝は、「枝を出す」が「ポイントを切り替える」エネルギーと同じだとすると、二進数の木よりも木全体のエネルギーが少なくて済むね。
S:でも、上の図だと、枝分かれの規則がわかりにくいな。
T:そうだね。では、左の図を見てください。まず、上の図の一番右の枝を幹とする。そして、枝は左右に交互に出す。枝分かれの規則は、2節育ったら枝分かれする。一度枝分かれした枝は、その後は一節で枝分かれする。こうすると6節で枝が8本になる。
S:そうか。7節目では枝は13本になるね。フィボナッチ数列だ。
S:私が木だったら、フィボナッチ数の方を選ぶな。
8、[二進木]を作ってみよう → 木の枝分かれについては【年輪の数学】のページへ
「二進数の木」を育てます。年数を半角で入力してください。ActiveX(L3)のソフトです。インストールすれば,すぐに見ることができます。
9、[フィボナッチ木]を育ててみよう
「フィボナッチ数の木」を育てます。枝の数も再帰命令で計算しています。さて、どちらが自然の木に見えるでしょうか。
10、分数を二進法の少数にするにはどうしたらいいか
5/8=(1/2)*(5/4)=1/2(1+1/4)=1/2+1/8
=0.101(2)
=1/2(1+2/8)=1/2(1+1/8+1/8)
=1/2(1+1/8+2/16)=1/2(1+1/8+1/16+2/32)
=・・・
=1/2+1/16+1/2+…
=0.100111…(2)
2/3=(1/2)*(4/3)=1/2(1+(1/4)*(4/3))=1/2(1+1/4(1+1/3))
=1/2(1+1/4(1+(1/4)*(4/3)))
=1/2(1+1/4(1+1/4(1+1/3)))
=・・・
=1/2+1/8+1/32+…
=0.101010…(2)
0.1(10)=1÷10 =(1/16)*(8/5)=1/16(1+3/5)
=1/16(1+(1/2)*(6/5))=1/16(1+1/2(1+1/5))
=1/16(1+1/2(1+(1/8)*(8/5)))
=1/16(1+1/2(1+1/8(1+3/5)))
=・・・
=1/24+1/25+1/28+1/29…
=0.000110011…(2)