Floating Log 2006/7

2006-07-30

梅雨明け

ちょうど30℃ぐらいまでしか気温の上がらない、涼しい梅雨明け。 いきなり35℃ぐらいまで上がってくれないと夏が来た気がしない。

posted at 23:45:20
 
2006-07-29

仮想空間計画

ジェイムズ・P・ホーガン「仮想空間計画」創元SF文庫(1999)。 バーチャルリアリティが本当に現実そっくりだったら、というところから多分単純に思い付いた話だろうな。 ストーリーもほぼ順当に展開していく(順当でない部分を書いてしまうとネタばれなのでやめておく)。 こう書くと、予定調和のつまらない話のように聞こえるかもしれないが、そうではない。 結構楽しいSFだ。

posted at 22:11:28
 
2006-07-28

行列式のブルース

期末試験の問題に行列式を求める問題が出た時の話やけど、
とにかくガウスの消去法で計算してしまうのか、
0が多い行で展開して計算するのかは
自由だー!
行列式 is freedom
行列式 is freedom ...
でも、4次の行列式やからサラスの方法は使えへんで。

とかいうネタを試験監督をしながら考えていた。 もちろん元ネタは犬井ヒロシ(このへんが詳しい)。

posted at 02:50:56
 
2006-07-27

蚊取線香

ここ3年ぐらい蚊取線香に過敏である。 煙を直接吸うことがなくても、点けていた部屋の匂いを嗅ぐと気管支がざわつく。 今日は、油断していたら昨夜親が遠くの部屋で点けていたのに反応してしまい、声が嗄れるし息苦しい。

ところで蚊取線香といえば、ときどきニュースで蚊取線香が輸出されている、なんてのがあるとどうも気になる。 たとえばこんな記事。

夏の風物詩・蚊取り線香や蚊帳が、アジアやアフリカなどに活躍の場を広げている。 殺虫効果は高いが人体にやさしい点が、日本発の「蚊取りビジネス」の強みだ。 蚊に刺されると病気を招きかねない常夏の国で需要が拡大しており、現地に新工場を建設するなどメーカーは対応に追われている。

日本の蚊取り、世界へ 蚊には強く人に優しく (asahi.com)

「人体にやさしい」って、私には無茶苦茶厳しいのだけど。

posted at 02:42:24
 
2006-07-26

80000

80000ページビュー。 70000 が5月14日か。 更新のペースが鈍っても、もっぱら arctan とか テイラー展開 に検索で来る分で稼いでいるので、関係ないらしい。 嬉しいような悲しいような。

posted at 00:47:12
 
2006-07-22

真っ赤なウソ

養老孟司「真っ赤なウソ」柏木正博(2004)。 大正大学での講義を元にしているということで、仏教を意識した話が多い。 宗教は壮大な作り話でいいというのがタイトルの意味しているところだと理解した。 しかし、ハリー・ポッターとかに対抗するようなフィクションを今さら誰も宗教に求めないと思う。 というか、迎合的にフィクションを作って教義は保てるのだろうか。

posted at 23:34:40
 

枝刈り

Collatz 予想 の続き。 何とか効率を上げたいと思いはするのだが、そもそもこの問題は NP に属するのだろうか…?

閑話休題。 今日の主題は、いらない計算はしない、ということ。 前回の復習:

速さを上げるもっと簡単な手は、探索範囲を後半半分だけに削ることだ。その範囲の偶数が、前半部分の数の2倍になるので、正当化できる。

言い換えると、n = f(2n) だから g(2n) = g(n) + 1 という関係から、k = h(m) ならば k >= m/2。 今日はだいたいこんな議論。 以降、f の代わりに n←2n という記号を使う。

5←10←3
7←14←28←9

最初の奇数と最後の奇数を比べると、上の場合、最後の方が小さい。 g(3)=g(5)+2 かつ 3 < 5 というわけで、5 は h(5) にはならない。 より一般的に、次の変形列が考えられる。

6n+5←12n+10←4n+3
6n+1←12n+2←24n+4←8n+1

したがって、6n+5 は任意の n に対して h の計算に不必要。

ところで、間に挟まっている偶数はどうなっているかというと、

6n+4←2n+1
6n+2←12n+4←4n+1

なので、6n+4 は 2n+1 より、6n+2 は 4n+1 より大きくてかつステップ数は小さい。 したがって、不必要。

ここまでで、2,4,5 mod 6 の数は考える必要がないことが示された。 ただし、2 は例外(6n+2 が 2 のとき、4n+1 は 1 なので、上の議論が成り立たない)。

次に、2 の冪乗に進む数をみると、5→16, 21→64, 85→256,... などである。 この奇数の数列には規則性があって、一つ小さいものを4倍してそこに1加えた数になっている。

16← 5←10←20
16←32←64←21

同じ長さで、1小さい数(ここでは20)が存在しているので、大きい方は不必要。 この議論は一般化できて、奇数(2n+1)とその4倍+1の奇数(8n+5)との間には常に同様の関係がある。 したがって、8n+5 は不必要である。

ここまでは、わりと短い列だけで議論が終わったが、もっと削ろうとすると、だんだん長い列同士の比較が必要になってくる。 たとえば、24n を削るためには 24 と 17 が、10 で合流するまで追ってみる、さらに、12 と 11 が 10 で合流するところまでみれば 72n+12 が削れる。 そんな具合。

この辺りの削減を自動でできればいいんだけど、方法が思い付かない。

posted at 02:06:08
 
2006-07-20

Final Countdown

八王子某所で Europe の Final Countdown を久しぶりに耳にした。 思えばこの Final Countdown から洋楽を聞き始めたのだった。

posted at 23:58:08
 
2006-07-19

fluxbox と emacs

fluxbox のタブ機能で、C-x 5 で開いた emacs のウィンドウを重ねてみた。 するとなんと、するすると巻き上がって、表示が1行になってしまった。 唖然とした。

原因は emacs 側にあると思う。 色々なタイミングで(フォントを切り替えるとか?)ウィンドウサイズがちょこちょこ変わることがあるのと、根は一緒っぽい。 つまり、整数行ずつ表示していないといけないといった制約があって、お互いが自分のウィンドウをその制約に合わせようとした結果、ウィンドウAが半端な行を切り捨てる→ウィンドウBが半端な行を切り捨てる→...というループが発生した、と。

posted at 09:38:24
 

午前のゼミはキャンセルになったので、昼過ぎから。 書きかけの論文の英訳とかで過ごした。

整数論セミナー(今日で夏休み前最後)は、baby step giant step の解説。

posted at 00:51:28
 
2006-07-16

emerge-webrsync (再)

先週(emerge-webrsync)は

portage を 2.1 にしてからしばらく経っているのでそれが原因ではないと思うし、今のところ原因は不明。

などと書いたが、試しに 2.0.54-r2 に戻してみたら、あっさり更新できた。 ということは 2.1 の問題ということだ。 Bugzilla 行きか。

posted at 14:26:24
 
2006-07-15

寸止め

暑くなると、PC が「暑くて死にそうだ」と悲鳴を上げるので、 電源を落として学校へ。 私自身は暑くても平気、というかむしろ暑いのが好きなのだが、どうしても PC に向かって仕事をしないといけないので学校の PC を使うことに。

昼御飯を食べようと外に出る時、黒い雲が空を覆い、突風が吹き少し涼しい風も交じっていた。 まさしく、今にも大粒の雨が降り出さんばかりの空模様。 が、店に入って、外を眺めていても一向に降り出さない。 ときどき雷が鳴って、でもそれだけ。 30分もすると明るくなってきた。 くしゃみをしそうな人が、大きく息を吸い込んで、不意に普通に戻ったときのような肩透かし気分。

作業の方は、あと3日ぐらいで何とか。

