わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ファンタジーの法則 雑感(改訂あり)

筆者が個人的に,ファンタジーの法則と呼んでいる問題解決法についてお話しましょう.ファンタジーというのは別世界と行き来する物語のことで,ファンタジーの法則とは,別世界と行き来することで問題をうまく解くという法則です.
【ファンタジーの法則】
「こちらの世界」で解けない問題があったら…

  1. 問題を「こちらの世界」から「別世界」に持っていきます.
  2. そして,問題を「別世界」で解きます.
  3. 最後に,得られた答えを「こちらの世界」に持って帰ります.

(プログラマの数学, p.238)

この次のページには,世界を行き来する図も掲載されています.
上記のファンタジーの法則について,私が最初に考え方を知ったのは,ラプラス変換でした.大学生のときです.読んだ本の名前は忘れましたが,ほぼ同形の図もありました*1.一見複雑な微分方程式が,ラプラス変換すると分数式として解くことができ,部分分数分解をしてからラプラス逆変換すれば,もとの微分方程式の解になる,というものです.
ともあれ,ファンタジーの法則は,適用範囲が広そうです.最初に思いつくのは,小学校からなじみの「文章題」です*2
問題文を式に表すのは,「文章の世界」を「算数の世界」に持って行くということです.その問題が金額の問題だったとしても,算数の世界に行った時点で通貨単位が消えます.算数の世界で計算してから,その結果を,こちらの世界=文章の世界に持って帰ります.このときに通貨単位をつけるとともに,その結果が与えられた条件を満たすかの確認を経て,最終的な答えとなります.
プログラミングにも使えます.課題が与えられたとき,課題の各要素を,使用するプログラミング言語の世界に変換して,それからコードを書きます.動作確認やデバッグを行って,完成です.
このとき,「こちらの世界」の目標を,プログラムを作ることではなく,課題に書かれた仕様とするほうがいいでしょう.そうすると,こちらの世界に持ち帰る結果というのは,課題のもとでのどんな入力に対しても,別世界…プログラムに入力を与えて実行すれば,正しい出力が得られることに相当します.
もう一つ,学生時代に学んだことを思い出しました.NP完全に関係して出てきた,多項式時間還元可能性の概念です.二つの問題P1とP2があって,P1に属するどの個別問題も,多項式時間の操作で,P2の個別問題に変換できる*3とき,P1はP2に多項式時間で還元できる,と呼びます.この関係があるとき,P2が多項式時間で解ければ,P1の問題も多項式時間で解ける*4ことになります.これも,P1を「こちらの世界」,P2を「別世界」とみなせば,ファンタジーの法則と同じ構図です.
そういえば数学の用語として,こちらの世界を別世界に持っていく操作を,還元reductionあるいは帰着といいますね.「〜に帰着させる」という言葉が出てきたら,ファンタジーの法則発動!です.

*1:流れは,左上→左下→右下→右上だったような.

*2:プログラマの数学』では,植木算(p.118)で使用していますが,植木算も一つの文章題ですね.

*3:P1からP2の部分集合への写像を作ります.P1(全体)からP2(全体)への写像ではありません.

*4:写されたP2での解を,P1に戻す作業,すなわち逆変換も必要なのですが,いくつか工夫することで,戻す作業に時間がかからないようにできます.どう工夫するかは,リクエストがあれば書きます.