The Collatz Conjecture

The Collatz conjecture states that by iteratively applying a particular rule to successive numbers, beginning from any number, the result will eventually be 1.

Below is an example of a rule that demonstrates the Collatz conjecture, and also demonstrates the use of a callable for the timesteps argument of the evolve() function, since, in principle, it isn’t known how many iterations are required before the system evolves to a state consisting of the value 1.

import cellpylib as cpl
import numpy as np

initial = np.array([[17]], dtype=np.int)

def activity_rule(n, c, t):
    n = n[1]
    if n % 2 == 0:
        # number is even
        return n / 2
    else:
        return 3*n + 1

cellular_automaton = cpl.evolve(initial, apply_rule=activity_rule,
                                timesteps=lambda ca, t: True if ca[-1][0] != 1 else False)

print([i[0] for i in cellular_automaton])

The program above should print:

[17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

References:

https://en.wikipedia.org/wiki/Collatz_conjecture