跳慮跋考

興味も思考も行先不明

杞人多重世界を憂うや否や

偶には自分の妄言でも話しましょう。

極微の世界を扱う物理学として今日量子力学が確立されている訳ですが、量子力学ではその根幹に於いて当代あらゆる物理学者を悩ませる不可思議な言明を含んでいるのであります。
即ち、電子等々の粒子が微小世界で織り成す非古典的な振る舞いを波として見事に記述したのが先駆者シュレーディンガーの功績だったのですが、実験によれはこの「波動」というのは人間が観測したその瞬間まるで粒子に転じたかの様に「収束」してしまう挙動を示すのです。
古の人間原理を掘り起こしてしまったかと思わんばかりの奇妙な話ですが、これ以上の巧い理論も出てこないので仕方ありません……と思いきやエヴェレットにより「多世界解釈」と呼ばれる考え方が提出されます。
これは詰まるところ「世界は全事象の確率1を分け合っている」という様な話で、例えばある粒子が半分ずつの確率で崩壊した状態と崩壊していない状態の重ね合わせとなっていれば、それを観測した人も半分ずつに分かれて「崩壊したのを観測した人」と「崩壊していないのを観測した人」に分かれると謂います。何だか重ね合わせ状態が「伝染」する様にも思われます。
何れが真やら知れぬ話ですが、兎角この解釈に従えば天地開闢の初め以来今いる世界というのは途方もない数分岐した末だという事になります。否この私は、というべきなのでしょうか。まあどちらであれ現在進行形で単調減少中の低確率人生を送っていると言えましょうが、であればしてこの確率というのがその内0になってしまわないかという事を考えたりするのです。
妙な事をと思われるかもしれませんが、それほど無根拠という訳でもありません。
例えば、ゼノンの逆理という有名な話の現代物理学的な教訓は「時空は無限に分割し得ない」という事ですが、ならば時間にも長さにも最小単位がある訳でプランク時間プランク長さというのが正しくそれです。別にこれらは時空自体が離散的と主張するのではありませんが、しかし物理学からしてもよく分からなくなる閾値が存在するという事です。
人間はやはり恒久不滅の世界を願うものでありましょう。物理学の歴史を数十年縮めたと謳われる彼のアインシュタインですら膨張し収縮する、始まり終わる宇宙を忌避し、後に自ら「人生最大の過ち」と語るところの宇宙項を己が名を冠する方程式へ書き込んでしまうのであります。
そう、長々と書いたのではありますがこんなよく分からない話をせずとも我々の愛し憎むべき宇宙は「熱的死」やら「ビッグリップ」やらに脅かされている訳で、先行き不透明な科学世紀は未だ未だ続く趨勢と見えます。想うは易く得るは難き永遠。
嗚呼、知恵の実が生命の樹を生む日はいつならん!

様相論理の可能世界意味論のイメージ

調べた内容の私的な解釈を書いた感じなので用心されたい。

命題について、述語論理が「どんな対象について成り立つか」を扱う様に、様相論理は「どの程度成り立つか」を扱う。様相論理は世界(解釈とその上で成り立つ論理式の集まり)自体を記述し、命題に対する評価を考える。

論理式αに対して

  • □α ≡ ¬◇¬α
  • ◇α ≡ ¬□¬α

を定義し、□(box)と◇(diamond)を様相演算子と呼ぶ。
□αは「αは必然的である」、◇αは「αは可能である」という概念を形式化したものと捉えられる。実際 ¬□¬α ⇔ ◇α は「αでない事は必然ではない」=「必ずαでない訳ではない」=「αは可能である」と考える事ができる。
必然的を「全ての世界で成り立つ」、可能を「成り立つ世界がある」と捉えれば世界に対する量化とも言える。しかし、□α や ◇α という論理式自体も一つの世界に立つ存在なので、「全ての世界で成り立つ」という様に俯瞰的に世界達へ言及する事はできないのである。
そこで、「全ての世界」を「自分の世界から見える(到達可能な)世界全て」と修正する。到達可能性の範囲によって色々な公理系が考えられる。
(飽く迄公理系というのは意味論とは独立に、構文論上で定義できるが、概念を把握するには「到達可能な世界がどう規定されるか」という意味論的なところを同時に考えた方が分かり易いと思い以下の様に構成した。こうした(到達)可能世界意味論は様相論理の意味論の一つでしかないという事は十分に強調されなくてはならない。)

K (Kripkeによる体系)

命題論理に

  • 必然化規則「αが定理である時、□αも定理である」
  • 分配公理 □(φ→ψ)→(□φ→□ψ)

