Skip to content

Instantly share code, notes, and snippets.

@jakelevi1996
Last active July 31, 2023 22:35
Show Gist options
  • Save jakelevi1996/db0e307905aa5aab86f793227d2be597 to your computer and use it in GitHub Desktop.
Save jakelevi1996/db0e307905aa5aab86f793227d2be597 to your computer and use it in GitHub Desktop.
Make tables and trees for recursive functions defined in Chapter 5 of GEB
from jutility import util
import tree
def diagram_fm(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("f_n", width=10, title="F(n)"),
util.Column("m_n", width=10, title="M(n)"),
util.Column("m_f_n", width=10, title="M(F(n))"),
util.Column("f_m_n", width=10, title="F(M(n))"),
printer=printer,
)
f = {0: 1}
m = {0: 0}
table.update(n=0, f_n=f[0], m_n=m[0])
for n in range(1, n_max + 1):
m[n] = n - f[m[n - 1]]
f[n] = n - m[f[n - 1]]
table.update(n=n, f_n=f[n], m_n=m[n], m_f_n=m[f[n]], f_m_n=f[m[n]])
return table
if __name__ == "__main__":
printer = util.Printer("diagram_fm.txt", ".")
table = diagram_fm(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("m_n"))
tree.print_tree_dict(tree_dict, 1, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("f_n"))
tree.print_tree_dict(tree_dict, 2, printer)
n | F(n) | M(n) | M(F(n)) | F(M(n))
---------- | ---------- | ---------- | ---------- | ----------
0 | 1 | 0 | |
1 | 1 | 0 | 0 | 1
2 | 2 | 1 | 1 | 1
3 | 2 | 2 | 1 | 2
4 | 3 | 2 | 2 | 2
5 | 3 | 3 | 2 | 2
6 | 4 | 4 | 2 | 3
7 | 5 | 4 | 3 | 3
8 | 5 | 5 | 3 | 3
9 | 6 | 6 | 4 | 4
10 | 6 | 6 | 4 | 4
11 | 7 | 7 | 4 | 5
12 | 8 | 7 | 5 | 5
13 | 8 | 8 | 5 | 5
14 | 9 | 9 | 6 | 6
15 | 9 | 9 | 6 | 6
16 | 10 | 10 | 6 | 6
17 | 11 | 11 | 7 | 7
18 | 11 | 11 | 7 | 7
19 | 12 | 12 | 7 | 8
20 | 13 | 12 | 8 | 8
21 | 13 | 13 | 8 | 8
22 | 14 | 14 | 9 | 9
23 | 14 | 14 | 9 | 9
24 | 15 | 15 | 9 | 9
25 | 16 | 16 | 10 | 10
26 | 16 | 16 | 10 | 10
27 | 17 | 17 | 11 | 11
28 | 17 | 17 | 11 | 11
29 | 18 | 18 | 11 | 11
30 | 19 | 19 | 12 | 12
31 | 19 | 19 | 12 | 12
32 | 20 | 20 | 12 | 13
33 | 21 | 20 | 13 | 13
34 | 21 | 21 | 13 | 13
35 | 22 | 22 | 14 | 14
36 | 22 | 22 | 14 | 14
37 | 23 | 23 | 14 | 14
38 | 24 | 24 | 15 | 15
39 | 24 | 24 | 15 | 15
40 | 25 | 25 | 16 | 16
41 | 25 | 25 | 16 | 16
42 | 26 | 26 | 16 | 16
43 | 27 | 27 | 17 | 17
44 | 27 | 27 | 17 | 17
45 | 28 | 28 | 17 | 17
46 | 29 | 29 | 18 | 18
47 | 29 | 29 | 18 | 18
48 | 30 | 30 | 19 | 19
49 | 30 | 30 | 19 | 19
50 | 31 | 31 | 19 | 19
51 | 32 | 32 | 20 | 20
52 | 32 | 32 | 20 | 20
53 | 33 | 33 | 20 | 21
54 | 34 | 33 | 21 | 21
55 | 34 | 34 | 21 | 21
56 | 35 | 35 | 22 | 22
57 | 35 | 35 | 22 | 22
58 | 36 | 36 | 22 | 22
59 | 37 | 37 | 23 | 23
60 | 37 | 37 | 23 | 23
61 | 38 | 38 | 24 | 24
62 | 38 | 38 | 24 | 24
63 | 39 | 39 | 24 | 24
64 | 40 | 40 | 25 | 25
65 | 40 | 40 | 25 | 25
66 | 41 | 41 | 25 | 25
67 | 42 | 42 | 26 | 26
68 | 42 | 42 | 26 | 26
69 | 43 | 43 | 27 | 27
70 | 43 | 43 | 27 | 27
71 | 44 | 44 | 27 | 27
72 | 45 | 45 | 28 | 28
73 | 45 | 45 | 28 | 28
74 | 46 | 46 | 29 | 29
75 | 46 | 46 | 29 | 29
76 | 47 | 47 | 29 | 29
77 | 48 | 48 | 30 | 30
78 | 48 | 48 | 30 | 30
79 | 49 | 49 | 30 | 30
80 | 50 | 50 | 31 | 31
81 | 50 | 50 | 31 | 31
82 | 51 | 51 | 32 | 32
83 | 51 | 51 | 32 | 32
84 | 52 | 52 | 32 | 32
85 | 53 | 53 | 33 | 33
86 | 53 | 53 | 33 | 33
87 | 54 | 54 | 33 | 34
88 | 55 | 54 | 34 | 34
89 | 55 | 55 | 34 | 34
90 | 56 | 56 | 35 | 35
91 | 56 | 56 | 35 | 35
92 | 57 | 57 | 35 | 35
93 | 58 | 58 | 36 | 36
94 | 58 | 58 | 36 | 36
95 | 59 | 59 | 37 | 37
96 | 59 | 59 | 37 | 37
97 | 60 | 60 | 37 | 37
98 | 61 | 61 | 38 | 38
99 | 61 | 61 | 38 | 38
100 | 62 | 62 | 38 | 38
89 90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | | |
| ------ | ------ ------ | ------ |
| | | | | | | |
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| --------- | --------- --------- | ------ | ------ ------ | ------ ------ | ------ | ------ ------ | ------ ------
| | | | | | | | | | | | | | | | | | | | |
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| | | | | | | | | | | | | | | | | | | | |
| ------------ | ---------- --------- | --------- | --------- --------- | --------- -----------
| | | | | | | | | | | | |
21 22 23 24 25 26 27 28 29 30 31 32 33
| | | | | | | | | | | | |
| --------------------- | ------------ ------------ | ------------ -----------------
| | | | | | | |
13 14 15 16 17 18 19 20
| | | | | | | |
| ------------------------------ | --------------------- -----------------------------
| | | | |
8 9 10 11 12
| | | | |
| ------------------------------------- ---------------------------------------------
| | |
5 6 7
| | |
| ----------------------------------------------------------------------------
| |
3 4
| |
------------------------------------------------------------------------------------------------
|
2
|
|
|
1
|
90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | |
------ | ------ ------ | ------ |
| | | | | | |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
--------- | --------- --------- | ------ | ------ ------ | ------ ------ | ------ | ------ ------ | ------ | ------
| | | | | | | | | | | | | | | | | | | | |
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| | | | | | | | | | | | | | | | | | | | |
------------ | ---------- --------- | --------- | --------- --------- | --------- | --------
| | | | | | | | | | | | |
22 23 24 25 26 27 28 29 30 31 32 33 34
| | | | | | | | | | | | |
--------------------- | ------------ ------------ | ------------ | ------------
| | | | | | | |
14 15 16 17 18 19 20 21
| | | | | | | |
------------------------------ | --------------------- | -----------------
| | | | |
9 10 11 12 13
| | | | |
------------------------------------- | -----------------------------
| | |
6 7 8
| | |
| ---------------------------------------------
| |
4 5
| |
----------------------------------------------------------------------------
|
3
|
|
|
2
|
from jutility import util
import tree
def diagram_g(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("t_n", width=10, title="Type(n)"),
util.Column("g_n", width=10, title="G(n)"),
util.Column("t_g_n", width=10, title="Type(G(n))"),
util.Column("g_g_n", width=10, title="G(G(n))"),
util.Column("t_g_g_n", width=10, title="Type(G(G(n)))"),
printer=printer,
)
g = {0: 0}
t = {0: "?", 1: "L"}
table.update(n=0, g_n=g[0], g_g_n=g[g[0]])
for n in range(1, n_max + 1):
g[n] = n - g[g[n - 1]]
if t[n - 1] == "L":
t[n] = "R"
elif t[g[n]] == "R":
t[n] = "M"
else:
t[n] = "L"
assert g[n] - g[n - 1] == (0 if (t[n - 1] == "L") else 1)
assert g[g[n]] - g[g[n - 1]] == (1 if (t[n] == "L") else 0)
table.update(
n=n,
t_n=t[n],
g_n=g[n],
t_g_n=t[g[n]],
g_g_n=g[g[n]],
t_g_g_n=t[g[g[n]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_g.txt", ".")
table = diagram_g(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("g_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | Type(n) | G(n) | Type(G(n)) | G(G(n)) | Type(G(G(n)))
---------- | ---------- | ---------- | ---------- | ---------- | -------------
0 | | 0 | | 0 |
1 | L | 1 | L | 1 | L
2 | R | 1 | L | 1 | L
3 | M | 2 | R | 1 | L
4 | L | 3 | M | 2 | R
5 | R | 3 | M | 2 | R
6 | L | 4 | L | 3 | M
7 | R | 4 | L | 3 | M
8 | M | 5 | R | 3 | M
9 | L | 6 | L | 4 | L
10 | R | 6 | L | 4 | L
11 | M | 7 | R | 4 | L
12 | L | 8 | M | 5 | R
13 | R | 8 | M | 5 | R
14 | L | 9 | L | 6 | L
15 | R | 9 | L | 6 | L
16 | M | 10 | R | 6 | L
17 | L | 11 | M | 7 | R
18 | R | 11 | M | 7 | R
19 | L | 12 | L | 8 | M
20 | R | 12 | L | 8 | M
21 | M | 13 | R | 8 | M
22 | L | 14 | L | 9 | L
23 | R | 14 | L | 9 | L
24 | M | 15 | R | 9 | L
25 | L | 16 | M | 10 | R
26 | R | 16 | M | 10 | R
27 | L | 17 | L | 11 | M
28 | R | 17 | L | 11 | M
29 | M | 18 | R | 11 | M
30 | L | 19 | L | 12 | L
31 | R | 19 | L | 12 | L
32 | M | 20 | R | 12 | L
33 | L | 21 | M | 13 | R
34 | R | 21 | M | 13 | R
35 | L | 22 | L | 14 | L
36 | R | 22 | L | 14 | L
37 | M | 23 | R | 14 | L
38 | L | 24 | M | 15 | R
39 | R | 24 | M | 15 | R
40 | L | 25 | L | 16 | M
41 | R | 25 | L | 16 | M
42 | M | 26 | R | 16 | M
43 | L | 27 | L | 17 | L
44 | R | 27 | L | 17 | L
45 | M | 28 | R | 17 | L
46 | L | 29 | M | 18 | R
47 | R | 29 | M | 18 | R
48 | L | 30 | L | 19 | L
49 | R | 30 | L | 19 | L
50 | M | 31 | R | 19 | L
51 | L | 32 | M | 20 | R
52 | R | 32 | M | 20 | R
53 | L | 33 | L | 21 | M
54 | R | 33 | L | 21 | M
55 | M | 34 | R | 21 | M
56 | L | 35 | L | 22 | L
57 | R | 35 | L | 22 | L
58 | M | 36 | R | 22 | L
59 | L | 37 | M | 23 | R
60 | R | 37 | M | 23 | R
61 | L | 38 | L | 24 | M
62 | R | 38 | L | 24 | M
63 | M | 39 | R | 24 | M
64 | L | 40 | L | 25 | L
65 | R | 40 | L | 25 | L
66 | M | 41 | R | 25 | L
67 | L | 42 | M | 26 | R
68 | R | 42 | M | 26 | R
69 | L | 43 | L | 27 | L
70 | R | 43 | L | 27 | L
71 | M | 44 | R | 27 | L
72 | L | 45 | M | 28 | R
73 | R | 45 | M | 28 | R
74 | L | 46 | L | 29 | M
75 | R | 46 | L | 29 | M
76 | M | 47 | R | 29 | M
77 | L | 48 | L | 30 | L
78 | R | 48 | L | 30 | L
79 | M | 49 | R | 30 | L
80 | L | 50 | M | 31 | R
81 | R | 50 | M | 31 | R
82 | L | 51 | L | 32 | M
83 | R | 51 | L | 32 | M
84 | M | 52 | R | 32 | M
85 | L | 53 | L | 33 | L
86 | R | 53 | L | 33 | L
87 | M | 54 | R | 33 | L
88 | L | 55 | M | 34 | R
89 | R | 55 | M | 34 | R
90 | L | 56 | L | 35 | L
91 | R | 56 | L | 35 | L
92 | M | 57 | R | 35 | L
93 | L | 58 | M | 36 | R
94 | R | 58 | M | 36 | R
95 | L | 59 | L | 37 | M
96 | R | 59 | L | 37 | M
97 | M | 60 | R | 37 | M
98 | L | 61 | L | 38 | L
99 | R | 61 | L | 38 | L
100 | M | 62 | R | 38 | L
90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | |
------ | ------ ------ | ------ |
| | | | | | |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
--------- | --------- --------- | ------ | ------ ------ | ------ ------ | ------ | ------ ------ | ------ | ------
| | | | | | | | | | | | | | | | | | | | |
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| | | | | | | | | | | | | | | | | | | | |
------------ | ---------- --------- | --------- | --------- --------- | --------- --------- |
| | | | | | | | | | | | |
22 23 24 25 26 27 28 29 30 31 32 33 34
| | | | | | | | | | | | |
--------------------- | ------------ ------------ | ------------ | ------------
| | | | | | | |
14 15 16 17 18 19 20 21
| | | | | | | |
------------------------------ | --------------------- --------------------- |
| | | | |
9 10 11 12 13
| | | | |
------------------------------------- | -------------------------------
| | |
6 7 8
| | |
------------------------------------------------------ |
| |
4 5
| |
-----------------------------------------------------------------------------------
|
3
|
|
|
2
|
|
|
1
|
from jutility import util
import tree
def diagram_g_flipped(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("t_n", width=10, title="Type(n)"),
util.Column("g_n", width=10, title="G(n)"),
util.Column("t_g_n", width=10, title="Type(G(n))"),
util.Column("g_g_n", width=10, title="G(G(n))"),
util.Column("t_g_g_n", width=10, title="Type(G(G(n)))"),
printer=printer,
)
g = {0: 0, 1: 1, 2: 1, 3: 2}
t = {2: "?", 3: "M"}
for n in range(4):
table.update(n=n, g_n=g[n], g_g_n=g[g[n]])
for n in range(4, n_max + 1):
g[n] = n + 1 - g[g[n - 1] + 1]
if t[n - 1] == "L":
t[n] = "R"
elif t[g[n]] == "L":
t[n] = "M"
else:
t[n] = "L"
if n > 4:
assert g[n] - g[n - 1] == (0 if (t[n - 1] == "L") else 1)
assert g[g[n]] - g[g[n - 1]] == (1 if (t[n - 1] == "R") else 0)
assert g[g[n]] - g[g[n - 1]] == (1 if (t[n - 2] == "L") else 0)
assert g[g[n]] - g[g[n - 1]] == 1 - (g[n - 1] - g[n - 2])
assert g[g[n]] + g[n - 1] - n == g[g[n - 1]] + g[n - 2] - (n - 1)
assert g[n - 1] == n - g[g[n]]
assert g[g[n]] == g[g[n - 2] + 1]
assert g[n] == n + 1 - g[g[n - 1] + 1]
table.update(
n=n,
t_n=t[n],
g_n=g[n],
t_g_n=t[g[n]],
g_g_n=g[g[n]],
t_g_g_n=t[g[g[n]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_g_flipped.txt", ".")
table = diagram_g_flipped(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("g_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | Type(n) | G(n) | Type(G(n)) | G(G(n)) | Type(G(G(n)))
---------- | ---------- | ---------- | ---------- | ---------- | -------------
0 | | 0 | | 0 |
1 | | 1 | | 1 |
2 | | 1 | | 1 |
3 | | 2 | | 1 |
4 | L | 3 | M | 2 | ?
5 | R | 3 | M | 2 | ?
6 | M | 4 | L | 3 | M
7 | L | 5 | R | 3 | M
8 | R | 5 | R | 3 | M
9 | L | 6 | M | 4 | L
10 | R | 6 | M | 4 | L
11 | M | 7 | L | 5 | R
12 | L | 8 | R | 5 | R
13 | R | 8 | R | 5 | R
14 | M | 9 | L | 6 | M
15 | L | 10 | R | 6 | M
16 | R | 10 | R | 6 | M
17 | L | 11 | M | 7 | L
18 | R | 11 | M | 7 | L
19 | M | 12 | L | 8 | R
20 | L | 13 | R | 8 | R
21 | R | 13 | R | 8 | R
22 | L | 14 | M | 9 | L
23 | R | 14 | M | 9 | L
24 | M | 15 | L | 10 | R
25 | L | 16 | R | 10 | R
26 | R | 16 | R | 10 | R
27 | M | 17 | L | 11 | M
28 | L | 18 | R | 11 | M
29 | R | 18 | R | 11 | M
30 | L | 19 | M | 12 | L
31 | R | 19 | M | 12 | L
32 | M | 20 | L | 13 | R
33 | L | 21 | R | 13 | R
34 | R | 21 | R | 13 | R
35 | M | 22 | L | 14 | M
36 | L | 23 | R | 14 | M
37 | R | 23 | R | 14 | M
38 | L | 24 | M | 15 | L
39 | R | 24 | M | 15 | L
40 | M | 25 | L | 16 | R
41 | L | 26 | R | 16 | R
42 | R | 26 | R | 16 | R
43 | L | 27 | M | 17 | L
44 | R | 27 | M | 17 | L
45 | M | 28 | L | 18 | R
46 | L | 29 | R | 18 | R
47 | R | 29 | R | 18 | R
48 | M | 30 | L | 19 | M
49 | L | 31 | R | 19 | M
50 | R | 31 | R | 19 | M
51 | L | 32 | M | 20 | L
52 | R | 32 | M | 20 | L
53 | M | 33 | L | 21 | R
54 | L | 34 | R | 21 | R
55 | R | 34 | R | 21 | R
56 | L | 35 | M | 22 | L
57 | R | 35 | M | 22 | L
58 | M | 36 | L | 23 | R
59 | L | 37 | R | 23 | R
60 | R | 37 | R | 23 | R
61 | M | 38 | L | 24 | M
62 | L | 39 | R | 24 | M
63 | R | 39 | R | 24 | M
64 | L | 40 | M | 25 | L
65 | R | 40 | M | 25 | L
66 | M | 41 | L | 26 | R
67 | L | 42 | R | 26 | R
68 | R | 42 | R | 26 | R
69 | M | 43 | L | 27 | M
70 | L | 44 | R | 27 | M
71 | R | 44 | R | 27 | M
72 | L | 45 | M | 28 | L
73 | R | 45 | M | 28 | L
74 | M | 46 | L | 29 | R
75 | L | 47 | R | 29 | R
76 | R | 47 | R | 29 | R
77 | L | 48 | M | 30 | L
78 | R | 48 | M | 30 | L
79 | M | 49 | L | 31 | R
80 | L | 50 | R | 31 | R
81 | R | 50 | R | 31 | R
82 | M | 51 | L | 32 | M
83 | L | 52 | R | 32 | M
84 | R | 52 | R | 32 | M
85 | L | 53 | M | 33 | L
86 | R | 53 | M | 33 | L
87 | M | 54 | L | 34 | R
88 | L | 55 | R | 34 | R
89 | R | 55 | R | 34 | R
90 | M | 56 | L | 35 | M
91 | L | 57 | R | 35 | M
92 | R | 57 | R | 35 | M
93 | L | 58 | M | 36 | L
94 | R | 58 | M | 36 | L
95 | M | 59 | L | 37 | R
96 | L | 60 | R | 37 | R
97 | R | 60 | R | 37 | R
98 | L | 61 | M | 38 | L
99 | R | 61 | M | 38 | L
100 | M | 62 | L | 39 | R
90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | |
| ------ ------ | ------ ------ |
| | | | | | |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
-------- | -------- | ------ ------ | ------ | ------ ------ | ------ ------ | ------ | ------ ------ | ------
| | | | | | | | | | | | | | | | | | | | |
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| | | | | | | | | | | | | | | | | | | | |
| ------------ ----------- | -------- -------- | -------- | -------- -------- | --------
| | | | | | | | | | | | |
22 23 24 25 26 27 28 29 30 31 32 33 34
| | | | | | | | | | | | |
-------------------- | ------------ | ------------ ------------ | ------------
| | | | | | | |
14 15 16 17 18 19 20 21
| | | | | | | |
| --------------------- -------------------- | --------------------
| | | | |
9 10 11 12 13
| | | | |
---------------------------------------------- | -------------------------------
| | |
6 7 8
| | |
| ---------------------------------------------------
| |
4 5
| |
-----------------------------------------------------------------------------------------
|
3
|
|
|
2
|
|
|
1
|
from jutility import util
import tree
def diagram_h(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("t_n", width=10, title="Type(n)"),
util.Column("h_n", width=10, title="H(n)"),
util.Column("t_h_n", width=10, title="Type(H(n))"),
util.Column("h_h_n", width=10, title="H(H(n))"),
util.Column("t_h_h_n", width=10, title="Type(H(H(n)))"),
util.Column("h_h_h_n", width=10, title="H(H(H(n)))"),
util.Column("t_h_h_h_n", width=10, title="Type(H(H(H(n))))"),
printer=printer,
)
h = {0: 0}
t = {0: "?", 1: "L"}
table.update(n=0, h_n=h[0], h_h_n=h[h[0]], h_h_h_n=h[h[h[0]]])
for n in range(1, n_max + 1):
h[n] = n - h[h[h[n - 1]]]
if t[n - 1] == "L":
t[n] = "R"
elif t[h[n]] == "R":
t[n] = "M"
elif t[h[n]] == "M":
t[n] = "N"
else:
t[n] = "L"
assert h[n] - h[n - 1] == (0 if (t[n - 1] == "L") else 1)
assert h[h[h[n]]] - h[h[h[n - 1]]] == (1 if (t[n] == "L") else 0)
table.update(
n=n,
t_n=t[n],
h_n=h[n],
t_h_n=t[h[n]],
h_h_n=h[h[n]],
t_h_h_n=t[h[h[n]]],
h_h_h_n=h[h[h[n]]],
t_h_h_h_n=t[h[h[h[n]]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_h.txt", ".")
table = diagram_h(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("h_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | Type(n) | H(n) | Type(H(n)) | H(H(n)) | Type(H(H(n))) | H(H(H(n))) | Type(H(H(H(n))))
---------- | ---------- | ---------- | ---------- | ---------- | ------------- | ---------- | ----------------
0 | | 0 | | 0 | | 0 |
1 | L | 1 | L | 1 | L | 1 | L
2 | R | 1 | L | 1 | L | 1 | L
3 | M | 2 | R | 1 | L | 1 | L
4 | N | 3 | M | 2 | R | 1 | L
5 | L | 4 | N | 3 | M | 2 | R
6 | R | 4 | N | 3 | M | 2 | R
7 | L | 5 | L | 4 | N | 3 | M
8 | R | 5 | L | 4 | N | 3 | M
9 | M | 6 | R | 4 | N | 3 | M
10 | L | 7 | L | 5 | L | 4 | N
11 | R | 7 | L | 5 | L | 4 | N
12 | M | 8 | R | 5 | L | 4 | N
13 | N | 9 | M | 6 | R | 4 | N
14 | L | 10 | L | 7 | L | 5 | L
15 | R | 10 | L | 7 | L | 5 | L
16 | M | 11 | R | 7 | L | 5 | L
17 | N | 12 | M | 8 | R | 5 | L
18 | L | 13 | N | 9 | M | 6 | R
19 | R | 13 | N | 9 | M | 6 | R
20 | L | 14 | L | 10 | L | 7 | L
21 | R | 14 | L | 10 | L | 7 | L
22 | M | 15 | R | 10 | L | 7 | L
23 | N | 16 | M | 11 | R | 7 | L
24 | L | 17 | N | 12 | M | 8 | R
25 | R | 17 | N | 12 | M | 8 | R
26 | L | 18 | L | 13 | N | 9 | M
27 | R | 18 | L | 13 | N | 9 | M
28 | M | 19 | R | 13 | N | 9 | M
29 | L | 20 | L | 14 | L | 10 | L
30 | R | 20 | L | 14 | L | 10 | L
31 | M | 21 | R | 14 | L | 10 | L
32 | N | 22 | M | 15 | R | 10 | L
33 | L | 23 | N | 16 | M | 11 | R
34 | R | 23 | N | 16 | M | 11 | R
35 | L | 24 | L | 17 | N | 12 | M
36 | R | 24 | L | 17 | N | 12 | M
37 | M | 25 | R | 17 | N | 12 | M
38 | L | 26 | L | 18 | L | 13 | N
39 | R | 26 | L | 18 | L | 13 | N
40 | M | 27 | R | 18 | L | 13 | N
41 | N | 28 | M | 19 | R | 13 | N
42 | L | 29 | L | 20 | L | 14 | L
43 | R | 29 | L | 20 | L | 14 | L
44 | M | 30 | R | 20 | L | 14 | L
45 | N | 31 | M | 21 | R | 14 | L
46 | L | 32 | N | 22 | M | 15 | R
47 | R | 32 | N | 22 | M | 15 | R
48 | L | 33 | L | 23 | N | 16 | M
49 | R | 33 | L | 23 | N | 16 | M
50 | M | 34 | R | 23 | N | 16 | M
51 | L | 35 | L | 24 | L | 17 | N
52 | R | 35 | L | 24 | L | 17 | N
53 | M | 36 | R | 24 | L | 17 | N
54 | N | 37 | M | 25 | R | 17 | N
55 | L | 38 | L | 26 | L | 18 | L
56 | R | 38 | L | 26 | L | 18 | L
57 | M | 39 | R | 26 | L | 18 | L
58 | N | 40 | M | 27 | R | 18 | L
59 | L | 41 | N | 28 | M | 19 | R
60 | R | 41 | N | 28 | M | 19 | R
61 | L | 42 | L | 29 | L | 20 | L
62 | R | 42 | L | 29 | L | 20 | L
63 | M | 43 | R | 29 | L | 20 | L
64 | N | 44 | M | 30 | R | 20 | L
65 | L | 45 | N | 31 | M | 21 | R
66 | R | 45 | N | 31 | M | 21 | R
67 | L | 46 | L | 32 | N | 22 | M
68 | R | 46 | L | 32 | N | 22 | M
69 | M | 47 | R | 32 | N | 22 | M
70 | L | 48 | L | 33 | L | 23 | N
71 | R | 48 | L | 33 | L | 23 | N
72 | M | 49 | R | 33 | L | 23 | N
73 | N | 50 | M | 34 | R | 23 | N
74 | L | 51 | L | 35 | L | 24 | L
75 | R | 51 | L | 35 | L | 24 | L
76 | M | 52 | R | 35 | L | 24 | L
77 | N | 53 | M | 36 | R | 24 | L
78 | L | 54 | N | 37 | M | 25 | R
79 | R | 54 | N | 37 | M | 25 | R
80 | L | 55 | L | 38 | L | 26 | L
81 | R | 55 | L | 38 | L | 26 | L
82 | M | 56 | R | 38 | L | 26 | L
83 | N | 57 | M | 39 | R | 26 | L
84 | L | 58 | N | 40 | M | 27 | R
85 | R | 58 | N | 40 | M | 27 | R
86 | L | 59 | L | 41 | N | 28 | M
87 | R | 59 | L | 41 | N | 28 | M
88 | M | 60 | R | 41 | N | 28 | M
89 | L | 61 | L | 42 | L | 29 | L
90 | R | 61 | L | 42 | L | 29 | L
91 | M | 62 | R | 42 | L | 29 | L
92 | N | 63 | M | 43 | R | 29 | L
93 | L | 64 | N | 44 | M | 30 | R
94 | R | 64 | N | 44 | M | 30 | R
95 | L | 65 | L | 45 | N | 31 | M
96 | R | 65 | L | 45 | N | 31 | M
97 | M | 66 | R | 45 | N | 31 | M
98 | L | 67 | L | 46 | L | 32 | N
99 | R | 67 | L | 46 | L | 32 | N
100 | M | 68 | R | 46 | L | 32 | N
89 90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | | |
------ | | ------ ------ | ------ |
| | | | | | | |
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
--------- | | --------- --------- | ------ | | ------ | | ------ ------ | | ------ ------ |
| | | | | | | | | | | | | | | | | | |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| | | | | | | | | | | | | | | | | | |
---------- | | ---------- --------- | --------- | | --------- | | ---------
| | | | | | | | | | | | |
29 30 31 32 33 34 35 36 37 38 39 40 41
| | | | | | | | | | | | |
------------- | | ---------- ---------- | ---------- | |
| | | | | | | | |
20 21 22 23 24 25 26 27 28
| | | | | | | | |
--------------------- | | ------------- ------------- |
| | | | | |
14 15 16 17 18 19
| | | | | |
------------------------------ | | ---------------------
| | | |
10 11 12 13
| | | |
------------------------------------ | |
| | |
7 8 9
| | |
--------------------------------------------- |
| |
5 6
| |
---------------------------------------------------------------
|
4
|
|
|
3
|
|
|
2
|
|
|
1
|
from jutility import util
import tree
def diagram_h_flipped(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("t_n", width=10, title="Type(n)"),
util.Column("h_n", width=10, title="H(n)"),
util.Column("t_h_n", width=10, title="Type(H(n))"),
util.Column("h_h_n", width=10, title="H(H(n))"),
util.Column("t_h_h_n", width=10, title="Type(H(H(n)))"),
util.Column("h_h_h_n", width=10, title="H(H(H(n)))"),
util.Column("t_h_h_h_n", width=10, title="Type(H(H(H(n))))"),
printer=printer,
)
h = {0: 0, 1: 1, 2: 1, 3: 2, 4: 3}
t = {2: "?", 3: "?", 4: "N"}
for n in range(5):
table.update(n=n, h_n=h[n], h_h_n=h[h[n]], h_h_h_n=h[h[h[n]]])
for n in range(5, n_max + 1):
h[n] = n + 1 - h[h[h[n - 1] + 1]]
if t[n - 1] == "L":
t[n] = "R"
elif t[h[n]] == "L":
t[n] = "M"
elif t[h[n]] == "M":
t[n] = "N"
else:
t[n] = "L"
if n > 5:
assert h[n] - h[n-1] == (0 if (t[n-1] == "L") else 1)
assert h[h[h[n]]] - h[h[h[n-1]]] == (1 if (t[n-1] == "R") else 0)
assert h[h[h[n]]] - h[h[h[n-1]]] == (1 if (t[n-2] == "L") else 0)
assert h[h[h[n]]] - h[h[h[n-1]]] == 1 - (h[n-1] - h[n-2])
assert h[h[h[n]]] + h[n-1] - n == h[h[h[n-1]]] + h[n-2] - (n-1)
assert h[n-1] == n - h[h[h[n]]]
assert h[h[h[n]]] == h[h[h[n-2] + 1]]
assert h[n] == n + 1 - h[h[h[n-1] + 1]]
table.update(
n=n,
t_n=t[n],
h_n=h[n],
t_h_n=t[h[n]],
h_h_n=h[h[n]],
t_h_h_n=t[h[h[n]]],
h_h_h_n=h[h[h[n]]],
t_h_h_h_n=t[h[h[h[n]]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_h_flipped.txt", ".")
table = diagram_h_flipped(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("h_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | Type(n) | H(n) | Type(H(n)) | H(H(n)) | Type(H(H(n))) | H(H(H(n))) | Type(H(H(H(n))))
---------- | ---------- | ---------- | ---------- | ---------- | ------------- | ---------- | ----------------
0 | | 0 | | 0 | | 0 |
1 | | 1 | | 1 | | 1 |
2 | | 1 | | 1 | | 1 |
3 | | 2 | | 1 | | 1 |
4 | | 3 | | 2 | | 1 |
5 | L | 4 | N | 3 | ? | 2 | ?
6 | R | 4 | N | 3 | ? | 2 | ?
7 | M | 5 | L | 4 | N | 3 | ?
8 | L | 6 | R | 4 | N | 3 | ?
9 | R | 6 | R | 4 | N | 3 | ?
10 | N | 7 | M | 5 | L | 4 | N
11 | M | 8 | L | 6 | R | 4 | N
12 | L | 9 | R | 6 | R | 4 | N
13 | R | 9 | R | 6 | R | 4 | N
14 | L | 10 | N | 7 | M | 5 | L
15 | R | 10 | N | 7 | M | 5 | L
16 | N | 11 | M | 8 | L | 6 | R
17 | M | 12 | L | 9 | R | 6 | R
18 | L | 13 | R | 9 | R | 6 | R
19 | R | 13 | R | 9 | R | 6 | R
20 | M | 14 | L | 10 | N | 7 | M
21 | L | 15 | R | 10 | N | 7 | M
22 | R | 15 | R | 10 | N | 7 | M
23 | L | 16 | N | 11 | M | 8 | L
24 | R | 16 | N | 11 | M | 8 | L
25 | N | 17 | M | 12 | L | 9 | R
26 | M | 18 | L | 13 | R | 9 | R
27 | L | 19 | R | 13 | R | 9 | R
28 | R | 19 | R | 13 | R | 9 | R
29 | N | 20 | M | 14 | L | 10 | N
30 | M | 21 | L | 15 | R | 10 | N
31 | L | 22 | R | 15 | R | 10 | N
32 | R | 22 | R | 15 | R | 10 | N
33 | M | 23 | L | 16 | N | 11 | M
34 | L | 24 | R | 16 | N | 11 | M
35 | R | 24 | R | 16 | N | 11 | M
36 | L | 25 | N | 17 | M | 12 | L
37 | R | 25 | N | 17 | M | 12 | L
38 | N | 26 | M | 18 | L | 13 | R
39 | M | 27 | L | 19 | R | 13 | R
40 | L | 28 | R | 19 | R | 13 | R
41 | R | 28 | R | 19 | R | 13 | R
42 | L | 29 | N | 20 | M | 14 | L
43 | R | 29 | N | 20 | M | 14 | L
44 | N | 30 | M | 21 | L | 15 | R
45 | M | 31 | L | 22 | R | 15 | R
46 | L | 32 | R | 22 | R | 15 | R
47 | R | 32 | R | 22 | R | 15 | R
48 | N | 33 | M | 23 | L | 16 | N
49 | M | 34 | L | 24 | R | 16 | N
50 | L | 35 | R | 24 | R | 16 | N
51 | R | 35 | R | 24 | R | 16 | N
52 | M | 36 | L | 25 | N | 17 | M
53 | L | 37 | R | 25 | N | 17 | M
54 | R | 37 | R | 25 | N | 17 | M
55 | L | 38 | N | 26 | M | 18 | L
56 | R | 38 | N | 26 | M | 18 | L
57 | N | 39 | M | 27 | L | 19 | R
58 | M | 40 | L | 28 | R | 19 | R
59 | L | 41 | R | 28 | R | 19 | R
60 | R | 41 | R | 28 | R | 19 | R
61 | M | 42 | L | 29 | N | 20 | M
62 | L | 43 | R | 29 | N | 20 | M
63 | R | 43 | R | 29 | N | 20 | M
64 | L | 44 | N | 30 | M | 21 | L
65 | R | 44 | N | 30 | M | 21 | L
66 | N | 45 | M | 31 | L | 22 | R
67 | M | 46 | L | 32 | R | 22 | R
68 | L | 47 | R | 32 | R | 22 | R
69 | R | 47 | R | 32 | R | 22 | R
70 | L | 48 | N | 33 | M | 23 | L
71 | R | 48 | N | 33 | M | 23 | L
72 | N | 49 | M | 34 | L | 24 | R
73 | M | 50 | L | 35 | R | 24 | R
74 | L | 51 | R | 35 | R | 24 | R
75 | R | 51 | R | 35 | R | 24 | R
76 | N | 52 | M | 36 | L | 25 | N
77 | M | 53 | L | 37 | R | 25 | N
78 | L | 54 | R | 37 | R | 25 | N
79 | R | 54 | R | 37 | R | 25 | N
80 | M | 55 | L | 38 | N | 26 | M
81 | L | 56 | R | 38 | N | 26 | M
82 | R | 56 | R | 38 | N | 26 | M
83 | L | 57 | N | 39 | M | 27 | L
84 | R | 57 | N | 39 | M | 27 | L
85 | N | 58 | M | 40 | L | 28 | R
86 | M | 59 | L | 41 | R | 28 | R
87 | L | 60 | R | 41 | R | 28 | R
88 | R | 60 | R | 41 | R | 28 | R
89 | N | 61 | M | 42 | L | 29 | N
90 | M | 62 | L | 43 | R | 29 | N
91 | L | 63 | R | 43 | R | 29 | N
92 | R | 63 | R | 43 | R | 29 | N
93 | M | 64 | L | 44 | N | 30 | M
94 | L | 65 | R | 44 | N | 30 | M
95 | R | 65 | R | 44 | N | 30 | M
96 | L | 66 | N | 45 | M | 31 | L
97 | R | 66 | N | 45 | M | 31 | L
98 | N | 67 | M | 46 | L | 32 | R
99 | M | 68 | L | 47 | R | 32 | R
100 | L | 69 | R | 47 | R | 32 | R
89 90 91 92 93 94 95 96 97 98 99 100
| | | | | | | | | | | |
| | ------ | ------ ------ | | |
| | | | | | | | |
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| -------- -------- | | ------ ------ | | ------ | | ------ | ------ ------ | | ------
| | | | | | | | | | | | | | | | | | |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| | | | | | | | | | | | | | | | | | |
--------- | | -------- | | -------- | -------- -------- | | --------
| | | | | | | | | | | | |
29 30 31 32 33 34 35 36 37 38 39 40 41
| | | | | | | | | | | | |
| | ------------ | --------- --------- | | ---------
| | | | | | | | |
20 21 22 23 24 25 26 27 28
| | | | | | | | |
| -------------------- ------------- | | -------------
| | | | | |
14 15 16 17 18 19
| | | | | |
----------------------------- | | ---------------------
| | | |
10 11 12 13
| | | |
| | ------------------------------
| | |
7 8 9
| | |
| -----------------------------------------
| |
5 6
| |
-----------------------------------------------------------------------
|
4
|
|
|
3
|
|
|
2
|
|
|
1
|
from jutility import util
import tree
def diagram_j(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("j_n", width=10, title="J(n)"),
util.Column("j_j_n", width=10, title="J(J(n))"),
util.Column("j_j_j_n", width=10, title="J(J(J(n)))"),
util.Column("j_j_j_j_n", width=10, title="J(J(J(J(n))))"),
printer=printer,
)
j = {0: 0}
table.update(
n=0,
j_n=j[0],
j_j_n=j[j[0]],
j_j_j_n=j[j[j[0]]],
j_j_j_j_n=j[j[j[j[0]]]],
)
for n in range(1, n_max + 1):
j[n] = n - j[j[j[j[n - 1]]]]
table.update(
n=n,
j_n=j[n],
j_j_n=j[j[n]],
j_j_j_n=j[j[j[n]]],
j_j_j_j_n=j[j[j[j[n]]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_j.txt", ".")
table = diagram_j(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("j_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | J(n) | J(J(n)) | J(J(J(n))) | J(J(J(J(n))))
---------- | ---------- | ---------- | ---------- | -------------
0 | 0 | 0 | 0 | 0
1 | 1 | 1 | 1 | 1
2 | 1 | 1 | 1 | 1
3 | 2 | 1 | 1 | 1
4 | 3 | 2 | 1 | 1
5 | 4 | 3 | 2 | 1
6 | 5 | 4 | 3 | 2
7 | 5 | 4 | 3 | 2
8 | 6 | 5 | 4 | 3
9 | 6 | 5 | 4 | 3
10 | 7 | 5 | 4 | 3
11 | 8 | 6 | 5 | 4
12 | 8 | 6 | 5 | 4
13 | 9 | 6 | 5 | 4
14 | 10 | 7 | 5 | 4
15 | 11 | 8 | 6 | 5
16 | 11 | 8 | 6 | 5
17 | 12 | 8 | 6 | 5
18 | 13 | 9 | 6 | 5
19 | 14 | 10 | 7 | 5
20 | 15 | 11 | 8 | 6
21 | 15 | 11 | 8 | 6
22 | 16 | 11 | 8 | 6
23 | 17 | 12 | 8 | 6
24 | 18 | 13 | 9 | 6
25 | 19 | 14 | 10 | 7
26 | 19 | 14 | 10 | 7
27 | 20 | 15 | 11 | 8
28 | 20 | 15 | 11 | 8
29 | 21 | 15 | 11 | 8
30 | 22 | 16 | 11 | 8
31 | 23 | 17 | 12 | 8
32 | 24 | 18 | 13 | 9
33 | 24 | 18 | 13 | 9
34 | 25 | 19 | 14 | 10
35 | 25 | 19 | 14 | 10
36 | 26 | 19 | 14 | 10
37 | 27 | 20 | 15 | 11
38 | 27 | 20 | 15 | 11
39 | 28 | 20 | 15 | 11
40 | 29 | 21 | 15 | 11
41 | 30 | 22 | 16 | 11
42 | 31 | 23 | 17 | 12
43 | 31 | 23 | 17 | 12
44 | 32 | 24 | 18 | 13
45 | 32 | 24 | 18 | 13
46 | 33 | 24 | 18 | 13
47 | 34 | 25 | 19 | 14
48 | 34 | 25 | 19 | 14
49 | 35 | 25 | 19 | 14
50 | 36 | 26 | 19 | 14
51 | 37 | 27 | 20 | 15
52 | 37 | 27 | 20 | 15
53 | 38 | 27 | 20 | 15
54 | 39 | 28 | 20 | 15
55 | 40 | 29 | 21 | 15
56 | 41 | 30 | 22 | 16
57 | 41 | 30 | 22 | 16
58 | 42 | 31 | 23 | 17
59 | 42 | 31 | 23 | 17
60 | 43 | 31 | 23 | 17
61 | 44 | 32 | 24 | 18
62 | 44 | 32 | 24 | 18
63 | 45 | 32 | 24 | 18
64 | 46 | 33 | 24 | 18
65 | 47 | 34 | 25 | 19
66 | 47 | 34 | 25 | 19
67 | 48 | 34 | 25 | 19
68 | 49 | 35 | 25 | 19
69 | 50 | 36 | 26 | 19
70 | 51 | 37 | 27 | 20
71 | 51 | 37 | 27 | 20
72 | 52 | 37 | 27 | 20
73 | 53 | 38 | 27 | 20
74 | 54 | 39 | 28 | 20
75 | 55 | 40 | 29 | 21
76 | 55 | 40 | 29 | 21
77 | 56 | 41 | 30 | 22
78 | 56 | 41 | 30 | 22
79 | 57 | 41 | 30 | 22
80 | 58 | 42 | 31 | 23
81 | 58 | 42 | 31 | 23
82 | 59 | 42 | 31 | 23
83 | 60 | 43 | 31 | 23
84 | 61 | 44 | 32 | 24
85 | 61 | 44 | 32 | 24
86 | 62 | 44 | 32 | 24
87 | 63 | 45 | 32 | 24
88 | 64 | 46 | 33 | 24
89 | 65 | 47 | 34 | 25
90 | 65 | 47 | 34 | 25
91 | 66 | 47 | 34 | 25
92 | 67 | 48 | 34 | 25
93 | 68 | 49 | 35 | 25
94 | 69 | 50 | 36 | 26
95 | 69 | 50 | 36 | 26
96 | 70 | 51 | 37 | 27
97 | 70 | 51 | 37 | 27
98 | 71 | 51 | 37 | 27
99 | 72 | 52 | 37 | 27
100 | 73 | 53 | 38 | 27
96 97 98 99 100
| | | | |
------ | | |
| | | |
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| | | | | | | | | | | | | | | | | | | | | | | | | |
--------- | | | ------ ------ | ------ | | ------ | | | ------ | | | ------
| | | | | | | | | | | | | | | | | | |
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| | | | | | | | | | | | | | | | | | |
---------- | | | --------- --------- | --------- | | --------- | | |
| | | | | | | | | | | | | |
37 38 39 40 41 42 43 44 45 46 47 48 49 50
| | | | | | | | | | | | | |
----------- | | | ---------- ---------- | ---------- | |
| | | | | | | | | |
27 28 29 30 31 32 33 34 35 36
| | | | | | | | | |
----------- | | | ----------- ----------- |
| | | | | | |
20 21 22 23 24 25 26
| | | | | | |
------------- | | | -------------
| | | | |
15 16 17 18 19
| | | | |
--------------------- | | |
| | | |
11 12 13 14
| | | |
------------------------------ | |
| | |
8 9 10
| | |
----------------------------------------- |
| |
6 7
| |
----------------------------------------------------
|
5
|
|
|
4
|
|
|
3
|
|
|
2
|
|
|
1
|
from jutility import util
import tree
def diagram_j_flipped(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("j_n", width=10, title="J(n)"),
util.Column("j_j_n", width=10, title="J(J(n))"),
util.Column("j_j_j_n", width=10, title="J(J(J(n)))"),
util.Column("j_j_j_j_n", width=10, title="J(J(J(J(n))))"),
printer=printer,
)
j = {0: 0, 1: 1, 2: 1, 3: 2, 4: 3, 5: 4}
for n in range(6):
table.update(
n=n,
j_n=j[n],
j_j_n=j[j[n]],
j_j_j_n=j[j[j[n]]],
j_j_j_j_n=j[j[j[j[n]]]],
)
for n in range(6, n_max + 1):
j[n] = n + 1 - j[j[j[j[n - 1] + 1]]]
table.update(
n=n,
j_n=j[n],
j_j_n=j[j[n]],
j_j_j_n=j[j[j[n]]],
j_j_j_j_n=j[j[j[j[n]]]],
)
return table
if __name__ == "__main__":
printer = util.Printer("diagram_j_flipped.txt", ".")
table = diagram_j_flipped(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("j_n"))
tree.print_tree_dict(tree_dict, 1, printer)
n | J(n) | J(J(n)) | J(J(J(n))) | J(J(J(J(n))))
---------- | ---------- | ---------- | ---------- | -------------
0 | 0 | 0 | 0 | 0
1 | 1 | 1 | 1 | 1
2 | 1 | 1 | 1 | 1
3 | 2 | 1 | 1 | 1
4 | 3 | 2 | 1 | 1
5 | 4 | 3 | 2 | 1
6 | 5 | 4 | 3 | 2
7 | 5 | 4 | 3 | 2
8 | 6 | 5 | 4 | 3
9 | 7 | 5 | 4 | 3
10 | 7 | 5 | 4 | 3
11 | 8 | 6 | 5 | 4
12 | 9 | 7 | 5 | 4
13 | 10 | 7 | 5 | 4
14 | 10 | 7 | 5 | 4
15 | 11 | 8 | 6 | 5
16 | 12 | 9 | 7 | 5
17 | 13 | 10 | 7 | 5
18 | 14 | 10 | 7 | 5
19 | 14 | 10 | 7 | 5
20 | 15 | 11 | 8 | 6
21 | 15 | 11 | 8 | 6
22 | 16 | 12 | 9 | 7
23 | 17 | 13 | 10 | 7
24 | 18 | 14 | 10 | 7
25 | 19 | 14 | 10 | 7
26 | 19 | 14 | 10 | 7
27 | 20 | 15 | 11 | 8
28 | 21 | 15 | 11 | 8
29 | 21 | 15 | 11 | 8
30 | 22 | 16 | 12 | 9
31 | 22 | 16 | 12 | 9
32 | 23 | 17 | 13 | 10
33 | 24 | 18 | 14 | 10
34 | 25 | 19 | 14 | 10
35 | 26 | 19 | 14 | 10
36 | 26 | 19 | 14 | 10
37 | 27 | 20 | 15 | 11
38 | 28 | 21 | 15 | 11
39 | 29 | 21 | 15 | 11
40 | 29 | 21 | 15 | 11
41 | 30 | 22 | 16 | 12
42 | 31 | 22 | 16 | 12
43 | 31 | 22 | 16 | 12
44 | 32 | 23 | 17 | 13
45 | 32 | 23 | 17 | 13
46 | 33 | 24 | 18 | 14
47 | 34 | 25 | 19 | 14
48 | 35 | 26 | 19 | 14
49 | 36 | 26 | 19 | 14
50 | 36 | 26 | 19 | 14
51 | 37 | 27 | 20 | 15
52 | 38 | 28 | 21 | 15
53 | 39 | 29 | 21 | 15
54 | 40 | 29 | 21 | 15
55 | 40 | 29 | 21 | 15
56 | 41 | 30 | 22 | 16
57 | 42 | 31 | 22 | 16
58 | 43 | 31 | 22 | 16
59 | 43 | 31 | 22 | 16
60 | 44 | 32 | 23 | 17
61 | 45 | 32 | 23 | 17
62 | 45 | 32 | 23 | 17
63 | 46 | 33 | 24 | 18
64 | 46 | 33 | 24 | 18
65 | 47 | 34 | 25 | 19
66 | 48 | 35 | 26 | 19
67 | 49 | 36 | 26 | 19
68 | 50 | 36 | 26 | 19
69 | 50 | 36 | 26 | 19
70 | 51 | 37 | 27 | 20
71 | 51 | 37 | 27 | 20
72 | 52 | 38 | 28 | 21
73 | 53 | 39 | 29 | 21
74 | 54 | 40 | 29 | 21
75 | 55 | 40 | 29 | 21
76 | 55 | 40 | 29 | 21
77 | 56 | 41 | 30 | 22
78 | 57 | 42 | 31 | 22
79 | 58 | 43 | 31 | 22
80 | 59 | 43 | 31 | 22
81 | 59 | 43 | 31 | 22
82 | 60 | 44 | 32 | 23
83 | 61 | 45 | 32 | 23
84 | 62 | 45 | 32 | 23
85 | 62 | 45 | 32 | 23
86 | 63 | 46 | 33 | 24
87 | 64 | 46 | 33 | 24
88 | 64 | 46 | 33 | 24
89 | 65 | 47 | 34 | 25
90 | 65 | 47 | 34 | 25
91 | 66 | 48 | 35 | 26
92 | 67 | 49 | 36 | 26
93 | 68 | 50 | 36 | 26
94 | 69 | 50 | 36 | 26
95 | 69 | 50 | 36 | 26
96 | 70 | 51 | 37 | 27
97 | 71 | 51 | 37 | 27
98 | 71 | 51 | 37 | 27
99 | 72 | 52 | 38 | 28
100 | 72 | 52 | 38 | 28
96 97 98 99 100
| | | | |
| ------ ------
| | |
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| | | | | | | | | | | | | | | | | | | | | | | | | |
-------- | | | ------ | | | ------ | | ------ | ------ ------ | | | ------
| | | | | | | | | | | | | | | | | | |
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| | | | | | | | | | | | | | | | | | |
| | | -------- | | -------- | -------- -------- | | | --------
| | | | | | | | | | | | | |
37 38 39 40 41 42 43 44 45 46 47 48 49 50
| | | | | | | | | | | | | |
| | --------- | --------- --------- | | | ---------
| | | | | | | | | |
27 28 29 30 31 32 33 34 35 36
| | | | | | | | | |
| ------------- ---------- | | | ----------
| | | | | | |
20 21 22 23 24 25 26
| | | | | | |
--------------------- | | | -------------
| | | | |
15 16 17 18 19
| | | | |
| | | ---------------------
| | | |
11 12 13 14
| | | |
| | ------------------------------
| | |
8 9 10
| | |
| ----------------------------------------
| |
6 7
| |
--------------------------------------------------------
|
5
|
|
|
4
|
|
|
3
|
|
|
2
|
|
|
1
|
from jutility import util, plotting
import tree
def diagram_recursive_chaos(n_max, printer):
table = util.Table(
util.Column("n", width=10, title="n"),
util.Column("q_n", width=10, title="Q(n)"),
util.Column("dq", width=10, title="Q(n) - Q(n-1)"),
util.Column("rq", ".3f", width=10, title="n / Q(n)"),
printer=printer,
)
q = {0: 1, 1: 1}
table.update(n=0, q_n=q[0])
table.update(n=1, q_n=q[1])
for n in range(2, n_max + 1):
q[n] = q[n - q[n - 1]] + q[n - q[n - 2]]
table.update(n=n, q_n=q[n], dq=(q[n] - q[n - 1]), rq=(n / q[n]))
return table
if __name__ == "__main__":
printer = util.Printer("diagram_recursive_chaos.txt", ".")
table = diagram_recursive_chaos(100, printer)
tree_dict = tree.list_to_tree_dict(table.get_data("q_n"))
tree.print_tree_dict(tree_dict, 3, printer)
plotting.plot(
plotting.Line(*table.get_data("n", "rq"), c="b"),
plot_name="n/Q(n) in chaotic sequence",
dir_name=".",
)
n | Q(n) | Q(n) - Q(n-1) | n / Q(n)
---------- | ---------- | ------------- | ----------
0 | 1 | |
1 | 1 | |
2 | 2 | 1 | 1.000
3 | 3 | 1 | 1.000
4 | 3 | 0 | 1.333
5 | 4 | 1 | 1.250
6 | 5 | 1 | 1.200
7 | 5 | 0 | 1.400
8 | 6 | 1 | 1.333
9 | 6 | 0 | 1.500
10 | 6 | 0 | 1.667
11 | 8 | 2 | 1.375
12 | 8 | 0 | 1.500
13 | 8 | 0 | 1.625
14 | 10 | 2 | 1.400
15 | 9 | -1 | 1.667
16 | 10 | 1 | 1.600
17 | 11 | 1 | 1.545
18 | 11 | 0 | 1.636
19 | 12 | 1 | 1.583
20 | 12 | 0 | 1.667
21 | 12 | 0 | 1.750
22 | 12 | 0 | 1.833
23 | 16 | 4 | 1.438
24 | 14 | -2 | 1.714
25 | 14 | 0 | 1.786
26 | 16 | 2 | 1.625
27 | 16 | 0 | 1.688
28 | 16 | 0 | 1.750
29 | 16 | 0 | 1.812
30 | 20 | 4 | 1.500
31 | 17 | -3 | 1.824
32 | 17 | 0 | 1.882
33 | 20 | 3 | 1.650
34 | 21 | 1 | 1.619
35 | 19 | -2 | 1.842
36 | 20 | 1 | 1.800
37 | 22 | 2 | 1.682
38 | 21 | -1 | 1.810
39 | 22 | 1 | 1.773
40 | 23 | 1 | 1.739
41 | 23 | 0 | 1.783
42 | 24 | 1 | 1.750
43 | 24 | 0 | 1.792
44 | 24 | 0 | 1.833
45 | 24 | 0 | 1.875
46 | 24 | 0 | 1.917
47 | 32 | 8 | 1.469
48 | 24 | -8 | 2.000
49 | 25 | 1 | 1.960
50 | 30 | 5 | 1.667
51 | 28 | -2 | 1.821
52 | 26 | -2 | 2.000
53 | 30 | 4 | 1.767
54 | 30 | 0 | 1.800
55 | 28 | -2 | 1.964
56 | 32 | 4 | 1.750
57 | 30 | -2 | 1.900
58 | 32 | 2 | 1.812
59 | 32 | 0 | 1.844
60 | 32 | 0 | 1.875
61 | 32 | 0 | 1.906
62 | 40 | 8 | 1.550
63 | 33 | -7 | 1.909
64 | 31 | -2 | 2.065
65 | 38 | 7 | 1.711
66 | 35 | -3 | 1.886
67 | 33 | -2 | 2.030
68 | 39 | 6 | 1.744
69 | 40 | 1 | 1.725
70 | 37 | -3 | 1.892
71 | 38 | 1 | 1.868
72 | 40 | 2 | 1.800
73 | 39 | -1 | 1.872
74 | 40 | 1 | 1.850
75 | 39 | -1 | 1.923
76 | 42 | 3 | 1.810
77 | 40 | -2 | 1.925
78 | 41 | 1 | 1.902
79 | 43 | 2 | 1.837
80 | 44 | 1 | 1.818
81 | 43 | -1 | 1.884
82 | 43 | 0 | 1.907
83 | 46 | 3 | 1.804
84 | 44 | -2 | 1.909
85 | 45 | 1 | 1.889
86 | 47 | 2 | 1.830
87 | 47 | 0 | 1.851
88 | 46 | -1 | 1.913
89 | 48 | 2 | 1.854
90 | 48 | 0 | 1.875
91 | 48 | 0 | 1.896
92 | 48 | 0 | 1.917
93 | 48 | 0 | 1.938
94 | 48 | 0 | 1.958
95 | 64 | 16 | 1.484
96 | 41 | -23 | 2.341
97 | 52 | 11 | 1.865
98 | 54 | 2 | 1.815
99 | 56 | 2 | 1.768
100 | 48 | -8 | 2.083
95 86 87 99 98
| | | | |
| ------ | |
| | | |
64 47 56 58 59 60 61 66 50 53 54 57 63 67 65 71 70 68 73 75 76 79 81 82 80 84 85 83 88 89 90 91 92 93 94 100 62 69 72 74 77 78 96 97
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| ----------------------------- | ---------------- ------ ------ | ----------- | ----------- ------ | ------ ------------------------------- --------------------- ------ |
| | | | | | | | | | | | | | | | |
31 32 35 30 33 36 34 38 37 39 42 43 44 45 46 48 49 40 41 52 51 55
| | | | | | | | | | | | | | | | | | | | | |
---------------------- | ------------------------ -------- ----------- ------------------------------------------------------------- | ------------------ | ------
| | | | | | | | | |
17 18 19 20 21 22 24 25 23 26 27 28 29
| | | | | | | | | | | | |
------------------------------- ------------------------------------------------------------- --------------------------------------------------- --------------------------------------
| | | |
11 12 13 15 14 16
| | | | | |
------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------
| | |
8 9 10
| | |
---------------------------------------------------------------------------------------------------------------------------------------------------
|
6 7
| |
-----------------------------------------------------------------------------------------------------------------------------------
|
5
|
|
|
4
|
|
|
3
|
def list_to_tree_dict(data_list):
tree_dict = {i: data for i, data in enumerate(data_list)}
return tree_dict
class Node:
def __init__(self, value, parent_node=None):
self.value = value
self.parent_node = parent_node
if parent_node is not None:
parent_node.children.append(self)
self.children = []
self.pre_space = 0
def is_leaf(self):
return (len(self.children) == 0)
def min_subtree_pos(self):
if self.is_leaf():
bound = self.pre_space
else:
bound = min(child.min_subtree_pos() for child in self.children)
return bound
def max_subtree_pos(self):
if self.is_leaf():
bound = self.pre_space
else:
bound = max(child.max_subtree_pos() for child in self.children)
return bound
def min_child_pos(self):
return min(child.pre_space for child in self.children)
def max_child_pos(self):
return max(child.pre_space for child in self.children)
def shift_subtree_pos(self, n):
self.pre_space += n
for child in self.children:
child.shift_subtree_pos(n)
def __repr__(self):
return "%s -> %s" % (self.parent_node.value, self.value)
def print_tree_dict(tree_dict, root, printer, num_space=2):
max_len = max(len(str(data)) for data in tree_dict.keys())
item_width = max_len + num_space
reverse_dict = {v: [] for v in tree_dict.values()}
for k, v in tree_dict.items():
reverse_dict[v].append(k)
root_node = Node(root, Node(None, None))
level_list_list = [[root_node]]
leaf_list = [
Node(leaf, root_node)
for leaf in reverse_dict[root]
if leaf != root
]
while len(leaf_list) > 0:
level_list_list.append(leaf_list)
leaf_list = [
Node(leaf, parent)
for parent in leaf_list
if parent.value in reverse_dict
for leaf in reverse_dict[parent.value]
]
for level_list in reversed(level_list_list):
pre_space = 0
for node in level_list:
subtree_min_pos = node.min_subtree_pos()
subtree_width = node.max_subtree_pos() - subtree_min_pos
if subtree_min_pos < pre_space:
node.shift_subtree_pos(pre_space - subtree_min_pos)
if not node.is_leaf():
min_child_pos = node.min_child_pos()
max_child_pos = node.max_child_pos()
node.pre_space = (min_child_pos + max_child_pos) // 2
pre_space += subtree_width + item_width
for i, level_list in enumerate(reversed(level_list_list)):
for line_type in ["-", "|1", "v", "|2"]:
pos = 0
for node in level_list:
if line_type in ["-", "|1"] and node.is_leaf():
continue
if line_type in ["|1", "|2", "v"]:
s = str(node.value) if (line_type == "v") else "|"
s_pos = node.pre_space
else:
min_child_pos = node.min_child_pos()
max_child_pos = node.max_child_pos()
c = "-" if (len(node.children) > 1) else "|"
s = c * (max_child_pos - min_child_pos + 1)
s_pos = min_child_pos
pad_len = s_pos - pos
s = s.ljust(item_width)
s = s.rjust(pad_len + len(s))
printer(s, end="")
pos += len(s)
printer(end="\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment