TSG 部報 第 194 号・駒祭号

[-> TSG Home Page]


四柱推命

Aleph-NULL

 「占い」とは何か。人によって答えは大きく異なる。「将来を絶対的に示すもの」と思う人もいれば、「単なる出鱈目」と思う人もいる。人それぞれの考え方が当然存在する。そもそも「占い」とは何だったのだろう。
 はるかなる古代、自然に対して無力な人間は、自然の猛威の前に、何とかして事前に予知ができないかと苦心した。そんななかで、「占い」という物が生まれた。そして占師は非常に高い地位を社会の中で占めて来た。やがて、時代が進み、ある程度自然災害に対処できるようになって、占いと言うものはやがて個人の運勢など漠然とした「未来」にその対象を置き換えて来た。そして、いわゆる「方違え」で知られるような民間の迷信的なものとして、時には不便を強いるほど、生活に強い影響を与えて来た。ある意味ではこれも、「未知なる未来」に対する怖れの現れかも知れない。
 現代に於いてはどうだろうか。科学技術の進歩と、自然災害などに対する危機管理の進歩で、未来の「天災」に対する恐怖はだいぶ薄れた。方角などを厳密に気にして、わざわざ前の日に「方違え」をして別の家から会社に出勤する人もまずいないだろう。しかし「占い」は滅びるどころか、しっかりとした存在を保っている。現代人でも、「未来」が知れないことに対する恐怖心は存在するのだろう。
 もちろん、「絶対的な」将来など決定し得ないことは(少なくとも科学的な見地からは)明らかである。しかし、運命の勢い、すなわち「運勢」というものは人間の感覚として存在する。そして、そういった漠然とした「運勢」というものが、現代人の未来への恐怖に対しての心の拠り所として、存在することは事実であろう。

*  *  *

 というわけで、TSGでは今年も占いをやります。今年は、古くは古代中国の五行説に端を発し、中国・明の代に整えられた、「四柱推命学」の占いです。
 四柱推命は、生年月日・時刻を元に、人間がうまれつき持っている「運勢」を知る占いです。立春を筆頭とする二十四節(節気)と地球の自転周期を元にして、それぞれ個人の持つ運勢の流れを判定します。いわゆる「辰年生まれ」「卯年生まれ」といった分類を、月日のデータまでつかってより精巧に解析するものと考えれば良いでしょう。
 今回のプログラムでは、太陽位置の計算プログラムを中心に、TSGer手製のプログラムで、皆様の基本運勢や相性勢を弾き出します。
 ただ、最初にも書いたように、占いで判るのは「運勢」、つまり基本的な運命のめぐり合わせの流れです。実際にどういうめぐり合わせになるか、チャンスを生かすかどうかはあなた自身です。この占いで得られた運勢を、あなたが人生の中でうまく活かしてゆけることを願っています。

<< 1995. 11. 23 Aleph-NULL >>


理論科学シミュレーション

渡辺 尚貴 (なお)

        

その1。 振子シミュレーションの最高峰
多重複振子(モビール)のシミュレーション

 「モビール」というおもちゃを御存じですか? やじろべいの下にやじろべいがぶらさがって、その下に綺麗な飾りがぶらさがって、全体が不思議にふらふら揺れる夏の風物のようなおもちゃです。
 このモビールの運動を物理的に研究しました。この運動方程式の算出は極めて面倒な作業ですが、私は解析力学の手法を極めて効率良く利用する方法を独自に編みだし、それをアルゴリズム化までしました。
 このn元連立微分方程式はコンピュータによって精度良く数値積分して解かれその奇妙な動きがディスプレイに表示されます。
 さらに、あなたの好きなようにモビールを組み合わせて、それをシミュレートできるようにもなっています。是非、遊んでみてください。