posted at 22:32:48
 

Collatz 予想

発端は キミならどう書く 2.0 - ROUND 2 - にある、次の問題:

Collatz予想の収束までのステップ数の最大値を求めよ.
Collatz予想とは,1以上の自然数 n に対して,次の関数 f(n) が必ず1を返すものとする.

f(n) = 1 , n = 1 のとき
     = f(n/2) , n が偶数のとき
     = f(3*n + 1) , n が奇数のとき

たとえば,f(3)が 1 になるまでの経緯は,

f(3) -> f(10) -> f(5) -> f(16) -> f(8) -> f(4) -> f(2) -> f(1) -> 1

となり, f(n) の呼出は8回である.これをステップ数と呼ぶことにする. ここで f(n) が 1 になるまでのステップ数を g(n) とする.つまり,g(3) = 8 である. このとき

h(n) = k, 1 ≦ k ≦ n ∧ g(k) = max (g(1),g(2),…,g(n))

について h(100) を求めよ.

また,余力のある者は大きな n についても h(n) を求めよ.

とりあえず、問題文にあるように忠実に次のように書いてみた。 ただし、f に当たる collatz 関数は1ステップだけ計算を進める。

def collatz(n):
    if n == 1:
        return 1
    elif n & 1:
        return 3*n + 1
    else:
        return n // 2
def collatz_length(n):
    length = 0
    while n > 1:
        n = collatz(n)
        length += 1
    return length
def collatz_longest(n):
    k, length = 1, 0
    for i in range(2, n+1):
        length_i = collatz_length(i)
        if length_i > length:
            k, length = i, length_i
    return k
if __name__ == '__main__':
    import sys
    print collatz_longest(int(sys.argv[1]))

実際に走らせれば、

% python collatz.py 100
97

問題から、ステップ数も数えなければならないので f を問題文にあるまま実装する訳にはいかないが、 ステップを数える部分を合わせて再帰的に書き換えてみた。 奇数についての計算は姑息に1ステップ削っている。 呼出側の変更もあるが自明なので、collatz_length の変更のみ:

