空間計算量に対して高々指数オーダーの時間計算量になることは(鳩の巣原理から)自明なのに対し、逆は対数オーダーにはできないと予想されつつも(L≠PもPSPACE≠EXPTIMEも未解決)、(1-ε)乗オーダーの空間計算量にすることさえできないでいた。そんな中、ほぼ平方根オーダーの空間で計算できることが示された1。その論文 Simulating Time With Square-Root Space や引用先をちょっと前に読み、最近人に説明するためにまとめたのでそのメモをブログに転用。
Tree Evaluation をナイーブに再帰計算しようとするとスタックが必要というのは、2つの subtree のうち先に評価したほうを覚えておくため。とくに最後の leaf を訪れたときにどの深さでも必要になる。LOGSPACE (L_(complexity))) の知名度が低いのか P vs PSPACE への応用に注目されがちな感もあるが、(入力長未満のオーダーの空間計算量を考えるときは)入力は読み取り専用で与えられることに注意しておく。つまり、関数を与える表の入力の部分を計算結果に書き換えるとかはできない。(他にも対角線論法の詳細とか time-constructible など技術的定義とかはたとえば Sipser, Michael. "Introduction to the Theory of Computation." の Chapter 9 Intractability に書かれていることは確認したのでこれか適当な教科書を読みましょう。)
研究の流れ
"Computing with full memory: Catalytic space" (Corollary 6) で(有限の)環上の多項式を省メモリで計算することができることが示されていた。
"Tree Evaluation is in Space O(log n ⋅ log log n)" で、任意の(有限集合上の)2項演算を適当な有限体に埋め込んで多項式に帰着できる(もちろんこの帰着も十分省メモリにできる)ことを示して、TreeEval がかなり省スペースで計算できることが言えた。
TreeEval はもともとこれで L と P を分離できるのではと予想されていただけあって、Lの中での難しさ(NP「完全」的な意味)をちゃんと任意のプログラムの帰着の話に言いかえた。これによって時間計算量 O(t(n)) に対しての空間計算量上限という形での改善結果を得た。
"Computing with full memory: Catalytic space" では n 個のレジスタだけでスタックメモリを使わず再帰計算するテクが提案されている。cleanly computes f (ここでは Section 3 Transparent computation) を基本単位にして組み合わせるというアイデアで、 f の計算を代入ではなく加算 で許すことにするとあとで同様の関数を呼んで今度は減算すればレジスタを元に戻せる。そのかわりに、f の計算結果の利用が難しくなって、 r_i にもともと何が入っていたかを覚えずに f を用いた計算を組んでいく必要がある。
"Tree Evaluation is in Space O(log n ⋅ log log n)" では alphabet size k 上の2項演算を binary tree 上再帰計算する(1ノードあたりの入力長 k2 log k)。もとの alphabet の値は 1bit のレジスタ log k 個で表現できるが、多項式の次数に応じた大きさの有限体に埋め込む必要があり log log k bit のレジスタを使う(Section 5 のように埋め込みのオーバーヘッドをさらに削ることもできる)。レジスタの個数は2入力1出力それぞれに割り当てればよく 3 log k 個で済む。スタック変数はループ変数(log log k bit)のみ。
Theorem 3.2 として引用しているように oblivious simulation という入力長 n にしか依存しない two-tape Turing machine に変換できる(時間のオーバーヘッドはもとの log が掛かる)ということを使う2。計算時間を b ステップごとに切ると、この b が tree の高さ h と値の情報量 log k のトレードオフになるので平方根くらいを選ぶと良い。
「実用的」かどうかについて
clean computation はサブルーチンを少なくとも2倍の回数呼ぶ必要がある。これだけでも再帰の深さ h に対して 2h 倍のオーバーヘッド。
The application/x-www-form-urlencoded percent-encode set contains all code points, except the ASCII alphanumeric, U+002A (*), U+002D (-), U+002E (.), and U+005F (_).
微妙なところとしては "specifically allowed by the URIscheme to represent data in that component" でなければ送信は厳格に受信は寛容にと(いつものパターンで)書かれている。こうなると RFC 3986 に閉じた話でなくなり、現実は WHATWG に反映されているはずなのでそちらを見ると、
URL.search は single quote ' も http(s) を含む一部 scheme でエンコードしているのでこれだけは何か事情がありそう。