その2。 コンピュータシミュレーションの活躍の場
数値流体シミュレーション

 コンピュータシミュレーション(以下では数値計算と呼びます)がここ数年工学や理学の分野に急速に普及してきています。それは、数値計算が他の実験より遥かに簡単に、それも現実の実験室では無理なような「実験」もシミュレートできてしまうからです。
 特に船舶、航空、宇宙船、気象、宇宙進化論、分子運動論の最先端の分野ではこの数値計算が非常に強力な開発援護の手段となっています。特に流体を扱う分野での数値計算が目立ちます。
 流体の運動はニュートンの運動方程式をちょこちょこと書き換えて作られた「ナビエ=ストークスの方程式によって支配されています。
 非圧縮性ナビエ=ストークスの方程式を載せましょう。

  div(V) = 0
  dV/dt + (V・grad)V = -grad(P) + (grad(div(V)) - rot(rot(V)))/Re
    V:速度ベクトル P:圧力 Re:Reynolds number

 何だかわけのわからない方程式ですね。わかる必要はないでしょう。とにかくこのような方程式で流体の運動は計算することができます。

 数値計算ならコンピュータが面倒な計算をしてくれるのだから運動方程式ができれば簡単と思われるでしょう。
 しかし流体の計算は難しいのです。銀河系のシミュレーションよりも難しいです。流れの場を適切に離散化する格子を生成して偏微分方程式をその格子用に座標変換した差分方程式に書き換えなくてはならないのです。その上で、非線形効果がもたらす「誤差」を可能な限り小さくする工夫を施さなくてはなりません。詳しく書くと長くなるので苦労話はここには書きません。

 今日、ここに展示しております「数値流体シミュレータ」は水の流れの中に任意の形の多角柱を入れたときに、水がどう流れるかを数値計算して、その流れの方向、圧力を計算します。いろいろ試して、揚力が大きくなる物体の形を探してみてください。

その3。 力学モデルの数値積分の革命
シンプレクティック数値積分法

 数値積分をしたことのある人なら「オイラー法」「ルンゲ・クッタ法」を御存事でしょう。これらの方法は厳密解とは少しずれます。このずれがだんだん溜ってやがて実際とはずいぶん違った結果になります。この誤差はどんなに時間間隔を短くしてもなくなりません。逆に時間間隔を短くすると計算の回数がふえるので、掛け算などでの丸め誤差がたくさん入ってきてしまいます。
 そこで、まったく新しい原理による数値積分法というものが登場しました。力学モデル(位置と速度だけような系)にしか使えませんが、それでも十分画期的な方法です。その方法とは Symplectic Numerical Integral Method(シンプレクティック数値積分法)と呼ばれています。この方法の基本的な仕組みと実際のアルゴリズムを紹介します。
 例として、バネの横振動を考えます。バネの自然長からの変移をx、おもりの速度をv、おもりの質量は簡単のため1にし、バネ定数も簡単のため1にします。すると力学的エネルギーEは

  E = x*x/2.0 + v*v/2.0 ;

となります。またx,vの時間微分の値は運動方程式より

  dx/dt =  v ;
  dv/dt = -x ;

なので、オイラー法では数値積分は次のようになります。

  x2 =   1 * x1 + dt * v1 ;
  v2 = -dt * x1 +  1 * v1 ;

(x1,v1),(x2,v2)をベクトルと思えば、これは線形変換です。その変換行列の行列式は(1+dt*dt)ですね。行列式はその変換で任意の平行四辺形の面積の拡大率を表しています。その値が(1+dt*dt)なのですから、オイラー法を進めていくとベクトルの大きさがどんどん大きくなっていってしまうことがわかりますね。

 さて、オイラー法をちょっとだけ変えて次の数値積分をしてみましょう。

  x2 =   1 * x1 + dt * v1 ;
  v2 = -dt * x2 +  1 * v1 ;

x1がx2になっただけです。つまり加速度の評価を次の時間ステップでの値を使っているのです。下の式のx2に上の式のx2を代入してみましょう。

  x2 =   1 * x1 +       dt * v1 ;
  v2 = -dt * x1 + (1-dt*dt)* v1 ;

