Skip to main content

0 とプラスの関係


8 歳の T 君が 7 について学んでいる.7 はどんな加算によって作られるかというものである.ここで利用している教材の一つは図 1 にあるような Zahlenhaus というものである.2つの部屋があり,それぞれに何人かがいる.全体で何人が一つの家にいますか? ということで加算というものを考えるものである.

Figure 1. Zahlenhaus: 7 = 4 + 3
Figure 2. Zahlenhaus: Questions
そこには,

  •  7 = 3 + ?
  •  7 = 4 + ?

のような問題(図2)があり,? を埋めるのである.T 君は上記の質問にはまったく問題なく答える.

しかし,次の質問がわからないという.

  • 7 = 0 + ?

ところで,学ぶ時,何がわからないのかをわかっているというのはとてもやりやすい.私自身,数学の本を読んでいてどこでわからなくなったのかをみつけるのに苦労することがある.そしてわからない部分がわかれば道が見えることが多い.どこがわからないかわからないと,どこまで本を戻ればいいのか見当がつかないからである.

さて,Zahlenhaus に戻ろう.左の部屋には誰もいない.右の部屋には何人いる?と尋ねると,2 + 5 人とか3 + 4 人という.私はこれには困った.つまり,T 君は

  • 7 = 0 + 2 + 5

と答えたのである,これは数学的にはまったく正しい.一つの部屋をまとめて数えなくてはいけない理由は特にないし,そういう仮定を明確に言ったわけではない.だいたい最初に 7 はいくつといくつ? というように聞いているのは練習の意味が強い.7 は 7 である.と答えて間違いはない.これはゲームだと思ってもらった方がいいかもしれない.

しかし,それぞれの部屋に一つだけ数字を割り当てるという暗黙のルールによって 7 = 0 + 2 + 5 は間違いとされる.Zahlenhaus には部屋が 3つないからである.もし,Zahlenhaus に部屋が 3つあれば,これは正しくなる.しかし,ある計算が部屋の数で間違いだったり正しかったりするのは逆に混乱するのではないだろうか?

私はよくチャールズ・ドジソン(ペンネーム: ルイス・キャロル)の本「鏡の国のアリス」を思い出す.

王とアリスが出あった時の会話である.(残念ながら日本語は no- の形を翻訳するのが難しいので英文をつけておく.)
「...その道を見よ,そしてわしに告げるがよい.もしそなたがどちらか片方でも見ることができたのであれば.」
「道には誰もいないのが見えるわ.(I see nobody on the road.)」アリスは答えました.
「そなたのような目が持てたならな.」王はいらだったような声で言いました.「『誰もいない』のが見えるとな!(To be able to see Nobody!)」 [Quote 1]
Zaehlenhause の片方の部屋には誰もいない.誰もいないということを記すにはどうするのか,人類は長い年月が必要だった.誰もいないということを 0 人がいると記すのは簡単なことなのだろうか.たとえば,0 人がいないということは,0人ではないということであるから誰かいることにはならないか.0 人はいる.ないということ(0人)がその部屋にある.もし,これが彼の問題であったらこれはなかなか難しい.しかし,話をしていくうちに 0 がそこにあるというのは問題ないらしいことがわかった.誰もいないということを記す方法として 0 を書くということがわかったのかどうかはわからないが,誰もいない部屋を機械的に 0 と呼ぶというのはよいらしい.

では一つの部屋の人数を一つの数字で示すということが難しいのだろうか.「普通」一つの数にまとめられるだけまとめるのは,後に比較をするのが簡単だからである.1 + 1 + 1 + 1 + 1 + 1 + 1 と 1 + 1 + 1 + 1 + 1 + 1 とを比較する時,7 と 6 を比較するのでは 7 と 6 を比較する方が人間には簡単である.だから0+ x を x と書くのが「普通」である.「普通」なのはある機能として簡単になるからである.「普通」というものと「正しい」というのは時に異なり,「正しい」かどうかの方が数学では重要である.

私は思った.またアリスだ.私はアリスほど数学的な本はないと友人に説明しようとしたことがある.
アリスが白の女王に尋ねられる.「足し算はできるかえ?一たす一たす一たす一たす一たす一たす一たす一たす一たす一たすは何だい?」
「わからないわ,何回一と言ったのか聞き逃したの」とアリスは答えました.
「この子は足し算ができないね.」赤の女王が割り込んで言いました.「引き算はどうだい.8から9を引いたらいくつかえ?」
「8から9は引けないわ.あたりまえでしょう」アリスはすばやく答えました.「でも...」
「この子は引き算もできないね.」白の女王が言いました.「割り算はどうかね.パンをナイフで割ったらどうなるかね?」 [Quote 2]
どんどん分解していくと,白の女王の問題になってしまう.しかし,ある意味白の女王は正しい.どんな自然数も1の足し算でできているのだ.それをなんとか説明できないものだろうかと思った.

私は T 君に,2 ユーロのアイスを買いたい時,1 ユーロ持っていたらいくら母親にねだるんかを尋ねた.すると,1 ユーロと答えた.では,1 ユーロも持っていなかったら? つまり 0 ユーロ持っている時は,彼は 2 ユーロと答えた.それでは 7 ユーロ欲しい時,なにも持っていない,つまり 0 ユーロ持っている時は?と尋ねるとやはりわからないという.では 1 ユーロ持っている時は,6 ユーロと答えた.つまり以下が T 君の理解である.

  • 2 = 1 + 1
  • 2 = 0 + 2
  • 7 = 1 + 6
  • 7 = 0 + ? わからない.

私は困ってしまった.T 君はどういうモデルでこのような答えを出すのだろうか?結局,

  • 1 ユーロ欲しい時,1 ユーロ欲しいと言う.わかった.
  • 2 ユーロ欲しい時,2 ユーロ欲しいと言う.わかった.
  • 3 ユーロ欲しい時,3 ユーロ欲しいと言う.わかった.
  • では,7 ユーロ欲しい時は? 7 ユーロ欲しいと言う.ついにわかった.

T 君はこの後いくつかの 0 + x の質問に正しく答えたのであるが,今回私は彼が何をわかっていなかったのかわからなかった.だからこれで良いのかちょっと心配である.ところで,もしいつか数学を仕事に使う時があなたに来たら,その時あなたは数字を使うことはないだろう.現在,数字はコンピュータのものである.

Quote 1

Quote 1 は Lewis Carroll による Through the Looking Glass and What Alice Found There. Chapter 7, The Lion and the Unicorn. から.また,テキストは The Annotated Alice, the definitive edition, edited by Martin Gardner, Penguin books, page 234, ISBN-13: 978-0140289299 による.翻訳は私のものであり,間違いがあればそれは私による.

Quote 2

Quote 2 は Lewis Carroll による Through the Looking Glass and What Alice Found There. Chapter 9, Queen Alice, Through the Looking Glass and What Alice Found There. から.また,テキストは The Annotated Alice the definitive edition, pp. 265-266, Penguin books, ISBN-13: 978-0140289299. による.翻訳は私のものであり,間違いがあればそれは私による.

Comments

Popular posts from this blog

複数の線を持つ線グラフを Jenkins の plot plugin で描く方法

私は毎夜のソフトウェアテストを自動化するために Jenkins というツールを使っています.今回は, valgrind  を使ってメモリーリークのテストを自動化することにし ました.その際,エラーの数の結果をグラフとして表そうと思って, Plot plugin  を使うことにしました. Plot plugin の例図からは,複数のデータラインを描くことができるのは明らかなのですが,どうやったらいいのかは参照のページや,例としてあった Perl script,plugin 中の help からは私にはよくわからなかったのです. ここで重要な考えは,それぞれのデータラインにはそれぞれの出力ファイルが必要ということでした.私はこれを誤解していました. 例として,ビルドの時に次の property データファイルを出力します.それぞれのファイルが1つのデータラインを表します. valgrind_trunk_result.definitely.property valgrind_trunk_result.indirectly.property valgrind_trunk_result.possibly.property それぞれのデータの中身は1行のデータ点です.たとえば, valgrind_trunk_result.definitely.property ファイルの中身は次のような1行 です. YVALUE=0 このファイルを ${WORKSPACE} ディレクトリ以下に出力します.ここで," WORKSPACE " は jenkins が提供する環境変数です. 図1が私の plot plugin の設定を示しています.これは jenkins の config 画面です.3つの data series があって,それぞれにデータファイルがあります. Figure 1: Plot plugin configuration in Jenkins 図2が結果です.複数の線が描かれているのがわかります.(実際には 3 本の線がありますが,最初の線と2番目の線が同じデータなので,重ねって見えません.) Fugure 2: Plot data with multiple data lines

