サイト運営者の日々の日記。2010年09月。
えらい放置してた。4つの4問題は5000以下の自然数について最も"シンプル"な解を出力できるまでに高速・高性能になった。この手法をそのまま4つの数字問題にフィードバックすることでそちらも高速化。最終結果まとめてもう出せる。とはいえ、9月の初めからPC周りでゴタゴタしてて、最近ポケモンBWとか開始したため、この問題についてのページ作成は遅れに遅れている。そのうち、改めてコードを整理して追加公開したい。
カウンターが10日ほど応答不能になってた。少し前に追加したカウンターのリセット防止策が原因。読み込んでいるファイルの1つが空状態になり、カウンターの実行を停止させてた。そうすると、最近カウンターが複数回リセットされた件は二重書き込みが原因ではなかったということか。
まだ問題が残っていたので、ver.2.0を修正。多分前の日の日記の解一覧も間違ってる。
本題。リリースしたver.2.0を汎用設計から4つの4問題専用の設計に変更。不要な部分を徹底的に消去した結果、手元では先の記事と同じ結果を10倍速の3秒で得ることに成功している。尤も、スキャンする空間の広さはリリース済みの2.0の10倍になっているので、単位計算結果で比較すると100倍速になっている。
探査する空間が3-1-1-1では998個検出、3-2-1-1に広げると4秒で1000個揃うことを確認。しかしながら理論的には3-1-1-1空間でも全部揃うはず・・・。なお、空間の記述は4をn回使ったn番目の配列で一変数演算子を何回連続で作用させるかを意味している。4の使用回数が1回-2回-3回-4回の4つの配列に対して一変数演算子を3回-1回-1回-1回作用させる範囲までを許可すると読む。
もっと速そうな別の計算方式を2つぐらい知っている。そのうち挑戦するが、先ずは今作っているものからだ。
それなりに高速化したバージョンをリリース。44,444抜きの四則演算・累乗・平方根(2重)・階乗(3重)・総和(3重)の昨日の日記より重い設定(小数4,上限2000)を実行、検出数999/1000、所要時間30秒(Firefox3)まで短縮。栄光の未発見数字は913。昨日と似たような設定(2重まで)なら、4500程度の最終配列で8秒(Firefox3)で計算が終わる。このときの検出数は932/1000。検出数や所要時間は小数や大きな数の上限によっても変わる。
とりあえず、大体どんな設定でも「同一の途中結果を無視」のチェックを外さない限り現実的な時間内に終わる。
仮として上げていた4つの数字問題のスクリプトを更に改良し、手元で一定の成果を得た。これを用いて4つの4問題を実行。44や444はなし、四則演算・累乗・平方根・階乗・総和の5種類8個の演算子を許可し1〜1000までを検索。1000個中986個を検出。最終配列は3841個、所要時間40秒(Firefox3)となった。依然計算に無駄が多いと思われる。
(さっきあげたあとにミスに気づいたので日記内容を修正)
(2010/09/02-23:30)現状の暫定まとめ。44と444を許可、四則演算・累乗・平方根・階乗・総和を用い、更に平方根・階乗・総和はそれぞれ最大2回まで多重作用できるとした場合、4つの4問題の検索結果は1000個中992個となった。ここまで78秒(Firefox3)。
スクリプトそのものは任意の数字・任意の用途で動くように作られており、同じ数字が2個以上ある場合で余分な処理が増えないように生成する配列を動的に変更している。しかし、任意の数字を作る組み合わせをたくさん求めるための重複除去処理は任意の範囲の数字を1つずつだけ求める4つの4問題の範囲検索には不向きであると考えられ、ここを修正すればいくらか速くなるはず。演算子を適用する上での着眼点もまだ幾つかあるので高速化は効くだろう。