この変換行列の行列式は1になってますね。

 行列式が1であるということは、変換に対してある保存量が存在するということです。このばあい具体的には次の量が保存されます。

  (x*x+v*v)/2.0 +x*v*dt/2.0

 エネルギーにおまけの項が付いたもの保存されるのです。このおまけの項はdtが十分小さければ小さな値にしかなりません。つまりエネルギーは数値積分で厳密には保存されないものの真のエネルギー値から上下に微小変動するだけで、大きくずれた値にはならないということです。これがSymplectic法です。その凄さのわりには簡単でしょう。
 バネ以外の系の計算も簡単です。加速度が関数a(x,v)でもとまるとしましょう。

  x2 =   1 * x1 + dt * v1 ;
  v2 =  dt * a(x2,v1) +  1 * v1 ;

これだけです。C言語でもっと使いやすく書くと

  x += dt * v ;
  v += dt * a(x,v) ;

めちゃ簡単ですね。

 さて、これは1次近似のSymplectic法でした。次に2次近似の方法を要点だけ紹介しましょう。

  x += dt*0.5 * v ;
  v += dt * a(x,v) ;
  x += dt*0.5 * v ;

これだけです。

 さらに4次近似を紹介しましょう。

  x += dt*c1 * v ;
  v += dt*d1 * a(x,v) ;
  x += dt*c2 * v ;
  v += dt*d2 * a(x,v) ;
  x += dt*c3 * v ;
  v += dt*d3 * a(x,v) ;
  x += dt*c4 * v ;

本当にこれだけです。ただし、係数は以下の通りです。

  d1 = d3 = 1.351207192 ( 1.0/(2-2^(1/3)) )
  d2 = -1.702414384 ( -2^(1/3)/(2-2^(1/3)) )
  d3 = d1
  c1 = c4 = d1/2.0
  c2 = c3 = (d1+d2)/2.0

 最後になんと6次近似も紹介してしまいましょう。
4次近似と方法は同じです。係数のみ紹介します。

  d1 = d7 =  0.784513610477560
  d2 = d6 =  0.235573213359357
  d3 = d5 = -1.177679984178870
  d4 =       1.315186320683910
  c1 = c8 = d1/2.0
  c2 = c7 = (d1+d2)/2.0
  c3 = c6 = (d2+d3)/2.0
  c4 = c5 = (d3+d4)/2.0

 騙されているように感じるかもしれませんが、これで本当にエネルギー保存のシミュレーションができてしまうのです。
 今回展示している力学シミュレーションにはこの6次のSymplectic法を使っています。エネルギーが小数点以下12桁までずっと変化しないのが観察できます。
 みなさんも是非、このシンプレクティック法を使っていろいろな力学シミュレーションをして遊んでみましょう。


平安京エイリアン

GANA

 オリジナルの「平安京エイリアン」は 1979 年に TSG が開発したものです。当時のアーケードゲーマーを魅了し、数々のパソコン用海賊版ソフトのもととなりました。「平安京にエイリアンゲーム」とか、「平城京エイリアン」とかね。ゲームボーイにも移植され、最近ではスーファミ版が 11 月末に発売予定だそうです。

#ニュータイプモードとか、VS モードとか、縦モードとかいうあやしいモードがついているみたいです(^^;

 ゲーム自体はとても単純で、落とし穴を掘り、ランダムに歩き回っているエイリアンがそこに落ちたら、すかさず埋めるというものです。たったそれだけなのに、「秋葉堀り」とか「隠居掘り」とか、色々なテクニックが研究されていた模様です。

 さて、僕が作ったのは X Window System 用のものです。一応、半年以上前に動くようになっていたのですが、今度はサーバーとクライアントに分離して、色々改良し作り直しました。

#これがちゃんと機能すれば全世界でハイスコア情報の共有も可能かも :-)

#今までできませんでした(^^;

 今は、ターゲットが UNIX 互換 OS + X Window System ですが、Win32 (Windows NT や Windows95 ね) に移植するという話しも ... 僕が作るわけではありませんが (ダレガツクルノカナ ^^;)。
他に、X Window System を使用しないクライアントを作るという (つまりキャラクタ端末でも動くのね) 構想もあったりしますが、実現するかどうかは定かではありません。

 この原稿を書いている時点では、まだ完成していません。もし完成しなかったら ... 半年前に作ったやつで、お茶を濁すとしましょう (^^; でわ〜


第壱話「使徒,襲来」

Makken

「物体を映像で確認!主モニターに回します」
「1年ぶりですね」
「………間違いない。使徒だ!!
 来たるべき時がついに来たのだ。人類にとって避けることのできない試練の時が………」

「シャープ軍のX68000隊も全滅したわ………。
 時代遅れのスプライトじゃ何枚表示できたってあいつにダメージを与えられない」
「あのう,いったい何なんですか,あれ?」
「あれはね………”使徒”よ」

「も………もう一匹ふえた?」
「違うわ,シンジ君! これは味方よ」
「ロボット?………なのか」

「一方的にやられてる!」
「(わかってたことだわ………今のTOWNSでは処理が重すぎる)」
「プログラム,動作速度・安定性とも低下! 残りヒープ領域,全メモリの5%!
 新規改造コードよりバグ発生! SNK作戦まであと180秒!」
「しかたがない,28800bpsで高速回収しろっ!!」

「まさか………従来ユーザを見捨てる気なの? シンジ君,伏せてっ!!」
(大爆発)
「わはははは。
 見たかね!! これが我々のNEOGEO−CDの威力だよ。
 これで君の新兵器の出番はもう2度とないというわけだ」
「電波障害のため,目標確認まで今しばらくお待ちください!」
「この大容量だ。ケリはついている!!」
「爆心地にエネルギー反応!!」
「なんだとっ!!」
「映像,回復しました! 目標は依然,健在ですっ!!」
「我々の切り札が………従来のROMユーザを犠牲にしたんだぞ」
「なんてやつだ!」
「化け物めっ!!」
「それで,100メガショックは使徒に効かなかったの?」
「ええ………一瞬売上げにダメージを与えただけ。目標は100万台を突破。依然進行中よ」
「やはり,ポリゴナイザを持ってるみたいね。おまけにジオメトリエンジンもちゃんとあって,CPUパワーに任せた直接処理だけではなく,強力なコプロセッサ群にバックアップされた次世代のゲームマシン,と各種ゲーム誌は分析してるわ」

「着いたわ。ここよ。暗いから気をつけて」
「こ,これは………さっき僕らを助けてくれたロボット!?」
「厳密に言うとロボットじゃないわ。我々が造りだした究極の駒祭用決戦兵器,

 ”関節エディタMarionette”!

 マルチメディアパソコン最後の切り札。これはその初号機よ………」
「これも,父の仕事ですか」
「そうだ」
「!?」
「久しぶりだな」
「父さん!?」
「出撃」
「な………」
「待ってください,司令!
 SkyDuelでさえ展示レベルに持っていくために丸一年かかったんですよ。
 今日出来たばかりのこのルーチンではとても無理です!」
「動いていればいい。それ以上は望まん」
「でもっ!」
「葛城一尉!今は観客動員が最優先事項よ。そのためには何であれ駒祭でわずかでも動作可能なプログラムを展示するしかないの!それともほかにいい方法があるとでもいうの?」
「………………」
「ぼ,僕が………駒祭に展示される………だって………?
 ジョーダンだろ?
 今からじゃ,間に合うワケないじゃないか!」
「速攻で展示できる形にしろ。おまえがいちばん適任だ。
 ………いや,ほかのプログラムでは無理なのだ」
「いやだっ。何て言われたって,いやだよ!!」
「………やむを得ん。冬月,去年展示したプログラムを起こしてくれ」
「使えるのかね?」
「死んでいるわけではあるまい。こっちへよこしてくれ」
「レイ………新作が間に合わなくなった。もういちどだ」
「はい」
「こんな………こんなバグだらけで不安定な作品がまた駒祭にさらされるだなんて。
 逃げちゃだめだ,逃げちゃだめだ,逃げちゃだめだっ………!
 ………僕が………やります………」

「解凍終了。ディレクトリ内のファイルはすべて更新終了。
 新作プログラム………ソースディレクトリに入りました!」
「了解! make開始!!」
「プラグマ固定終了。第1次パス開始。マクロ展開!」
「うわっ,なっ,なんなんだ,これ!?」
「心配しないで。プリプロセッサがマクロを取り込めば直接インライン展開してくれるわ」
「うぷっ,気持ち悪いソース………」
「我慢しなさいっ,男の子でしょ!」
「コンパイラ本体起動,全ソースファイルを伝達。コンパイルスタート!」
「字句解析異状なし。構文解析すべて問題なし。オブジェクトファイル生成します!」
「すごいわ………Warningもほとんど出ていない。いけるわ!」
「Marinette初号機,発進準備!!」
「テンポラリファイル削除」
「削除確認。アーカイブ更新」
「第一第二バックアップ生成」
「コンフィグファイル生成完了」
「外部データファイル異状なし」
「Marionette初号機,起動ディレクトリへ!」
「残りメモリ,全てフリー。起動準備完了!」
「了解。碇司令………かまいませんね?」
「もちろんだ。使徒を倒さぬ限りマルチメディアパソコンに未来はない」
「………起動!! いいわね,シンジ君!」
「あ………はいっ」
「最終安全装置,解除!! Marionette初号機,起動!!」
(死なないでね………シンジ君!)

(5分後)
「まさか………」
「………暴走!?」


「1ha」&「落ちモノ」

Nishi

超々爆速LZHアーカイバ“1ha”

                 
 これはLZHファイル(-lh5-方式)のエンコードに関する西澤の提案(1995年)に基づく斬新かつ大胆なアルゴリズムを採用した高速なLZHアーカイバです。(作者は世界最速と自負しております。(^^;)もちろんこれは-lh0-(無圧縮)のファイルを生成するという物ではありません。現在は-lh5-のエンコードしかサポートしていませんが、処理速度は吉崎栄泰氏のLHAおよびTEA氏のSFAを大幅に上回ります。是非、その速度を体験してみてください。
(注:上記の内容は事実ですが、これはジョークプログラムです。)

多人数対戦ゲーム「落ちモノ」

(思いっきり仮称、現在名前募集中)

「たった三日、たった三日でわしにどうしろというのだ。」

 急遽、作りはじめたWindows用ゲーム、多くの方に見ていただく物ですから、多人数プレイが出来たらいいな、と思った訳ですが、いいネタが見つからなかったので、多人数プレイを行ったときに、各プレイヤーのインスタンス間での通信量が少なくて済みそう、という理由によって、いわゆる「落ちモノ」になってしまいました。その上、開発環境としてVisualC++2.0を使いたいがためにWin32用にしてしまいました。(ちっ、Windows95の発売に少し遅れたか。(^^;)ただでさえWindows上では苦手なリアルタイムゲーム、マシンパワーとキーボード(!)が許す限りの多人数プレイが可能な物になるはずですが、果たして駒場祭までに完成させることが出来るのか?


編集後記


東京大学理論科学グループ部報 TSG 第 194 号
平成 7 年 11 月 24 日 初版 第 1 刷発行

発行者 渡辺 尚貴
編集者 安田 知弘
HTML化 木原 英夫

発行所 東京大学理論科学グループ
〒153 東京都目黒区駒場 3-8-1
東京大学教養学部内学生会館 305
TEL 03-5454-4343


(C)Theoretical Science Group,University of Tokyo,1995
Printed in Japan.

g541119@komaba.ecc.u-tokyo.ac.jp