共有メモリによるプロセス間通信

Unix の共有メモリを使ったプロセス間通信について調べて実験をしてみた.対象は1つのホスト上での複数のプロセスである.ネット上でいくつか例題はないかと探したが,どうも良い例となるコードが見当たらなかった.結局はある解説記事と,Stack Overflow の議論と,man page を見て作ってみたものになったので,例をここに置くのも有用かと考え,この記事を書く.(もしかしたら探し方が悪くて良いコード例をみつけられなかっただけかもしれない.) mmap を使うかどうかという話がいくつもでていたが,POSIX の方向としては,shmem_open と mmap を使うという方向があるということだったので,それを信じてその形での実装を試してみた. 基本的なコードの流れは次のようになる. 共有メモリ領域を1つのプロセスが shm_open() を使って作成する.その際に,プロセス間で共通の文字列を識別子(``identifier'')とする.(Linux ではこれが /dev/shm/identifier のように見える.) 共有メモリ領域を mmap() でメモリにマップする.共有メモリポインター (shared_ptr)が得られる. shared_ptr を使って複数のプロセスで通信をする. 利用終了後は munmap() をつかってマップを消す. 共有メモリオブジェクトを shm_unlink() によって消す. 以下に示すプログラムは,server と client の2つのプロセスが共有メモリを使って通信をするものである.ここで,server プロセス数と client プロセス数は共に 1 を仮定する.server と client は自分の領域にしか値を書き込まないことで,ロックを避けている.互いに相手の値を読み,それよりも1大きい数を一定の期間ごとに自分の領域に書くという例題である.シンプルではあるが,共有メモリで通信をする基本としては十分なものだと思う.ソースコード(shmem_test.cpp)を以下に付加する.ソースコードのコメントにコンパイル方法とどのように利用するかを書いておく. /*   Shared memory inter process communication minimal exa...

Scratch を学ぶ (2)

前回は scratch というプログラミング環境がどういうものかを簡単に話しました.そこではイベントという考えを使ってプログラムが動きます.今回はこの環境でキャラクターを動かした10歳の生徒の話です. この Scratch というプログラミング環境では,キーイベントというイベントの一種が提供されています.たとえば,「右の矢印キーを押す」というイベントがあります.このイベントが起こると,x を 10 増やすというようなプログラムを書きます.すると,右の矢印キーを押すたびに猫を右に動かすことができます.これを上下左右のキーでそれぞれ行うことで,キーを使って猫を移動させることができます. 今日の生徒はドラゴンを登場させて,同じことをしました.するとなんと,猫もドラゴンも全く同じ動きをしてしまいます.まあ,そのようにプログラムしたので当然です.コンピュータはとても速く計算し,とても正確で,そしてとても愚かなものです.書いたとおりのことしかしません.その生徒はドラゴンを速く動かしたいと言いました.私は動く量を変えましょうと答えました.今は1回のキーを押すと,動く量が 10 です.速さとは一定時間に動く距離のことですから,これを増やせば速度は思いのままに変えられます.しばらくしてどうしたかなと思って見たら,この生徒はなんと,同じキーイベントをもう1つ作っていました. つまり,右矢印のイベントが発生すると,2つのプログラムが起動するのです.1つのプログラムは10右へ移動であり,2つのプログラムでは合わせて20の移動になります.この環境では並列に動く部分でもちゃんと考慮されているようにできているらしく,これで正しく2倍の速度で動くのです.3倍速く動かすためには,もう1つプログラムを起動すればできます.なんという発想! 私はジョジョという漫画の1シーンを突然思い出しました.主人公がスタンドで浮くという場面です.(知らない人はすみません) 仗助がスタンドに押されて移動する場合,私の発想はスタンドの押す速度を変えることでしたが,この生徒の発想はスタンドの数を増やすことだったのです. しかし,この生徒の方法では基本的に整数倍にしか速くできません.もちろん1つのプログラムがキャラクターを10押して,もう1つが同じキャラクターを5押すとすれば 15 押すことになり.1.5 倍の...