2010年5月9日日曜日

Life Game

前回の算法はセル1個ごとに次ステップの値を計算するものであった.

通常の計算機は, 1ビットCPUのconnection machineと違って, 語の処理が出来るから, セルの1行について計算したいとだれでも思うであろう.

前回の演習問題の後半はその行ごと処理である.

ある行xと上の行x-と下の行x+からその行の次のステップの値が計算したい. 出来そうでもあり, 無理そうでもある. アルゴリズムは次の通り.

a←x-&x+ (=z3), b←x-⊕x+ (=z4), c←x⊕b, d←c»1 (=z6),
c←c«1 (=z2), e←c⊕d, c←c&d, f←b&e, f←f | c (=z7), e←b⊕e (=z8), c←x&b, c←c | a, b←c«1 (=z5), c←c»1 (=z1), d←b&c, c←b | c,
b←a&f, f←a | f, f←d | f, c←b | c,
f←f⊕c (=S1(z1,z3,z5,z7)), e←e | x, f←f&e.
これをグライダーでやってみよう.


図のように, このグライダーは右下へ進む.
  001000 x-
  000100 x
  011100 x+
  000000
xの行の計算は次のように進む.
a 001000 x-&x+ (=z3)
b 010100 x-⊕x+ (=z4)
c 010000 x⊕b (=xnw⊕xw⊕xsw)
d 001000 c»1 (=z6)
c 100000 c«1 (=z2)
e 101000 c⊕d (=z2⊕z6)
c 000000 c&d (=z2&z6)
f 000000 b&e (=z4&(z2⊕z6))
f 000000 f | c ((z4&(z2⊕z6))∨(z2&z6)=z7)
e 111100 b⊕e (=z4⊕z2⊕z6=z8)
c 000100 x&b (=x&(x-⊕x+))
c 001100 c | a (=(x&(x-⊕x+))∨(x-&x+))
b 011000 c«1 (=z5)
c 000110 c»1 (=z1)
d 000000 b&c (S1の計算開始 b=z5 c=z1 a=z3 f=z7)
c 011110 b | c
b 000000 a&f
f 001000 a | f
f 001000 d | f
c 011110 b | c
f 010110 f⊕c (=S1(z1,z3,z5,z7)
e 111100 e | x (= x∨ z8)
f 010100 f&e

1ステップ後の配列は以下の通り.
  000000
  010100
  001100
  001000

MIT Schemeのfixnum演算を使った実装は以下の通り.

(define (b x- x x+)
(let* ((a) (b) (c) (d) (e) (f))
(set! a (fix:and x- x+)) (set! b (fix:xor x- x+))
(set! c (fix:xor x b)) (set! d (fix:lsh c -1))
(set! c (fix:lsh c 1)) (set! e (fix:xor c d))
(set! c (fix:and c d)) (set! f (fix:and b e))
(set! f (fix:or f c)) (set! e (fix:xor b e))
(set! c (fix:and x b)) (set! c (fix:or c a))
(set! b (fix:lsh c 1)) (set! c (fix:lsh c -1))
(set! d (fix:and b c)) (set! c (fix:or b c))
(set! b (fix:and a f)) (set! f (fix:or a f))
(set! f (fix:or d f)) (set! c (fix:or b c))
(set! f (fix:xor f c)) (set! e (fix:or e x))
(set! f (fix:and f e)) f))

0 件のコメント: