ガラスのプログラム

ガラスは本当に固体か? −コンピュータシミュレーションと情報理論による予測−
http://www.kyoto-u.ac.jp/ja/research/research_results/2014/150122_1.html

元論文を読むと、1300個のビリヤード球の衝突の計算で結果を出されてます。腕に憶えのあるプログラマは挑戦してみては?
その道筋を書いときます。

1:玉の衝突の計算

半径1の玉を箱の中で動かします。壁があるとしてもいいし、壁に来たら反対から出てくるドラクエ式でもいい。
まずは時間DTだけ進めて速度*DTだけ玉を動かし、DTのうちに壁にぶつかるかどうかを判定し、ぶつかるなら、衝突する時間まで時間を進めて玉を壁にひっつけ、そこで速度を反転させます。

#define DIM 2
double pos[DIM], v[DIM];
double min[DIM],max[DIM];
double pos_new[DIM];
double dt;
...

  while(1){

  double t_hit= dt;
  int hit_flag= -1;

  for(m=0;m<DIM;m++)
  { 
     pos_new[m]=pos[m]+v[m]*dt;
     if(pos_new[m]<min[m])
     {
          double tt = -(pos[m]-min[m])/v[m];
          if(hit_flag==-1 || tt<t_hit)
          {
              t_hit = tt;
              hit_flag = m;
          }
     }
     if(pos_new[m]>max[m])
     {
          double tt = (max[m]-pos[m])/v[m];
          if(hit_flag==-1 || tt<t_hit)
          {
              t_hit = tt;
              hit_flag = m;
          }
     }
  }//m

  for(m=0;m<DIM;m++)
    pos[m] += t_hit * v[m];
  
  if (hit_flag!=-1)
     v[hit_flag] = -v[hit_flag]; 


  }//while

2:玉を増やす

二個以上に玉を増やします。玉同士の衝突も判定します。玉の中心同士の距離が2以下になるかどうかで判定。
玉同士、玉と壁などそれぞれ判定し、ぶつかるのがあるなら、一番早い時間にぶつかるイベントを見つけます。
その時間まで時間を進めて、衝突による速度の反転処理を行います。
玉iが場所Riにいて速度Viの時(R,Vはベクトル)、玉iとjが衝突する時間tは(Ri-Rj +t(Vi-Vj))^2=2^2 という二次方程式を解いてtの小さいほうの解からわかります。解がないときは衝突なし。
これで完成

#define N 100
#define Sq(x) ((x)*(x))
  // position, velocity, radius
  double pos[N][DIM], v[N][DIM], r[N];
  ...
  double tmin = dt;
  int imin=-1, jmin=-1;
  for(i=0;i<N;i++)
  {
    for(j=0;j<i;j++)
    {
        double a = 0.0;
        double b = 0.0;
        double c = -Sq(r[i]+r[j]);
        for(m=0;m<DIM;m++)
        {
           double dp = pos[i][m] - pos[j][m];
           double dv = v[i][m] - v[j][m];
           a += dv*dv;
           b += 2*dv*dp;
           c += dp*dp;
        }
        double det = b*b - 4*a*c;
        if(det<0.0) continue;
        if(a < 1.0e-10)continue;
        //課題:sqrtの計算回数を極力減らす工夫をせよ
        double t_c = (-b -sqrt(det))/(2*a);
        if(t_c > 0.0 && t_c < tmin)
        {
          tmin = t_c;
          imin=i;
          jmin=j;
        }
    }//j
  }//i 

3実験

二次元でも三次元でもいいけど、箱に玉を隙間無くぎっしり詰めます。そして玉の半径を0.99倍にして、各玉にランダムな速度を与えます。
ガチガチガチガチとぶつかりまくります。しかし回りを玉に囲まれてるんで、同じ場所で振動する感じです。
速度を変更せず、更に半径を少し縮めます。動ける範囲は少し広がるけど、やっぱりガチガチです。
どんどん小さくしていくと、ある所で急にブワーっとグチャグチャになるはずです。これが固体・液体の相転移
これを実際の高分子の玉でやったのがこの実験
http://physicsworld.com/cws/article/news/2012/oct/05/tiny-spheres-simulate-crystal-melting

実験2

液体の状態から、逆に玉の半径を徐々に増やしていきます。減らすのより若干別の処理がいるかも。どこかで、かたまって固体になってガチガチになるはず。

実験3

液体の状態で、玉の半径を若干ばらつかせて、大きいのや小さいのがあるようにします。ここから玉の半径を、互いの比率は保ったままで徐々に大きくしていきます。どこかでガチガチになるけど、きれいに揃えない。これがガラス。
動画を発見。固まるところまでいってませんが。

バトルシップのゲーム理論

バトルシップマインスイーパーのようなゲームで昔からあるボードゲームです。映画バトルシップのモトネタになりました。
ルールは説明するよりプレイしたほうが早いんでこちらを。
http://www.sousakuba.com/flash-games/battleship-game.html

例えば単純化して3x3のマスに1x2の駆逐艦だけを置く場合を考えます。置き方は以下の12通り。

□■□ □□□ □□□ □□□
□■□ □■□ □■■ ■■□
□□□ □■□ □□□ □□□

■■□ □■■ □□■ □□□ □□□ □□□ □□□ ■□□
□□□ □□□ □□■ □□■ □□□ □□□ ■□□ ■□□
□□□ □□□ □□□ □□■ □■■ ■■□ ■□□ □□□

これをランダムに選んだ場合、初手で真ん中を攻撃すると当たる配置は上の4通りで、当たる確率は4/12=1/3。角を攻撃すると当たる確率は2/12=1/6。角の間だと3/12=1/4。真ん中を攻撃するのがよさそうに見えます。
では相手が真ん中を攻撃すると知っていてその裏をかきたい場合、真ん中を避けて下の8通りからだけ選んで、それを相手も知っている場合は、相手は外側を攻撃します。その場合当たる確率は1/4。さっきより置く側が若干有利です。

さらに置く側は裏をかいて、上の4通りを確率p/4ずつ、下の8通りを確率(1-p)/8ずつでランダムに選ぶとします。
攻撃側は(1)真ん中を攻撃すると当たる確率はp、(2)角を攻撃すると当たる確率(1-p)/4、(3)角と角の間のマスだと確率(1-p)/4+p/4=1/4で当たることになります。(2)より(3)のほうが常に大きいので(1)か(3)かということになります。
どちらが大きいか考えると、p<1/4の場合は(3)を攻撃、p>1/4の場合は(1)を攻撃すればいいということになります。
置く側はこの確率を下げたい。それにはp≦1/4であればよくて、1/4で当たることになります。改善はなし。

と、ここまでは初手のみを考えた場合ですが、二箇所に当てるのにかかるターン数を最小にしようと思うと、真ん中は当たる確率大きいけど次に仕留めるのに最悪4ターンかかってしまうのに対し、角で当たった場合は最悪でも2ターンで終わるので、そのあたりも考える必要があります。

ごちゃごちゃと計算すると置く側は12通りを完全にランダムに1/12の確率で選べば、相手が仕留めるまでのターンの期待値を一番大きくできることが分かります。これがもっと複雑な場合でも成り立つのか、つまり単純素朴に何も考えずに船を配置していけば相手が一番困る、のかどうか。なんとなく最大エントロピーとかの概念で証明できるような気もしますが、たとえば上の例で駆逐艦を二隻に増やしたらもうそれだけで計算が爆発しちゃうんでよくわかりません。
1x3の船を置く場合は計算が簡単で成り立つことは確認しました。

まずは、
Conjecture1: 攻撃側は各ターンで得られる情報エントロピーの期待値を最大にするようなマスを選べばターン数の期待値が最小になる
あたりを証明できれば。

3x3の場合の戦略

□1□
2□3
□4□

1,2,3,4の順に当たるまで攻撃。

A*C
□B□
□□□

トドメをさせる確率はAとCで(1-p)/2、Bがp。よってp>1/3ならBACの順に攻撃、p<1/3ならACBの順に攻撃。
置く側はp=1/3にすれば最適。

ランダムに置く方法