という規則・公理を加えた体系。
定理とは「妥当な論理式」=「全ての解釈で真な論理式」であり、αが定理かどうかは論理体系にのみ依存するので、必然化規則は「全ての世界」で論理体系は同一である事の帰結である。
到達可能世界は全ての世界の部分集合であるから、到達可能性が以下の公理でどう拡張されようともこれは成り立つだろう。
必然化規則は決して α→□α ではない。この論理式が表すのは「この世界でαが真ならば全到達可能世界でも真」という乱暴な一般化である。
分配公理は「□(φ→ψ)∧□φ ならば □ψ」という世界全体についての modus ponens と考えられ、到達可能世界の範囲がそれぞれの論理式で同一である事を表す。

T (Gödelによる)

Kに次の公理を加える。

  • □α→α

これは到達可能な世界に自分自身を含める。
到達可能の関係を⇝で表せば、これは W⇝W (反射律)が常に成り立つ事を言う。
{ W₁, W₂, W₃ }という3つの世界があるとすれば、
f:id:quinoh:20130428134744p:plain
という到達可能性が最低限存在するという事である。
この様な世界の集合、その間の到達可能性、そして各世界で成り立つ命題を合わせたものをKripke構造と呼ぶ。

B (Brouwerによる)

Tに次の公理を加える。

  • α→□◇α

これは全到達可能世界から自分が到達可能である事を表す。
W₁⇝W₂ ならば W₂⇝W₁ (対称律)を言う。
f:id:quinoh:20130428134758p:plain(*)
という到達可能性があれば、実は
f:id:quinoh:20130428135131p:plain
となっているという事である。

S4 (Lewisによる)

Tに次の公理を加える。

  • □α→□□α

これは「到達可能な世界から到達可能な世界」が到達可能である事を示す。
W₁⇝W₂ かつ W₂⇝W₃ ならば W₁⇝W₃ (推移律)を言う。
(*)の図の場合に
f:id:quinoh:20130428135453p:plain
となっているという事である。

S5 (Lewisによる)

S4に次の公理を加える。

  • ◇α→□◇α

これは「自分の到達可能な世界」が「自分の到達可能世界からの到達可能な世界」と同じである事を示す。
W₁⇝W₂ かつ W₁⇝W₃ ならば W₂⇝W₃ を言う。
S4の図について実際は
f:id:quinoh:20130428140542p:plain
となっているという事である。

平尾始氏及び上村芳郎氏の頁を参考にした。
また図はCarl Burch氏のAutomaton Simulatorによる出力を加工し用いた。

電王戦のコンピュータ将棋のスペック及び「人間の敗北」だと?

第2回将棋 電王戦というのがありまして、プロ棋士とコンピュータ将棋がガチバトルした訳です。それでコンピュータ側は3勝1敗1分の大殊勲だったと。
人間側完敗などと悲観的? に受け取る向きもある様ですが*1、私としては「よくもまぁコンピュータのゴリ押しでここまで戦えたなぁ」という感じです。もっと丸い表現で言えば「人間はここまでコンピュータに対抗できるのか」とでも言いましょうか。

コンピュータ将棋どころか将棋にも詳しくないのでアレですが、Wikipedia大先生によるとコンピュータ将棋の基本アルゴリズムは「評価関数の学習」と「局面の探索」に集約されるみたいです。
評価関数はその名の如く局面の有利さを評価する手段ですが、じゃあ「学習」って何だというと、要するに人間の思考をブラックボックス化してプログラムがその振舞いを模倣する様にパラメータを調節するんですね。それはもう厖大な棋譜を自動で処理して。
「探索」ってのは手当たり次第で次にあり得る局面を並び立てて、評価関数の値が高い、有利っぽい手を探す事です。
となると結局「中身は分からないが人間っぽい振る舞いをするプログラム」を作ってる訳で、そりゃ将棋には勝てるかも知れないけど、自然科学としては全き「敗北宣言」ではないかと私は思うのです。「どうしてその手を打つのか」は結局分からないのですから。

何とか人間に対抗し得るプログラムが現れ始めた事は勿論大きな一歩でしょうが、そういう訳で私は「コンピュータが人間に勝利した」というのに違和感を覚えてしまいます。
もっと人間の思考を追究し、明解なアルゴリズムによって本当に「考える」コンピュータが現れれば、電王戦に使われた様な化物級のマシンでなくとも人間が敗北を喫す日が来るであろう――というのが私の淡い期待です。
それには現在の論理ガチガチなコンピュータ・アーキテクチャでは望み薄という感じもしますが。今や細密化し過ぎたCPUはトンネル効果により回路間で漏電が起こって困ってるそうですが、寧ろそんなノイズバリバリの回路を有効活用したりとかどうかな(適当)。