def collatz_length(n, count):
    if n == 1:
        return count
    elif n & 1:
        return collatz_length((3*n + 1)//2, count + 2)
    else:
        return collatz_length(n//2, count + 1)

こちらの方が若干速くもなった。

速さを上げるもっと簡単な手は、探索範囲を後半半分だけに削ることだ。 その範囲の偶数が、前半部分の数の2倍になるので、正当化できる。

全く別方向から、つまり 1 から逆算して木を作る、という方向も考えたが、効率が悪いので却下。 うまく要らない枝が見分けられればいいのだが…。

あとはキャッシュする、という方向で考えた。 再帰の途中でキャッシュは面倒そうなので、元のコードからの派生。

def _collatz_branch_sequence(n, trunk):
    seq = []
    while n not in trunk:
        seq.append(n)
        n = collatz(n)
    seq.append(n)
    return seq
def collatz_length(n, _memo={1:0}):
    branch = _collatz_branch_sequence(n, _memo)
    level = len(branch) - 1 + _memo[branch[-1]]
    for i, node in enumerate(branch):
        if node % 6 == 4:
            _memo[node] = level - i
    return level

デフォルト引数に辞書を使ってそれを更新することで、キャッシュを実現。 素直に外からキャッシュを渡してもいいんだけど、API 的にはキャッシュのあるなしは本質ではないかな、とか余計なことを考えてこういう実装。 いまのところ、これが自分の書いた中では最速だけど、大きい n を最初に渡すとメモリーを食ってしまうのが問題点。 6 で割って 4 余りのノードで木が分岐するので、そこだけキャッシュするようにはしているが、まだ無駄がある。 不必要になったキャッシュを削ることができればもう少しましなのだが、よい方法が浮かばない。

posted at 01:12:48
 
2006-07-12

Fluxbox 1.0_rc1

x11-wm/fluxbox を 1.0_rc1 に入れ替えた。 1.0 rc2 が出ているようだが、gentoo のパッケージとしてはまだのはず。

今までの 0.9.x との一番目に付く相違は、タブだ。 複数のアプリケーションを一つにまとめる機能で、これによって仮想画面の切り替えを減らせる、という謳い文句。 少し触ってみた感じでは、アプリケーションごとに使い易いウィンドウサイズが違うところをまとめる際に一つに合わせてしまうので、微妙に使い心地が悪い(その内慣れてしまうかもしれないが)。

posted at 23:53:52
 
2006-07-10

それでも MVP

W杯決勝はイタリアが勝った。 延長の末に PK ではあったが。

で、ジダンだ。 延長後半に(おそらく酷いことを言われて)頭突きして一発退場のジダンが、MVP になったと聞いて耳を疑った。 引退するから、プレーはどうでもいいのか?

posted at 22:30:40
 
2006-07-09

ふつうの Haskell プログラミング

青木峰郎「ふつうの Haskell プログラミング」ソフトバンククリエイティブ(2006)。 モナドという用語が圏論からきていることを初めて知った。 ライプニッツの哲学用語だと思っていて不思議ではあったのだが。 数学をやっている人間として不勉強を感じてしまう。

posted at 23:58:08
 
2006-07-07

emerge-webrsync

ここのところ、学校においてあるノートで emerge-webrsync が失敗している。 どこかで、

creating dir 'games-board/crafty/files'
removing node 'games-board/crafty/' crafty-20.1.ebuild'
removing node 'games-board/crafty/' crafty-20.11.ebuild'
removing node 'games-board/crafty/' crafty-20.13.ebuild'
removing node 'games-board/crafty/' files'
removing node 'games-board/crafty/' metadata.xml'
2 malloc failure on games-board/crafty/files/digest-crafty-20.11 games-board/crafty/files/, /usr/portage
failed enforcing file layout, bailing
tarsync failed; tarball is corrupt?

のように終了してしまう。 この場合、games-board/crafty から ebuild ファイルは消えて ChangeLog と Manifest だけが残った状態になる。 懲りずにもう一度 emerge-webrsync をすると、ここは通り過ぎるがまた別のところで 2 malloc failure on ... と止まる。 games-board/crafty の ebuild は戻らない。

portage を 2.1 にしてからしばらく経っているのでそれが原因ではないと思うし、今のところ原因は不明。

posted at 21:26:40
 

川の名前

川端裕人「川の名前」早川書房(2004)。 この前の ペンギン、日本人と出会う の著者の小説。 読み始めるまでペンギンが出てくるとは思っていなかったので、またペンギンかよとげんなりしたので減点1。 小学生の男の子たちが主人公なのは我慢するとして、ストーリー展開に意外性がなく最後の方は飽きてしまったのでもう1点減点。 総合評価「努力しましょう」

posted at 01:25:36
 
2006-07-04

スポーツ

今日はとりあえずツールドフランスの中継を見る。 ドーピングの調査に関係して昨年の総合上位はほとんどいない。 ヴィノクロフはチームメンバーが足りなくなって出られないとか。 むしろ混戦になって面白いかも、と前向きに考えることにしよう。 有料チャンネルでの放送が多いので、ウェブ で流れを知るだけの日も多くなる。

ここしばらく、テレビはスポーツ中継ばかりだ。 昨日はF1だったし、今日はツールに、W杯は中休みだが中田英寿が引退というニュースがあった。 これを書いている後ろでは杉山がウィンブルドンで戦っている。

posted at 01:10:40
7月 2006
       1
2 3 4 5 6 7 8
9101112131415
16171819202122
23242526272829
3031     
6月
2006
 8月
2006

浮遊する思考・浮遊する言葉を拾い集めて記録しておくページ。

Python
Desktop
Server

© 2006-2013, Matsui Fe2+ Tetsushi