jgbritt@dasys1.UUCP (James G Britt) (12/28/89)
..
.
:
:
:
I've been coding cellular automata in C, and have been wondering lately about
algorithms or coding tricks to improve processing time. Specifically, I wrote
a program to produce the cyclic space described in the August '89 Scientific
American "Computer Recreations" column. This CA follows the rule that for each
cell (value 0 to n), check all the cells in the Von Nuemann neighborhood. If
any of those cells have the value (n+1)mod(n+1), than the center cell takes that
value. It's like the game "Paper, Scissor, Stone". My first version used the
comparison statement
:
n=cell+1; /* My OR character doesn't port to ASCII */
if(north==n)OR(west==n)OR(east==n)OR(south==n)
cell++;
:
:
I decided, though, that this method was clumsy, so I mused a bit and decided on
represting cell values differently. The idea was to code up the numbers in such
a way that you could add the values together and extract what information you
wanted through some simple operation. First I tried using various primes, and
testing for there presence through % (the mod() function), but, lacking the
proper analytical tools, I got nowhere. I then used powers of 10 (cell = 10 to
the n ). This made it easy to see how many neighbooring cells had a given value,
but the execution of this process took twice as long as my original comparison
statement! I re-did it using powers of 2, extracting information via shifting
and masking. This reduced overall code length, but was still a fraction of a
second slower than what I started with.
Does anybody else have any experience or pointers regarding such things? I'm
getting acquainted with assembly, which will be a tremendous help locally, but
of course it won't travel so well.
James Britt, New York City
--
James G Britt
Big Electric Cat Public UNIX
..!cmcl2!{ccnysci,cucard,hombre}!dasys1!jgbritt