油を分けるにはビリヤードさえあればいい

 『油分け算』はよく知られたパズルですよね。
 大抵の方々はこのパズルを試行錯誤で解くでしょう。
 しかし、これは秀逸なアイデアや方程式で解くことも可能です。
 今回は『油分け算』を数学的な視点で考察してみます。

1.世界に昔からある「油分け算」

 油分け算。
 有名なパズルですよね。
 こ〜んな感じの問題文で、解くために油をあっちこっちに移しまくるアレです。

 斗桶に油が1斗(10升)入っている。
 3升枡と7升枡を使って、この油を1斗桶に5升、7升枡に5升入れたい。
 どうやれば良いか?

 油分け算は古くからありました。
 日本だと、吉田光由の著書『塵劫記』が有名ですね。
 上述の問題が当時の言葉遣いで書かれています。
 塵劫記は日常生活に必要な計算法を網羅している算術書ですが、「継子立て」や「ねずみ算」などのお遊びの面も兼ね備えています。
 塵劫記の人気っぷりは凄まじく、塵劫記の一部を取り入れて『○○塵劫記』と名の付いた異本が何百種類も刊行されたという!
 本家は本家で版を重ね、ベストセラーになった代物です。

 西洋だと、さらに歴史を遡ります。
 いくつか存在するようですが、その一例として16世紀に発表された「タルタリアの問題」があります。
 タルタリアはその当時に活躍していた数学者です。が、これは「どもり」という意味の通称で、本名はニコロ・フォンタナ。3次方程式の解法を巡るあの「カルダノとの対立」でも有名な人物ですね。
 そのタルタリアの問題を紹介しましょう。
 ただ、当時の問題文には聞き慣れない言葉があるので、少しアレンジしてご紹介。

 容量がそれぞれ3オンス, 5オンス, 8オンスである3つの容器があり、現在、8オンスの容器は液体で満杯になっている。
 3オンスと5オンスの容器を使って、この液体を4オンスずつに分けたい。
 さぁ、どうする?

 油分け算の由来については、論文『油分け問題の由来と解法の進化における文化的意義に関する一考察』(PDFファイル) に詳しく記載されています。
 興味があれば読んでみてください。

 さて。
 こういう油分け算、実は、ある「有名な物」にも使われていたのはご存じでしょうか?

あのブルース・ウィリスも油分け算をやっていたのさ!
と言っても、映画『ダイ・ハード3』のワンシーンだけどね。

 なんと、ストーリーの中に油分け算のシーンが出てくるんです。
 ま、実際は油じゃなくて水だから、「水汲み問題」と言う方が正しいかな?

 公園の噴水に着いたマクレーン刑事と相棒ゼウスは、そこで3ガロンと5ガロンの容器を見つける。
 そばにあったトランクを開けると、時限爆弾が作動してしまった。
 爆弾を解除するには、2つの容器を使って水を正確に4ガロン量らなくてはならない。
 刻々と制限時間が差し迫る中、残り数秒というところで2人は解除に成功する。

 劇中では、マクレーンが3ガロン容器に水を3分の1入れようとして、ゼウスに窘められていましたね。
 もちろん、3+1=4 なんて反則です😅
 ダイ・ハード愛好家の方々には、爆弾解除シーンの映像が脳裏によみがえったかもしれません。

 ダイ・ハード3のあのシーンは、タルタリア問題の一種と言えますね。
 噴水が8ガロン容器の代わりを務めるというだけで、本質は同じです。
 マクレーン刑事が挑戦したこの水汲み問題、実は、画期的な方法が存在します。
 その方法をこれから紹介しようと思います。

2.解くカギはビリヤードにあった

 まずは、正解手順を示しましょう。
 次の通りです。
 [ ] の中の数字は、左側が3ガロン容器に入っている水量、右側が5ガロン容器に入っている水量を表しています。

  1. 噴水から3ガロン容器へ水を注ぐ。[3, 0]
  2. 3ガロン容器から5ガロン容器へ水を移す。[0, 3]
  3. 噴水から3ガロン容器へ水を注ぐ。[3, 3]
  4. 3ガロン容器から5ガロン容器へ水を移す。[1, 5]
  5. 5ガロン容器の水を噴水へ戻す。[1, 0]
  6. 3ガロン容器から5ガロン容器へ水を移す。[0, 1]
  7. 噴水から3ガロン容器へ水を注ぐ。[3, 1]
  8. 3ガロン容器から5ガロン容器へ水を移す。[0, 4]

 水汲み問題を解く時は、とにかく試行錯誤を繰り返すことでしょう。
 最短手数にこだわるなら、一手ごとに水量を記録してその変遷を図や表にするでしょう。
 まぁ何にせよ、手間はかかっちゃいますよね。
 もし頭を使わずにできるスバラシイ方法があれば嬉しいけれど、そんなムシのいい話はあるんかな?