たとえば長さ5の空母をランダムにどこかに置いて、空いてる場所に長さ4の船を置いて、、という方法では完全にランダムにはなりません!空母が真ん中にある配置はそれが邪魔になって他の船を置く場合の数が減るけど、端に空母を置く場合は邪魔にならないので場合の数が増えます。最初に空母を置く場合は他の全ての船を置く場合の数を数え上げて、それに比例した確率でマスを選ばないといけないのです。しかしそれは計算量が爆発して困難。
別の方法として、重なっても気にしないで全ての船をランダムに配置し、一箇所でも重なっていたらやり直し、という方法ならば効率は悪いけど実際のゲーム程度の船の密度ならなんとかなります。

情報量

既に攻撃したN箇所が当たりか外れか分かっている状況でその情報に矛盾しない全ての配置を考えてそれらの確率の和が1になるように規格化してエントロピーを計算すると、全ての船を沈めた状態ではこれが0になってる状態。したがっていかに早くこれを0にするか、という問題になりますが、各ターンでのエントロピーの減少を最大化する戦略が必ずしも最速とは限らない。2手、3手まとめた場合のエントロピー減少を最小にするという方法も考えられる。逆にこのエントロピーの初期値を最大にするには全ての状態を等確率で選べばいい。

過去に戻れる世界のシミュレーション

イーガン『クロックワーク・ロケット』世界の計算
Memeplexes: 『クロックワーク・ロケット』(グレッグ・イーガン)のシミュレーション?

ああ、これについては記事を書こうと思ってたけど、思っていたことを全て書かれた感じです。素晴らしい。

たとえばビリヤード。この世界でシミュレーションしようと思ったら玉の位置と速度を設定してから順々に動かして行けばいいわけです。ニュートン力学の勝利。
しかし、たとえば、ある穴に入ったら反対側の穴から「五分前」に同じ速さで出てくるというタイムトンネルがあったらどうでしょうか。計算無理ですね。ピンボールのゲーム作ってそういうギミックを入れたとしましょう。穴から玉が出てきたらかならず五分後には別の穴に玉が入らないといけないです。しかしプレイヤーがわざと玉を落としたらタイムパラドックス!ダメです。

また、たとえば玉と玉の反発力を計算したいとしましょう。普通は「同時刻」の玉の位置関係から力を計算して反発させますが、「同時刻」の定義は観測者に依存してしまいます。じゃあ対称にしよう、ってことで4次元空間で相手の軌跡すべてからの反発力を足した力が働くとする、としましょうか。すると相手の未来の位置が必要になります。それは今から計算しようとしてるんで分かりません。ダメです。いちおうこっちの世界では過去からの寄与だけ足せばいいんで計算はできます。
ただし、現在のスナップショットだけあれば計算できるよ、っていう位相空間とか正準方程式っていう概念は破綻します。リュービルの定理が相対論的に拡張されたという話は聞いたことがありません。いや、あるのかな?
要検討 http://web.mit.edu/edbert/GR/gr3.pdf


テッド・チャンのいくつかの短編で出てくるような話です。なんか、矛盾ありで初めに歴史を作って、それを反復解法で徐々に矛盾を解消するような方法があればいいんですが。

思いつき

こんなRPGどうでしょうか。主人公が弱い時にピンチになるが謎の助っ人が登場、操作できて色んな強力な技とか使い放題で敵を倒す。
ゲームが進んだ時、例の助っ人は強くなった自分自身が過去に戻ったんだと分かる。その時に使った強力な技をマスターして過去に戻るまではゲームが進まない。

グラス的長距離相互作用格子ガス

http://www.azspcs.net/Contest/DelacorteNumbers
L×Lの正方形に1からL^2までの整数を置く。各整数は他の整数と距離の二乗のエネルギーで相互作用し、その強さは最大公約数に比例。
L=3〜27までの場合に相互作用が正と負の場合の基底状態を求めよ。
締め切りは来年正月。一位賞品はなんかよくわからない店の$500の商品券。さあ統計力学の力を世界に見せ付けるのだ。

TIPS