兎に角その「化物級」スペックなんだよ、という主張をする為にデータを集めてたというかデータの前振りのつもりで何となく書いてたんですが完全にそっちが主題です本当にありがとうございました。以下スペック情報の引用。3GHzのCPUとか天から降ってこないかな。

*1:こうゆう所でさりげなく大嘘を吐く人とかもいるので、普通に「へーそうなんだ」と思った人は注意した方がいいですよ。

続きを読む

二重階乗の一般化

その昔、Eulerは階乗 n!の一般化として積分 \int_{0}^{1} \left( \log \frac{1}{y} \right)^n dy = n! を見出し、後にGaußが \Pi(n) = \int_{0}^{\infty} e^{-x} x^n dx = n! と書き直した訳ですが、では二重階乗 n!!なんかはどうなるのという話。
因みに現代では \Gamma(n) = \Pi(n-1) = (n-1)! というややこしい定義のガンマ函数が罷り通っていますが、ここでは使いません。その方が綺麗なので。

さて取り敢えず n=2mの場合を考えてみる。
 (2m)!! = 2m \cdot (2m-2) \cdot (2m-4) \cdots 4 \cdot 2
 = 2^m (m \cdot (m-1) \cdot (m-2) \cdots 2 \cdot 1)
 = 2^m m!
なので、nが偶数の場合 n!! = 2^{\frac{n}{2}} \Pi\left(\frac{n}{2}\right) (甲)が成り立つ。
この右辺は奇数の場合にも使えないだろうか? という訳で n=2m+1としてみる。
 \Pi\left(\frac{2m+1}{2}\right) = \frac{2m+1}{2} \cdot \frac{2m-1}{2} \ \cdots \frac{5}{2} \cdot \frac{3}{2} \Pi\left(\frac{1}{2}\right) = \frac{ (2m+1)!! }{ 2^m } \Pi\left(\frac{1}{2}\right)
ここで \Pi\left(\frac{1}{2}\right) = \Gamma\left(\frac{3}{2}\right) = \frac{1}{2} \Gamma\left(\frac{1}{2}\right) = \frac{ \sqrt{\pi} }{2} となるのはガンマ函数界では有名な話なので、nが奇数の場合 n!! = \frac{1}{\sqrt{\pi}} 2^{\frac{n+1}{2}} \Pi\left(\frac{n}{2}\right) (乙)が成り立つ。

さて甲乙2式を比べると、奇数の場合のみ因子 \sqrt{ \frac{2}{\pi} } が掛かっているので、 f(2m) = 0, f(2m+1) = 1 \qquad (m \in {\mathbb Z}) を満たす解析函数fが欲しい。
実軸上で実数値函数とすれば、三角函数が正にそれである。 f(x) = \frac{ 1 - \cos(\pi x) }{2} = \sin^2 \frac{\pi x}{2} とすれば \left( \frac{2}{\pi} \right)^{ \frac{f(n)}{2} } でこの因子が記述できる。

以上より

となり、右辺は負の偶数を除く実数全体で定義される。

Maximaでチェック&プロット。

(%i1) f(n):=(2^n*(2/%pi)^(sin(%pi*n/2))^2)^(1/2)*gamma(n/2+1);
(%i2) makelist(f(n), n, 10);
(%o2) [1,2,3,8,15,48,105,384,945,3840]
(%i3) makelist(n!!, n, 10);
(%o3) [1,2,3,8,15,48,105,384,945,3840]
(%i4) plot2d( f(x), [x, -7, 7], [y, -100, 100] );
(%i5) plot2d( log(f(x)), [x, 0, 20] );

普通に描いたのがこれ。
f:id:quinoh:20130411002510p:plain
sinの影響でうねうねしてますね。あと発散点を巧く処理できてなくて途中で切れてます。
対数はこれ。
f:id:quinoh:20130411003959p:plain

そしたら三重階乗とかも考えたいところですが、同じ様に \Pi\left(\frac{n}{3}\right) を使うと
 (3m-2)!!! = 3^m \Pi\left( \frac{3m-2}{3} \right) / \Pi\left(-\frac{2}{3}\right)
 (3m-1)!!! = 3^m \Pi\left( \frac{3m-1}{3} \right) / \Pi\left(-\frac{1}{3}\right)
 (3m-0)!!! = 3^m \Pi\left( \frac{3m-0}{3} \right) / \Pi(0)
となるので、これを自然に書くのは無理があると思いますねぇ。

F#の無限シーケンスで素数列

Haskellでよくある

primes = [2, 3]
       ++ filter (\n -> all (\p -> mod n p /= 0)
                 $ takeWhile (\p -> p*p <= n) primes) [5, 7 ..]

的なやつを。

let infty n m = Seq.initInfinite (fun i -> n + i * m)

let rec primes = seq {
    yield! [2; 3]
    for i in infty 5 2 do
        if Seq.forall (fun x -> i % x <> 0)
                  (Seq.takeWhile (fun x -> x*x <= i) primes)
        then yield i
    }

なんか若干「そういう言語じゃねーから」みたいな感じがしますね。
F#は正格評価の言語なので、C#でいうとIEnumerable<T>とか書く時のごてっとした感じ?

make10

「8 8 9 9」のmake10を四則演算でやれと言う話なので。分かんないので。
アルゴリズムとしては「切符の番号で10を作る」のと同じです。カッコよく言うと分割統治法。コードはあんま美しくないけど。

import Data.List


data Expr = C Int | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr

instance Show Expr where
    show (C x)     = show x
    show (Add x y) = "(" ++ (show x) ++ "+" ++ (show y) ++ ")"
    show (Sub x y) = "(" ++ (show x) ++ "-" ++ (show y) ++ ")"
    show (Mul x y) = "(" ++ (show x) ++ "*" ++ (show y) ++ ")"
    show (Div x y) = "(" ++ (show x) ++ "/" ++ (show y) ++ ")"

instance Eq Expr where
    (C x)     == (C y)     = x == y
    (Add x y) == (Add u v) = (x == u && y == v) || (x == v && y == u)
    (Sub x y) == (Sub u v) = (x == u && y == v)
    (Mul x y) == (Mul u v) = (x == u && y == v) || (x == v && y == u)
    (Div x y) == (Div u v) = (x == u && y == v)
    _         == _         = False


search n a = nub $ concat $ map (\(e,b) -> _search n b (C e)) (picks a)

_search :: Int -> [Int] -> Expr -> [Expr]
_search n a p = if null a
                    then (if eval p == Just (fromIntegral n) then [p] else [])
                    else concat $ map (\(e,b) -> concat $ map (\q -> _search n b q) (opr (C e) p)) (picks a)
 where
     opr x y = [Add x y, Sub x y, Sub y x, Mul x y, Div x y, Div y x]

picks a = [pickAt i a | i <- [0..(length a)-1]]
pickAt n l = (\(a,b) -> (head b, a ++ tail b)) (splitAt n l)

eval :: Expr -> Maybe Rational
eval (C x) = Just (fromIntegral x)
eval (Add x y) = eval x >>= (\m -> eval y >>= Just.(+ m))
eval (Sub x y) = eval x >>= (\m -> eval y >>= Just.(\n -> subtract n m))
eval (Mul x y) = eval x >>= (\m -> eval y >>= Just.(* m))
eval (Div x y) = eval x >>= (\m -> eval y >>= (\n -> if n == 0 then Nothing else Just (m / n)))

出力結果は

*Main> search 10 [2,3,7,7]
[(7+((7+2)/3)),((3+(7*2))-7),(3-(7-(7*2))),(3+((7*2)-7)),(3+((7+7)/2))]
*Main> search 10 [8,8,9,9]
[]

みたいな。要するに最初のは解無しっぽいという話でした。

連分数


みたいなのを連分数と呼ぶ。これだとスペースを取るので

とか(低い位置の+は直前の分数の分母にそれ以降を足す感じ)、分子が皆1の時は+の左の数字を並べてとも書く。
値を求めるには、これをと置くと

よりとなるから

は普通に考えて正なので、の正を取るとこの値は黄金比である。従って

が成り立つ。

実数の連分数展開

ある実数を整数部と小数部に分けられれば、それを連分数に展開できる。
例えば円周率

という感じでになる(WolframAlphaで計算)。
ここでと近似すると、

という有名な近似分数が現れる。

円周率は二進法なら11.0010010...だし十六進法なら3.243f6a88...だが、連分数展開により現れる数列は円周率の値のみで定まる。
それ故、連分数展開はより数の自然な表現を与えるとも言えよう。

一次分数変換

ところで、定数について

なる函数を一次分数変換とかメビウス(Möbius)変換とか呼ぶ。ではに「潰れる」ので除いておく。
一次分数変換及びを合成してみると

となる訳だが、これは

という行列積の要素と見事に符合している! ので、

という表記を用いると一次分数変換の合成等を行列の計算で扱える。

連分数と行列

さて

を眺めると、これが一次分数変換

により

と表せる事に気付く。
すると、例えばの場合、と置いて
('13/03/06 係数の誤りを訂正)
と対角化する事で

より

を得る。より

なので、再び

を得る。

級数の連分数展開

級数を無理やり連分数に展開して

と出来るから、

又は「約分」して

となる。
ここで

より分母位置の0を消去できる。即ち





例えばとすると、

という指数函数の連分数展開が得られる。

こうした展開例については数学研究ノートの連分数の項に詳しい。('17/08/04 移転していたのでリンク修正)