Numbers
Creating constants in Piet can simply be done by using the push operation with a very big blob. However, this is not the most pixel efficient way to do this. We can find the optimal solution by doing a BFS search of all possible operations, giving the operations weight based on amount of pixels used. This results in the following table of the first 173 optimal solutions
0 ['push 1', 'not']
1 ['push 1']
2 ['push 2']
3 ['push 3']
4 ['push 2', 'dup', 'add']
5 ['push 5']
6 ['push 3', 'dup', 'add']
7 ['push 1', 'push 3', 'dup', 'add', 'add']
8 ['push 2', 'dup', 'dup', 'add', 'mul']
9 ['push 3', 'dup', 'mul']
10 ['push 1', 'push 3', 'dup', 'mul', 'add']
11 ['push 2', 'push 3', 'dup', 'mul', 'add']
12 ['push 3', 'dup', 'push 1', 'add', 'mul']
13 ['push 1', 'push 3', 'dup', 'push 1', 'add', 'mul', 'add']
14 ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'add']
15 ['push 3', 'dup', 'push 2', 'add', 'mul']
16 ['push 2', 'dup', 'add', 'dup', 'mul']
17 ['push 1', 'push 2', 'dup', 'add', 'dup', 'mul', 'add']
18 ['push 3', 'dup', 'dup', 'add', 'mul']
19 ['push 1', 'push 3', 'dup', 'dup', 'add', 'mul', 'add']
20 ['push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul']
21 ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'mul']
22 ['push 2', 'dup', 'push 3', 'dup', 'mul', 'add', 'mul']
23 ['push 5', 'dup', 'mul', 'push 2', 'sub']
24 ['push 3', 'dup', 'push 1', 'add', 'dup', 'add', 'mul']
25 ['push 5', 'dup', 'mul']
26 ['push 1', 'push 5', 'dup', 'mul', 'add']
27 ['push 3', 'dup', 'dup', 'mul', 'mul']
28 ['push 1', 'push 3', 'dup', 'dup', 'mul', 'mul', 'add']
29 ['push 2', 'push 3', 'dup', 'dup', 'mul', 'mul', 'add']
30 ['push 3', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul']
31 ['push 2', 'dup', 'add', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add']
32 ['push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'mul']
33 ['push 1', 'push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'mul', 'add']
34 ['push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'push 1', 'add', 'mul']
35 ['push 3', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub']
36 ['push 3', 'dup', 'add', 'dup', 'mul']
37 ['push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add']
38 ['push 2', 'dup', 'push 3', 'mul', 'dup', 'mul', 'add']
39 ['push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'add']
40 ['push 2', 'dup', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'mul']
41 ['push 5', 'dup', 'push 1', 'add', 'dup', 'mul', 'add']
42 ['push 3', 'dup', 'add', 'dup', 'push 1', 'add', 'mul']
43 ['push 1', 'push 3', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'add']
44 ['push 2', 'dup', 'dup', 'push 3', 'dup', 'mul', 'add', 'mul', 'mul']
45 ['push 3', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul']
46 ['push 1', 'push 3', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul', 'add']
47 ['push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'mul', 'push 1', 'sub']
48 ['push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'mul']
49 ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'mul']
50 ['push 5', 'dup', 'dup', 'add', 'mul']
51 ['push 1', 'push 5', 'dup', 'dup', 'add', 'mul', 'add']
52 ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'dup', 'mul', 'add']
53 ['push 3', 'dup', 'dup', 'mul', 'mul', 'dup', 'push 1', 'sub', 'add']
54 ['push 3', 'dup', 'dup', 'dup', 'add', 'mul', 'mul']
55 ['push 1', 'push 3', 'dup', 'dup', 'dup', 'add', 'mul', 'mul', 'add']
56 ['push 2', 'dup', 'dup', 'add', 'mul', 'dup', 'push 1', 'sub', 'mul']
57 ['push 3', 'dup', 'dup', 'push 1', 'add', 'dup', 'mul', 'add', 'mul']
58 ['push 2', 'dup', 'dup', 'dup', 'add', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub']
59 ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'sub', 'mul', 'push 1', 'sub']
60 ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'sub', 'mul']
61 ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'dup', 'mul', 'mul', 'sub', 'sub']
62 ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'push 2', 'sub']
63 ['push 3', 'dup', 'mul', 'dup', 'push 2', 'sub', 'mul']
64 ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul']
65 ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
66 ['push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
67 ['push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
68 ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul']
69 ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'add']
70 ['push 3', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub', 'dup', 'add']
71 ['push 3', 'dup', 'add', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add']
72 ['push 3', 'dup', 'add', 'dup', 'dup', 'add', 'mul']
73 ['push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub']
74 ['push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'add']
75 ['push 3', 'dup', 'push 2', 'add', 'dup', 'mul', 'mul']
76 ['push 1', 'push 3', 'dup', 'push 2', 'add', 'dup', 'mul', 'mul', 'add']
77 ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'dup', 'add', 'sub']
78 ['push 3', 'dup', 'dup', 'dup', 'mul', 'mul', 'push 1', 'sub', 'mul']
79 ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'sub']
80 ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 1', 'sub']
81 ['push 3', 'dup', 'mul', 'dup', 'mul']
82 ['push 1', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add']
83 ['push 2', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add']
84 ['push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add']
85 ['push 1', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
86 ['push 2', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
87 ['push 3', 'dup', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
88 ['push 2', 'dup', 'dup', 'add', 'mul', 'dup', 'push 3', 'add', 'mul']
89 ['push 3', 'dup', 'mul', 'dup', 'dup', 'mul', 'push 1', 'sub', 'add']
90 ['push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul']
91 ['push 1', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
92 ['push 2', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
93 ['push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
94 ['push 1', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'add']
95 ['push 1', 'push 3', 'dup', 'add', 'sub', 'dup', 'dup', 'add', 'dup', 'mul', 'add']
96 ['push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'add', 'mul', 'mul']
97 ['push 1', 'push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'add', 'mul', 'mul', 'add']
98 ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'dup', 'add', 'mul']
99 ['push 3', 'dup', 'mul', 'dup', 'push 2', 'add', 'mul'] 100 ['push 1', 'push 3', 'dup', 'mul', 'add', 'dup', 'mul']
This process is actually not limited to just pushing numbers (constants) onto the stack, we can actually find a sequence of operations that will create anything on the stack, e.g. finding the shortest way to create [9,12] on the stack might not be the same as just doing 9, and then 12.
9 ['push 3', 'dup', 'mul'] 12 ['push 3', 'dup', 'push 1', 'add', 'mul']
vs
9,12 ['push 3', 'dup', 'mul', 'dup', 'push 3', 'add']
The problem with this solution, is if I ask for the number 123512436, this will take a very long time.
So instead, we can find a fast and close to optimal solution instead.
For this we take the N’th (integer) root of the number, with N increasing until the root is smaller than 173.
Then we use dup
and mul
to to get the N’th power of the N’th root, getting us very close to the actual number.
We then repeat this process and add the result recursively.
Now finding a compact representation for 123512436 “only” takes 2sec resulting in:
123512436 ['push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub', 'mul', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'mul', 'dup', 'dup', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'mul', 'push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add', 'add', 'add', 'add']
We can even do very big numbers like
10528634093245891598124891409502082689253983140914951 ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'sub', 'add', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'sub', 'dup', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'sub', 'add', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'add', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 5', 'dup', 'dup', 'push 1', 'add', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'push 1', 'add', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'push 1', 'add', 'dup', 'add', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'sub', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'sub', 'dup', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'dup', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'add', 'dup', 'dup', 'add', 'dup', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'push 1', 'add', 'dup', 'add', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'push 1', 'add', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'sub', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'push 5', 'dup', 'dup', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'push 1', 'add', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'sub', 'dup', 'dup', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 5', 'dup', 'dup', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'push 2', 'sub', 'mul', 'dup', 'dup', 'mul', 'mul', 'push 2', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add', 'dup', 'mul', 'push 3', 'dup', 'push 2', 'add', 'mul', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add']
We can see that we are currently not using repeating squaring, which could make the power function alot faster. And if we look at smaller numbers, the optimal
421 ['push 1', 'push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
takes 18sec using 14 pixels, becomes
421 ['push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'dup', 'mul', 'push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'mul', 'add']
taking only 0.1sec using 20 pixels.