まあとりあえずメトロポリスでアニールしてみるかという事になるわけですが、そうなると更新はまあ二つを入れ替える、くらいしか思いつかないわけで。その試行でのエネルギー変化の計算がホットスポットですね。素朴にやると演算量はN二乗に比例。
変化だけ計算すればいいことに気がつくとN一乗でいける。
さらにGCDをGCD-1で置き換えても問題が等価ということに気がつけばGCDが1でないペアは全体の40%程度なのでかなり時間削減できる。
さらにその式を睨んで因数分解し演算数を減らせばさらに倍速くらいに行ける。
あとは一回のステップで扱うテーブル等がすべてキャッシュに収まるようにサイズを減らす。
この辺りまでが小手先でなんとか出来るレベル。
そこから先は出てくる状態を睨んで問題に潜む構造を読み取らねばならないでしょうね。結構奥が深くて面白い問題です。
10x10までやってみた感じではMINよりMAXが難しい。業界で言う所のグラッシーでメタスタに嵌りやすい感じ。

地球に穴をあけたらどうなる?

この質問。http://q.hatena.ne.jp/1412645084

たかだか標高8kmの山に登った程度で命に関わるくらい空気が薄くなるわけで、じゃあ反対に6000kmくらい下にいったら超はげしく空気が濃くなるよね、って話。
理想気体を仮定して計算すると指数関数的に濃くなっていき、数百kmで液体の濃度に近くなり理想気体として扱えなくなります。
ちなみに、圧力の増加=高度差×モル濃度×重力加速度×モル質量、これを解くとモル濃度=地表でのモル濃度×exp(深度×モル質量×重力加速度/(気体定数絶対温度))
理想気体で計算できる範囲では、指数的増加のスピードはモル質量が重いほど速いので、地表では少ないキセノンなんかが途中で酸素や窒素を追い抜いて最初に液体の濃度に達します。
そうなるともう酸素や窒素は共存できなくなって途中からはほぼ100%キセノンのみという状態になるはずです。
ちょいと面倒ですが実際に計算してみました。
混合気体状態方程式は、ファンデルワールス方程式を使います。理想気体からのズレを表す係数は各気体成分の値から分率を使って計算されます。
圧力の増加=高度差×モル濃度×重力加速度×モル質量、で圧力の増加を計算し、状態方程式からモル濃度の増加を計算。
次に各成分について自由エネルギー= 高度×モル濃度×重力加速度×モル質量- RT モル濃度 Log(モル濃度)、の変分を使って、これと全体の増分が上の計算と一致する拘束条件でラグランジュの未定乗数で各成分の増分を計算することを繰り返します。
100km付近でキセノンの一人勝ちになり他の気体が減っていきます。

割合はこちら。最初に重い酸素やアルゴンが増えていくけど、途中からキセノンに押され150kmからはほぼキセノンが100%に。

そこから下のXeの圧力変化はこんなかんじ。周囲の温度はどっかから適当な値を拾ってきて線形補完しました。右の相図はシミュレーションの論文から引っ張ってきました。圧力が上がって1000km付近で固化。地球中心付近では重力が0に近づくので圧力はサチるけど温度が上がっていくならまた液化するかも、というところ。ちょうど相境界のへんをうろうろしてるんでどっちになるか微妙ですが。
ちなみにXeの最大圧力は80GPa程度に対し、周囲の地球の圧力は300GPa以上。個体Xeよりはるかに重い鉄とかいろいろあるんでトンネルの壁がなければさらに潰されてしまいます。圧力が周囲と同じ、という条件でやればもっと早く固化するでしょう。
http://www.nature.com/nature/journal/v401/n6752/fig_tab/401432a0_F1.html#figure-title

追記

gの変化:http://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%83%E5%86%85%E9%83%A8%E7%89%A9%E7%90%86%E5%AD%A6#.E9.87.8D.E5.8A.9B.E5.8A.A0.E9.80.9F.E5.BA.A6.E5.88.86.E5.B8.83
線形に減るんじゃないんですね。温度とあわせて、あとで計算しなおします。定性的な結論は変わりませんが。

Xeより重い気体として、地表のUから出るラドンや、火山から出る水銀(はてなの質問コメントで指摘していただきました)などがありますが、生成、気流による拡散、地表への沈降、化学変化、崩壊などの過程を経る非平衡状態にあるので計算が困難で除外しました。平均濃度が変動するのでデータがありません。
http://www.engineeringtoolbox.com/air-composition-d_212.html
また地上では地表で熱せられた気体が軽くなって上にいったり気流で拡散するので単純なexp(-ghρ/RT)の式からは大きくズレます。

