絶対値の隠れ蓑2009年12月19日

 長い冬の夜は,気の置けぬ仲間数人と暖炉の傍で,遠い宇宙に想いを馳せたり,文学を論じたり,心の向くまま気の向くまま,語り合うのも楽しいものだ.
 人は,穏やかな揺らめく炎を前にすると,心が和み,想像の翼が羽ばたき始めるもののようだ.いつもの見慣れたことが,別の陰影に彩られて,違った姿で立ち現れてくる.

 情報科学っ! なんて肩肘張らずに,暖炉の前で,グラスでも傾けながら,思いを巡らせてみると,情報科学の世界の違った姿が見えてくるかも知れない.
 さぁ,暖炉の前に集まり,子供たちに世界の話をしよう.情報科学のトンネルを抜ければ,もう気分は「情報の国のアリス」.情報科学の目で見た "bit" な話.

プログラミングの構造

 先日,あるメーリングリストでプログラミング教育が話題になっていた.プログラミング教育といっても,高等学校普通科での話である.数年先に予定されている「(普通教科の)情報科」の内容に関することだと思えば良い.それを見ていて思い付いたことを,..

 そこには,

【問題1】
  「3つの数が与えられたとき,それを大きさの順に印刷しなさい」

という問題が例示されていた.さて,どうやってプログラムしようか.ここでは,2つの数で考えてみよう.最も単純な解は,

【コード1】
    get a, b
    if a > b
       then print a, b
       else print b, a

というものだろう.もう少し考えれば,「a や b といった変数名自体ではなく,その内容が大事なのだ」ということに気が付き,

【コード2】
    get a, b
    if a > b
       then M = a, m = b
       else M = b, m = a
    print M, m

という解を思い付くに違いない.【コード2】の優れている点は,入出力と問題の要点が分離されている点である.問題は,

【問題2】
  2つの数が与えられたとき …… 数の入力
  それを大きさの順に   …… 並べ替え
  印刷しなさい      …… 数の出力

というものであった.これを,素直にプログラムしたのが【コード2】なのである.
 【問題2】の分解に納得できない人は,いろいろなバリエーションを考えてみると良い.数が 2つではなく 3つの場合,印刷順が逆の場合,あるいは乱順の場合,印刷ではなくファイルに保存する場合,..共通しているのは,「準備し,処理し,後始末する」というパターンである.もっとも,これは,あらゆる作業について言えることである.
 では,肝心の並べ替えの方法に焦点を当ててみよう.

【コード3】
    if a > b
       then M = a, m = b
       else M = b, m = a

 メーリングリストには,次のような解も挙がっていた.

【コード4】
    M = (a + b)/2 + ABS(a-b)/2
    m = (a + b)/2 - ABS(a-b)/2

 ここで,ABS(x) は x の絶対値を返す関数である.いかにも,コーディング・オタクの答えそうな解であるが,しかし実は,そんなに奇抜という訳ではない.現に,私だって思い付いたのである(誓って,私はコーディング・オタクではありません).例えば,複素数の実部と虚部は,

Re(z) = (z + z*)/2
Im(z) = (z - z*)/2

と計算されるし,テレビの電波は,

輝度情報 …… 3原色の和
色情報  …… 差分

に分解されて送られている(だから,モノクロテレビでもカラー放送を見ることができる.もし,3原色で放送されたら,モノクロテレビではその内の一色だけしか見られず,見るに耐えない画像になるだろう).そう言えば,FMのステレオ放送も,

座標の回転
左右のチャンネルの和
左右のチャンネルの差分

になっている(お陰で,ステレオ対応でない受信機でも聞くことができる).もう少し数学的に考えれば,これは座標変換に対応している.a と b を二次元の座標上の点 P と考えれば,この点 P を図中の S と D で構成される座標で読みとったものである.これと最大,最小との関係は次のように考えることができる.

 もし,点 P が図中の座標軸 S より上にあれば,a の方が大きいから,a(= P の A 座標) を取る.S の線より下にあれば,S の線に関して対称な点 Q を取り,その点 Q の A 座標を取る.これで最大値を求めることができる.

この時の対称を取る操作が,ABS に対応しているのである.つまり,A-B 座標で考えた最大を,S-D 座標で絶対値を求めることに還元させたということである.

 【コード3】と【コード4】は,一見,非常に異なる解のように見えるが,実際の所はどうなのだろうか.【コード4】は,if を用いずにプログラムを作れ,という指示の下に考案されたもののようだが,本当に if,つまり「場合分けの考え方」を使っていないのだろうか.もうお気付きのことと思うが,上述の座標変換の説明から明らかなように,ABS 自体に if が隠されているのである.実際,絶対値の定義は,

  1. x と -x の内,大きい方
  2. x が正なら x,x が負なら -x

などとされることが多い.定義 1.なら,【コード4】はトートロジーのようなものだし,定義 2.なら,ABS は if を含んでいることになる.従って,考え方としては,何ら新しいものは含んでいないのである.

 ところで,件のメーリングリストには,【コード4】について,桁落ちなどの問題があるよ,という指摘も載っていた.これは,正しい指摘ではあるが,もう一歩踏み込んで考えるべきであろう.
 というのは,【問題1】はデータの大きさのことにしか触れていないのに,【コード4】には加算減算除算が含まれている.つまり,【コード3】が前提としているのは扱っている数の順序構造だけであるが,【コード4】は四則演算(体という代数構造)を前提としているのである.プログラムのデータ構造は,その問題に見合った構造だけを前提とすべきである.もし,それでプログラムできないのなら,そのデータ構造が間違っているのである.問題の設定から考え直すべきであろう.
 と考えると,【コード4】は「正解」ではないことになる.精度ではなく,それ以前の問題なのである.

 情報科では情報科学の本質を教えるべきだ,という意見に賛成する人でも,その発言を良く聞いてみると,それはコーディング教育じゃないの,と思えるものが殆どである.ここで扱ったような,僅か数行のプログラムでも,階層,データ型,関数,情報隠蔽,選択構造による問題解決のアプローチなど,基礎的概念が多数現れている.難しいコーディングは必要ない.小さなコードの中に含まれる構造を読み解き,そこに含まれる基礎概念を認めること,それが情報科学の本質なのではないのだろうか.この情報科学の基礎概念は誰にとっても必要なものである.言葉の扱い方,社会との接し方,数理概念,そして情報概念.ついこの間人類が発見した概念ではあるが,情報概念という切り口によって,世界に対する新しい見方を確実にもたらしてくれるだろう.情報科は,それを語る教科であって欲しい.

1999年 12月 18日