import numpy as np MAX_DEPTH = 61 level = np.array([1], dtype=np.uint64) for depth in range(MAX_DEPTH + 1): mod3 = level % 3 mod6 = level % 6 branch = mod6 == 4 branch_values = level[branch] mod18 = branch_values % 18 if depth == MAX_DEPTH: print({ "depth": depth, "nodes": int(level.size), "fertile": int(np.count_nonzero(mod3)), "sterile": int(level.size - np.count_nonzero(mod3)), "branch": int(branch_values.size), "branch_4": int(np.count_nonzero(mod18 == 4)), "branch_10": int(np.count_nonzero(mod18 == 10)), "branch_16": int(np.count_nonzero(mod18 == 16)), }) break doubled = level * 2 # Every branch has an odd predecessor except 4, # whose predecessor 1 would recreate the root cycle. valid_branch = branch & (level != 4) odd_children = ((level[valid_branch] - 1) // 3).astype(np.uint64) level = np.concatenate((doubled, odd_children))