「4つの4で遊ぼうよ」シリーズがアルゴリズム的には、ほぼ最終的な解決をみました。
4つの4を使って、0, 1, 2, 3, ... を表す式を作りなさい。
例
0 = 44-44
1 = 44/44
2 = 4-((4+4)/4)
3 = (4+4+4)/4
4 = 4+4×(4-4)
5 = (4+(4×4))/4
6 = 4+((4+4)/4)
7 = (44/4)-4
8 = 4+4+4-4
9 = 4+4+(4/4)
10 = (44-4)/4
10までは小学校の算数の計算でできますね。12, 15, 16もいけます。
12 = (4+44)/4
15 = 4+(44/4)
16 = 4+4+4+4
11, 13, 14 などは、どうでしょう? 小学校の算数ではできませんが、平方根を使えばできます。
11 = 44/(√( 4×4 ))
13 = (√( 4 ))+(44/4)
14 = 4+4+4+(√( 4 ))
17 = (4×4)+(4/4)
18 = 4+((4×4)-(√( 4 )))
ところが、19は、平方根まで使っても作れません。たす、ひく、かける、わる、と平方根だけでは作れない数は、40以下の範囲だけでも、19, 27, 29, 31, 33, 35, 39 があります。そこで、
1! = 1
2! = 2×1 = 2
3! = 3×2×1 = 6
4! = 4×3×2×1 = 24
5! = 5×4×3×2×1 = 120
6! = 6×5×4×3×2×1 = 720
7! = 7×6×5×4×3×2×1 = 5040
...
こんな感じです。この先は、驚くほど急激にどんどん大きくなります。例えば、
30! = 2 6525 2859 8121 9105 8636 3084 8000 0000
てな感じで、万、億、兆、
「4つの4」に話を戻して、平方根まででは作れなかった19なども、階乗までゆるせばこのとおり:
19 = ( 4! )-(4+(4/4))
20 = 4×(4+(4/4))
21 = (44-(√( 4 )))/(√( 4 ))
22 = 4+((√( 4 ))+(4×4))
23 = ((√( 4 ))+44)/(√( 4 ))
24 = 4+(4+(4×4))
25 = ( 4+(4/4) )√4
26 = 4+(44/(√( 4 )))
27 = 4+( 4! )-(4/4))
28 = 44-(4×4)
29 = 4+( 4! )+(4/4))
30 = (4×(4+4))-(√( 4 ))
31 = ( 4! )+((4+( 4! ))/4)
32 = (4×4)+(4×4)
25は、4+(4/4) の √4乗 として表されてます。5の2乗ってことですね。ほかにも作り方はあるでしょうが、この方法がいちばんシンプルでしょう。
さて、ここまで楽しくやってきましたが、33は階乗までゆるしても作れません。0~1000の範囲で、4つの4に
162 = [ √√√4 + √( 4×√√4 )]4
の場合は —— 四則、累乗、平方根、階乗の範囲では —— 上のように三重根号を認めて、初めて到達できるのです(この例の詳細については後述)。そんな複雑な可能性まで考慮しても、33は作れません。その先は、というと……
34 = (√( 4 ))+(4×(4+4))
35 = ( 4! )+(44/4)
36 = 44-(4+4)
37 = ( 4! )+ [ ((√( 4 )+( 4! )) / (√( 4 )) ]
38 = 44-(4+(√( 4 )))
までは良いとして、39も作れないのです。
ところで41は、ちょっとした驚異です。
40 = 4×(4+4+√( 4 ))
41 = √[ { (4!) + ((4+4)!) } / (4!) ]
ちょっと分かりにくいですが、4! と 8! を足して、和を 4! で割って、その全体の平方根をとるのです。
4! = 24, 8! = 40320 ですから、和は 40344、それを 4! = 24 で割ると 1681 で、確かに41の自乗になっています。
よくこんなの思いついたな、ですって? たぶん人間さんには思いつけないかもしれません…… 人間でなく JavaScriptが生成したものです。さらに進むと
42 = (√( 4 ))+44-4
43 = 44-(4/4)
44 = 4+44-4
45 = 44+(4/4)
46 = 4+44-(√( 4 ))
47 = ((√( 4 ))×( 4! ))-(4/4)
48 = 4×(4+4+4)
49 = (4/4)+((√( 4 ))×( 4! ))
50 = 4+√( 4 )+44
このように進めるのに、33と39が作れないのを放っておくのは気持ちが悪いので、なんとかしましょう。階乗(1からその数までの積)を許したのだから、総和(1からその数までの和)も許すことにしましょう。ここでは総和記号をΣ(シグマ)で表します。
Σ1 = 1
Σ2 = 1+2 = 3
Σ3 = 1+2+3 = 6
Σ4 = 1+2+3+4 = 10
Σ5 = 1+2+3+4+5 = 15
Σ6 = 1+2+3+4+5+6 = 21
...
「厳密」に言うと、例えば Σ4 は の略記法と考えることができます。もしくは、Σは n(n+1)/2 を返す
総和記号を使うと、問題の 33 , 39 も作ることができます。
33 = ((Σ( 4×4 ))-4)/4
Σ16 = 1+2+3+ ... +16 = 136 です。そこから 4 を引くと 132 、4 で割ると、たしかに 33 になります。39のほうはシンプル:
39 = (4×(Σ4))-(4/4)
総和記号もゆるすと、0から1000まですべて作ることができます。ただし、平方根、階乗、総和の単項演算子を各項ごとに一回だけに制限した場合には、この範囲で作ることのできる数は829個ほどです。
Σ(√(4)) = Σ2 = 3
Σ(Σ4) = Σ10 = 55
のように同じ項に対して特殊記号をいっぺんに二重以上に使うのを禁止した場合……ということです。この制限で作れなくなる最初の数は159です。平方根や総和などの記号を二重につけることをゆるすなら、
159 = ( √4 × ( ( Σ(√4) )4) ) - Σ(√4)
Σ(√4) = Σ2 = 3 ですから、それの4乗は81、√4をかけて162、そこからΣ(√4) = 3 を引けば、求めるものになります。次のような解もあります。
159 = 4+ (Σ(Σ4)) + (√( Σ4 ))4
右辺第一項は4です。第二項はΣ10だから55。そして、Σ4 = 10、の平方根を4乗すると(つまり√10を4回、かけあわせると)100です。これらを足すと、4+55+100 でやはり159になります。
すっぴんの4に特殊記号を二重につけることを許可しても、なお作れない数が、0~1000の範囲で3つあります。671 と 797 と 929 です。すっぴんの4に対して三重に特殊記号をつけることをゆるすなら、これらも作れるようになります。
671 = √4 + Σ(√4) + Σ[ { (Σ(√4))! }√4 ]
Σ(√4) は3、その階乗は6、それを√4乗(つまり二乗)して36。で、Σ36 = 666 なので和は671
797 = 4! + Σ(√4 + { (Σ(Σ(Σ4)))) / (√4) }
Σ4=10、ΣΣ4=Σ10=55、ΣΣΣ4=Σ55=1540 なので { } のなかみは770、合計797
929 = 4 + Σ[ { Σ(Σ4) } - { (Σ(√4))! } ] - Σ((4!))
第一項は4。第二項、最初の中かっこは55、2個めの中かっこは6で差は49、それ全体の大きなΣ、つまりΣ49=1225。第三項はΣ24=300。要するに 4+1225-300 = 929
また、671の場合、(すっぴんの4だけじゃなく)二項演算の結果に対しても特殊記号を二重につけて良いとしても、作り方があります。
671 = √4 + Σ(√4) + Σ(Σ( 4+4 ))
この例では、4+4を先に計算して、その結果に総和記号を二重につけてます。Σ8=36、ΣΣ8=Σ36=666だからトータルで671
いずれにせよ、4つの4に対して四則演算と累乗、総和、階乗を適当に組みあわせれば、0~1000のすべての整数を発生させることができます。二項演算の結果のほうに特殊記号を二重、三重につける可能性については、まだ充分に探索してません。二項演算の結果も含めて特殊記号の二重使用だけでは797と929は作れないようです。三重使用まで考えれば、「単項の4だけ」に限って特殊記号を三重につけることで、1000までのすべての数が作れます。
1000までの数で、特殊記号の三重使用なしに作り方が見つからなかったのは797と929です。 —— なにやら複雑で大変な調査をしたようにも読める書き方かもしれませんが、JavaScriptでは数分でスキャンできます。もっとも、数分でこれだけの式表現空間の深みを正確にスキャンできるような、そういうスクリプトを開発するのには、何日もかかってます。このスクリプトは「4つの4」に限らず、同様のいろいろなパズル一般に適用可能な原理にもとづいています。 ——
逆に単項の4だけ特殊記号の三重使用を認めると、二項演算の結果には特殊記号を三重どころか二重使用も認めず一重使用しか認めないにもかからず、0~3000の範囲ではほとんどすべての数 —— 少なくとも2940個 —— が作れます。現在(2002年6月5日)4つの4からの作り方が分かっていない最小の自然数は1937です。1937, 1979, 1985, 1993 の4つを解決すると、2000までのすべての数が4つの4で生成されることになります。単項の4だけの特殊三重でこれなので、もっと広い式表現空間を探索すれば、答があるかもしれません。
特殊記号を何重にも使ったとしても、アルゴリズム的には、まったく同様に検索ができます。具体的にいうと、
four4s(1,1,1,1)
という関数呼び出しにて「特殊記号を一重に使った全表現空間」をスキャンでき、
four4s(2,1,1,1)
なら単項のみ特殊二重、
four4s(3,1,1,1)
なら単項のみ特殊三重、
four4s(2,2,2,2)
なら、あらゆる場所で特殊記号の二重使用を許可。例えば、
four4s(5,5,5,5)
を実行すると、きわめて広い範囲(あらゆる場所で特殊記号を最高5重まで許可)をスキャンできます —— が、現状、実行時間が予期できません。100までいければ上等という考えで始めて、最近、捜索範囲を1000まで広げたのですが、それすらも
four4s(3,1,1,1)
でコンプリートできるのですから(そして、このくらいなら、数分程度しかかからない)、
four4s(5,5,5,5)
がものすごい空間であることは想像がつくでしょう。
単項以外の場所の特殊記号の多重使用を認めた場合にあらわれた、鮮烈に印象的な例は、次の表現です。
かっこ内の第一項は三重根号の4、つまり2の4乗根にあたります。第二項 (4(4)1/4)1/2は32の4乗根です。両方とも無理数なのです。このような無理数同士を足し算しても、なお無理数ですが、その和の4乗をとることで162を得ています。かっこ内の和は、162の4乗根だったわけです。いったん複雑な無理数になっても、それを使って初めて問題が解ける場合があるということです。four4s(1,1,1,1)のような範囲だと、小数点がつく数がでたらそのまたルートなんてムダな計算せずにそこで(その方向の捜索は)終わりにしたいというか、終わりにしても良いのですが、あらゆる場所で特殊記号の多重使用を許可した場合には、そうした「ふつう考えられない」ような先にまれに答があるかもしれません。
なお、上の式が実際に162に等しくなることは、高校数学の計算練習といったところです。ちからまかせに解くには
(21/4 + 321/4)4
を二項定理で展開してください。ご存じかもしれませんが、
(a+b)4 = a4 + 4a3b + 6a2b2 + 4a3b + b4
のように係数は1,4,6,4,1です(分からなくなったら1,1から初めて三角形に二項係数を書けば良い)。
4乗の項は明らかに整数になります。そして例えば第二項は
4((21/4)3)(321/4) = 4(23/4)(321/4)
32が2の5乗であることから、321/4=25/4
指数法則から (23/4)(25/4) = 28/4 = 22 = 4
どの項もこんな感じで整数になります。
じつは、これだけ「4つの4で遊ぼうよ」シリーズを続けてきながら、実際にはパズルを1個も解いてません。こころみてきているのは「4つの4を使って与えられた数を作るパズル」を解くことではなく、「4つの4を使って与えられた数を作るパズル」を解くプログラムを作ることでした。パズルを解いていたのでなく、パズルを解くアルゴリズムを解いていたのです。
最初、かなり強引なちからわざで場当たり的、総当たり的に式表現を検索したところ、0から100までの解を得るのに6分くらいかかっていました。今では「とりあえず答がでればいい」というのであれば、0から1000の範囲をもっと短い時間で一気に検索できます。さらに、その数の作り方が何とおりかある場合に、最もシンプルな式を探すアルゴリズムも実装できました。(どの演算がシンプルか、例えば平方根と階乗はどちらがシンプルか、というのは定義しだいですが、基本的にどのような定義にも対応することができます。)
新しいアルゴリズムの考え方については、先日「「4つの4」問題、最終解決のきざし」でメモしましたが、これは読んで分かりやすいメモじゃないです。どのようにすれば簡単に「式の複雑さ」を評価できるのか、そしてより簡単な式表現を選択するようにできるのかも、まだ説明してません。これらについては、後日、詳しく書く予定です。
現時点では、あまり技巧的な高速化をしないで広く動かしていますが、それでも、例えば、特殊記号の二重使用を考えない範囲で0から1000の範囲をスキャンするのは10秒程度です。単にスキャンするだけでなく「最もシンプルな答を求める場合」(式表現の最適化)は2~3倍程度の時間がかかります。部分的に特殊記号の二重使用、三重使用で生成可能な範囲まで検索すると、数分から10分程度かかります。部分的な検索でも、けっこう時間がかかるのです。このあたりについては、現段階では何とも言えません。