図 2-1

 実は、あるんです!
 ビリヤード台を使って解決できるんです。
 ただ、実物の台ではなくて、図2-1 みたいに 60°にひしゃげてるんですけどね😅

 このビリヤード台、3×5サイズの平行四辺形です。
 3ガロンと5ガロンの容量にちなんでいます。
 このビリヤード台には3方向の線が格子状のように引かれ、小さな正三角形に分割されていますね。
 この区分けによって、外周部分には [0, 0] から [3, 5] までの水量目盛りが振られます。

 上述の手順 1.〜8. では [ ] 内に各容器の水量も書きましたが、実は、水量の変遷がわかれば手順を復元できます。
 だから、手順説明をすべて省いて、変遷だけ並べましょう。

 そして、ビリヤードの手球を [0, 0] に置いて、この変遷に従って手球を動かしてみましょう!
 まず、最初の一手で水量は [0, 0] から [3, 0] に変化しますね。
 手球も [3, 0] に動かしましょう。

 [3, 0] → [0, 3] → [3, 3] → [1, 5] → [1, 0] まで途中経過。

 手球はビリヤード台の縁にコンコンぶつかりながら転がっていく。
 最後の手順まで進むと手球は [0, 4] に到達し、5ガロン容器に4ガロンの水が入った。
 手球の通ったルートはそのまま正解手順を表しているわけですね。

 このビリヤードの方法、一体何が凄いのか?
 それは……、

手球の進み方が現実のビリヤードとまったく同じなんです。

 皆さんは反射の性質をもちろんご存じでしょう。
 現実のビリヤード台で球をキューで撞けば、球は四方の縁を等角度で反射しながら転がりますよね。
 上図の矢印はその性質に従ったルート取りになっているんです。
 キレイに「入射角=反射角」を保ちながら手球がコンコンコンコン跳ね返りまくるのさ!

 このことから、果たしてどういう結果が得られるのか?
 実は、こんなことが言えてしまうんです。

 水汲み手順をいちいち覚えなくてもいい。
 水量をいちいち把握しなくてもいい。
 水量の変遷をいちいち記録しなくてもいい。
 ただただビリヤード台の縁に沿って力任せに手球をブッ放せばいい。

水汲み問題はパズルではなく、ただの作業ゲームだった!?

 マジか😅
 んなバカな😅

 ……衝撃的な結果でしたね。
 球を撞けば勝手に正解。脳筋プレイ上等! ……になってしまった。

 ところで。
 この水汲み問題には別解があります。
 [0, 0] は下端の縁にもあって、[0, 0] から右方向に球を撞いても [0, 4] に到達するんです。
 実際にやってみましょうか。

 手順を復元すると……、

  1. 噴水から5ガロン容器に水を注ぐ。[0, 5]
  2. 5ガロン容器から3ガロン容器へ水を移す。[3, 2]
  3. 3ガロン容器の水を噴水へ戻す。[0, 2]
  4. 5ガロン容器から3ガロン容器へ水を移す。[2, 0]
  5. 噴水から5ガロン容器に水を注ぐ。[2, 5]
  6. 5ガロン容器から3ガロン容器へ水を移す。[3, 4]
  7. 3ガロン容器の水を噴水へ戻す。[0, 4]

 たしかに4ガロンができた!
 これも正解なんですね。
 ちなみに、これはダイ・ハード3で実際に行われたであろう手順です。
 事なきを得てガッチリ手を握り合った時の2人の顔ったらもう!😊

 結局、この水汲み問題(油分け算)の解決方法は、次の形に集約されます。

 このビリヤード方法は、M. C. K. Tweedie によって1939年に発見されました。
 そして、この方法は一般的な形に拡張されています。

 「任意の \(n\) ガロンを量れる」という部分がまた秀逸ですよね。
 これは、3×5サイズの例で概要を理解できます。
 既に2つの正解ルートを見つけましたっけ。それを重ねてみましょう。

 おぉ! なんかキレイに組み合わさったぞ!
 そう。実は、内部の格子線をすべて1回ずつ通っているんです。
 当然、[3, 5] 以外の外周目盛りもすべて通過しています。
 だから、水汲み作業の途中で1ガロン〜7ガロンの水量をどこかで経験するわけなんですね。

 いや〜すごい!
 この一般形のおかげで、どんな水汲み問題も機械的に解けるようになった。
 それだけでなく、2つの容器の容量を(互いに素を保ちながら)自由に変えて、さまざまな問題をいくらでも作れるようにもなった。

容器2つの水汲み問題はバリエーションを無限に増やせる。
しかし、どれもこれもビリヤードで機械的に解けてしまう。

 なんて底が深くて浅いパズルなんだ!😅

 あ、そうそう。
 『塵劫記』の油分け算もビリヤード化してみましょうか!
 問題文はセクションの冒頭にあります。
 一例はこんな感じ。

3.解くカギは不定方程式にもあった

 ビリヤードほど画期的ではないけれど、解く方法はもう1つあります。
 それも紹介しましょう。

 その前にちょいと前準備。
 前セクションで挙げた正解手順の内容を調べてみましょう。
 その中にある各操作を分類してみると、実はたった3種類しかないことがわかります。

  1. 空っぽの容器を噴水で満杯にする。
  2. 満杯の容器の水を噴水に全部戻す。
  3. 一方の容器が空になる/他方の容器が満杯になる のどちらかに到達するまで、容器から容器へ水を移す。

 a. を行うと、2つの容器の総水量が増えますね。b. だと減ります。
 c. だと総水量は変わりません。
 ということは、ある水量を作りたいなら a. と b. の2つを駆使することになるでしょう。
 正確に言うと、「操作 a. b. のみで総水量を調節する。ただし、a. b. を正しく実行できるように操作 c. を間に挟む」という形で水汲み作業が行われます。
 操作 a. b. をまとめて 水量操作 と呼ぶことにしましょう。

 前準備はこれで終わり。
 さて。
 若い方々は、高校数学Aで不定方程式を習ったことと思います。
 「\(ax+by=1\)」みたいな式、ありましたっけ。やれ特殊解だ何だとゴチャゴチャやって整数解 \(x\), \(y\) を求めましたね。
 前セクションの3ガロンと5ガロンにちなんで、不定方程式とその整数解を1つ書いてみます。

 当然ですが、これは 3×3+5×(-1)=4 が成り立つことを意味しますよね。
 この等式、水汲み問題ではどういう意味を持つんでしょう?
 それは、「次の水量操作をすべて実行すれば4ガロンの水ができあがる」ということなんです。

 水量操作は全部で4つ。
 それを頭の片隅に置きながら、あらためて前セクションの正解手順(ダイ・ハード3じゃない方)を見てみましょうか。

  1. 噴水から3ガロン容器へ水を注ぐ。[3, 0]
  2. 3ガロン容器から5ガロン容器へ水を移す。[0, 3]
  3. 噴水から3ガロン容器へ水を注ぐ。[3, 3]
  4. 3ガロン容器から5ガロン容器へ水を移す。[1, 5]
  5. 5ガロン容器の水を噴水へ戻す。[1, 0]
  6. 3ガロン容器から5ガロン容器へ水を移す。[0, 1]
  7. 噴水から3ガロン容器へ水を注ぐ。[3, 1]
  8. 3ガロン容器から5ガロン容器へ水を移す。[0, 4]

 なんと4つ全部入ってる!
 この4つの水量操作が正解へと導いていたんですね。
 なお、手順 2. 4. 6. を間に挟んだおかげで水量操作 3. 5. 7. は正しく実行できています。

 不定方程式は水汲み問題の本質部分だと言えます。
 水量操作という形で整数解がそのまま正解へと導くからです。
 整数解が見つかるということは、水汲み問題が解決するということと同じなんですね。

 そういう理由から、実は、容器の個数は関係ありません。
 容器が3つでも不定方程式で同じように解決できるんです。
 実際にやってみましょうか。

 容量がそれぞれ6ガロン, 10ガロン, 15ガロンである3つの容器を持って、噴水の前にいる。
 今、この3つの容器を使って、7ガロンの水を量りたい。
 さぁ、どうする?

 これは、不定方程式 6x+10y+15z=7 を立てればOK!
 その整数解を1つ見つければ良し。
 なんとか探すと、次のような解を得ます。

 必要な水量操作は全部で5つ。
 正解の一例はこの通り。

  1. 噴水から6ガロン容器へ水を注ぐ。[6, 0, 0]
  2. 6ガロン容器から10ガロン容器へ水を移す。[0, 6, 0]
  3. 噴水から6ガロン容器へ水を注ぐ。[6, 6, 0]
  4. 6ガロン容器から10ガロン容器へ水を移す。[2, 10, 0]
  5. 10ガロン容器の水を噴水へ戻す。[2, 0, 0]
  6. 噴水から15ガロン容器へ水を注ぐ。[2, 0, 15]
  7. 15ガロン容器から10ガロン容器へ水を移す。[2, 10, 5]
  8. 10ガロン容器の水を噴水へ戻す。[2, 0, 5]
  9. 6ガロン容器から15ガロン容器へ水を移す。[0, 0, 7]

 見事に解けました😄

 容器の容量が互いに素であれば、容器が何個あろうとも不定方程式で解決できます。
 水汲み作業の定理はさらに一般化されていて、こんなことが成り立っています。

 さっきの6, 10, 15ガロンの場合だと、0ガロン〜31ガロンの32通りすべてを量ることができるというわけですね。
 やっぱり「任意のn単位を量れる」というのが秀逸です。
 素晴らしい😃

 ただ、残念ながら、不定方程式は使い勝手が悪いという欠点がある。
 変数の個数が多くなるにつれて、解く手間がねずみ算式に増えていく。
 3x+5y=4 ならまだマシだけど、6x+10y+15z=7 の解探しなんて結構骨が折れますもんね。
 しかも、ただ見つけりゃいいというわけではなく、どの解もなるべく0に近い値でないと後で泣きを見る😭

 お手軽とは言いにくいけれど、水汲み問題に対して不定方程式は大きな力になります。
 解探しを厭わないくらい数遊びの好きな方々なら、使ってみるのも良いでしょう。
 最適な整数解を探す作業も、それはそれで一種のパズルと言えます。

参考・参照

更新履歴