Xeは安定同位体が5種類あり、分子量1の違いは深度が1km*絶対温度くらいあると顕在化するので重いものが地下で精製される可能性があります。後で計算します。

追記

こうして計算されるのは無限の時間が経過した後の平衡状態。そこに達する時間スケールをざっくり見積もる必要があります。
たとえば液体になった時に重い原子が下で濃くなっていく速度は拡散のドリフト速度で評価でき、アインシュタインの式から拡散定数*原子の重さの差*加速度/ボルツマン定数*温度で、原子量1の違いで1mm/年程度です。遅い。
そうなると穴をどう掘るか方法に依存することに。まあ無理なものを考えても詮無いことですが、たとえば筒をギュウギュウ押し込むとすると内部の物質も一緒に落ちて上から新たに供給されることに。一年で数ミリづつ押し込めば実現できるって感じでしょうか。数十億年あれば地球中心に達します。
そう考えれば木星とか中心に重い同位体が集まっていても不思議じゃない。まあそれ以前に水素とヘリウムの比率からしてよく分からないようですが。

追記

この手の計算は極限状況での物質の状態方程式がキモになります。Xeはいろいろ調べられているようですが、どうも論文によって適用範囲が違って振る舞いがかなり違います

簡単なファンデルワールスだと密度が一定以上にならないけど、非常に高圧だと結構圧縮されるようです。これが中心の圧力にも効いてくるんで重要。J.Chem.Thermo.という論文に出たのがよさげ。1000K以上は範囲外だけど無理やり線形外挿で使ってみた。
つづく

素粒子クリッカー

CERN謹製のブラウザーゲーム
http://particle-clicker.web.cern.ch/particle-clicker/

  • 加速器をクリックするとデータが蓄積されます
  • データが蓄積すると新しい素粒子などを発見できます
  • 新発見があるとCERNの名声が上昇します
  • 名声が上がると予算が増えて金が貯まります
  • 金で院生やポスドクを雇うと自動でデータを貯めてくれます
  • ビールやコーヒーを充実させると院生さんたちの性能がアップします
  • 加速器を改良するとより多くのデータがたまります
  • 広報活動に金を使うと同じ成果でも多くの金が入ります
  • 新しい粒子を発見したら続けて成果を出す前に該当成果の広報を二段階アップグレードさせておくと同じ発見でも名声の上昇率が上がります。過去の成果には遡って適用されないので一報目で広報に金をかける事。
  • 金が貯まると教授やノーベル賞受賞者を引き抜いてこれます

Higgs bosonを見つけたあたりからペースダウンしたので手遊びに最適解を出してみた。アップグレード全購入後のパフォーマンスで評価してるので序盤は正しくないです。パフォーマンス/コストが最大のを選択することを繰り返してるだけ。
Higgs bosonの9報目を出すのに実時間で1年かかると分かったのでプレイをやめました。

続きを読む

立方体地球

コメント欄で「客員研究員」さんからの教えて頂きました。地球が立方体だったら?という想定で専門家が気候などを計算し、面白い短編映像を作っています。

自分の計算、定性的に同じで定量的に半桁ほど違ってたりしますが、まあ業界用語で in the right ballpark。
http://d.hatena.ne.jp/ita/20090821/p1

自転軸が1,0,0方向としてます。慣性テンソル単位行列*定数になるんでどの向きでも安定だけど、高次の項の効果を入れるとどうなんですかね。内部のマントルの流動とか。まあ設定自体がリングワールド並みなんで細かく考えてもしょうがないですが。

作ってる財団、昔「戸締り用心、火の用心。水は命のお母さん、すいすいすいすい水曜日」とかやってた所ですね。

そういえば、「ドーナツ型地球」について計算してる人もいました。
http://www.aleph.se/andart/archives/2014/02/torusearth.html
立方体と違い、ジオイド面と表面が一致していて、普通の岩で作っても崩れません。ただし岩の分布が不均一になると線形不安定となり、どんどん崩れます。それに負けずに重機で地面を均し続けていけば、まあ大丈夫ですが。