Introduction to BEAF

BEAF, or Bowers Exploding Array Function, is a googological function invented by Jonathan Bowers. This article is an informal introduction to the function, meant to give an intuitive sense of how it works.

Arrow notation
Before we can understand BEAF, we must understand the extended operators at its core. Arrow notation describes a set of operators invented by :


 * \(a\uparrow b = a^b\).
 * \(a\uparrow\uparrow b = \underbrace{a\uparrow a\uparrow\ldots\uparrow a\uparrow a}_b = \underbrace{a^{a^{a^{.^{.^.}}}}}_b\). Googologists call this tetration; arrows should be solved from right to left.
 * \(a\uparrow\uparrow\uparrow b = \underbrace{a\uparrow\uparrow a\uparrow\uparrow\ldots\uparrow\uparrow a\uparrow\uparrow a}_b\). Also known as pentation.

In general,
 * \(a\uparrow^n b = \underbrace{a\uparrow^{n-1} a\uparrow^{n-1}\ldots\uparrow^{n-1} a\uparrow^{n-1} a}_b\).

Here are some examples:


 * \(3\uparrow 4 = 3^4 = 81\) (3 to the power of 4)
 * \(2\uparrow\uparrow 4 = 2\uparrow 2\uparrow 2\uparrow 2 = 2\uparrow 2\uparrow 4 = 2\uparrow 16 = 65536\) (2 tetrated to 4))
 * \(4\uparrow\uparrow 4 = 2361022671...5261392896\); about \(8.0723\cdot 10^{153}\) digits (4 tetrated to 4)
 * \(3\uparrow\uparrow\uparrow 3 = 3\uparrow\uparrow 3\uparrow\uparrow 3 = 3\uparrow\uparrow 3^{3^3} = 3\uparrow\uparrow 7625597484987\) (3 pentated to 3)

Operator notation
Bowers developed a generalization of arrow notation that he calls operator notation:


 * \(a\ \{n\}\ b = a\uparrow^n b\)
 * i.e.: \(a\ \{1\}\ b = a^b\)
 * and \(a\ \{n\}\ b = \underbrace{a\ \{n - 1\}\ a\ \{n - 1\}\ \ldots\ \{n - 1\}\ a\ \{n - 1\}\ a}_b\)

For example, \(3\ \{4\}\ 5 = 3\uparrow\uparrow\uparrow\uparrow 5\).

This form of operator notation is simply a shorthand for arrow notation. However, Bowers takes it a step further by wrapping n in two pairs of braces instead of one:


 * \(a\ \{\{1\}\}\ b = \underbrace{a\ \{a\ \{\ldots a\ \{a}_b\}\ a\ldots\}\ a\}\ a\)

Bowers calls this a expanded to b. Here, b is the number of "layers" including the outside, or (number of a 's + 1) / 2. (For the computer scientists out there, expansion is not primitive-recursive. You can't program it using only for loops with precalculated limits.)

An example:


 * \(3\ \{\{1\}\}\ 3 = 3\ \{3\ \{3\}\ 3\}\ 3 = 3\ \{3\ \{2\}\ 7625597484987\}\ 3\)

If we change n to 2, we get multiexpansion.
 * \(a\ \{\{2\}\}\ b = \underbrace{a\ \{\{1\}\}\ a\ \{\{1\}\}\ \ldots\ \{\{1\}\}\ a\ \{\{1\}\}\ a}_b\)

Higher values for n can be used:
 * \(a\ \{\{3\}\}\ b = \underbrace{a\ \{\{2\}\}\ a\ \{\{2\}\}\ \ldots\ \{\{2\}\}\ a\ \{\{2\}\}\ a}_b\) (powerexpansion)
 * \(a\ \{\{4\}\}\ b = \underbrace{a\ \{\{3\}\}\ a\ \{\{3\}\}\ \ldots\ \{\{3\}\}\ a\ \{\{3\}\}\ a}_b\) (expandotetration)
 * expandopentation, expandohexation, etc.

All these operators are right-associative, and they work just like the lower hyper-operators.

Using three braces instead of two gives us explosion:


 * \(a\ \{\{\{1\}\}\}\ b = \underbrace{a\ \{\{a\ \{\{\ldots a\ \{\{a\}\}\ a\ldots\}\}\ a\}\}\ a}_b\)
 * \(a\ \{\{\{2\}\}\}\ b = \underbrace{a\ \{\{\{1\}\}\}\ a\ \{\{\{1\}\}\}\ \ldots\ \{\{\{1\}\}\}\ a\ \{\{\{1\}\}\}\ a}_b\) (multiexplosion)
 * \(a\ \{\{\{3\}\}\}\ b = \underbrace{a\ \{\{\{2\}\}\}\ a\ \{\{\{2\}\}\}\ \ldots\ \{\{\{2\}\}\}\ a\ \{\{\{2\}\}\}\ a}_b\) (powerexplosion)
 * \(a\ \{\{\{4\}\}\}\ b = \underbrace{a\ \{\{\{3\}\}\}\ a\ \{\{\{3\}\}\}\ \ldots\ \{\{\{3\}\}\}\ a\ \{\{\{3\}\}\}\ a}_b\) (explodotetration)
 * explodopentation, explodohexation, etc.

Four sets of braces is detonation (multidetonation, powerdetonation, detonotetration, etc.), and five is pentonation (multipentonation, powerpentonation, pentonotetration, etc.) Then we have hexonation, heptonation, etc.

Our operator notation now has four arguments:


 * \(a\ \{1\}\ b = a^b\)
 * \(a\ \{1\}^d\ b = \underbrace{a\ \{a\ \{\ldots a\ \{a\}^{d - 1}\ a\ldots\}^{d - 1}\ a\}^{d - 1}\ a}_b\)
 * \(a\ \{c\}^d\ b = \underbrace{a\ \{c - 1\}^d\ a\ \{c - 1\}^d\ \ldots\ \{c - 1\}^d\ a\ \{c - 1\}^d\ a}_b\)

Here, the superscript d 's indicate the number of curly braces wrapped around c. For example, \(\{\ldots\}^4\) is a shorthand for \(\{\{\{\{\ldots\}\}\}\}\). This particular notation was not used by Jonathan Bowers.

Googologist Chris Bird proved that this 4-argument notation is about as powerful as chained arrow notation. We have barely scratched the surface of BEAF, however!

Linear array notation
Operator notation is starting to burst at the seams. A simpler way to write \(a\ \{c\}^d\ b\) is \(\{a, b, c, d\}\). Our new notation is:


 * \(\{a, b, 1, 1\} = a^b\)
 * \(\{a, b, 1, d\} = \underbrace{\{a, a, \{a, a, \ldots \{a, a, a, d - 1\} \ldots, d - 1\}, d - 1\}}_b\) if \(d > 1\)
 * \(\{a, b, c, d\} = \underbrace{\{a, \{a, \ldots \{a, a, c - 1, d\} \ldots, c - 1, d\}, c - 1, d\}}_b\) if \(c > 1\)

Ones are considered defaults, so we can chop off the end of an array if it consists only of ones. For example, \(\{a, b, 1, 1\}\) can just be written \(\{a, b\} = a^b\).

We can simplify rules 2 and 3 somewhat by relying on their recursive nature:


 * \(\{a, b, 1, d\} = \underbrace{\{a, a, \{a, a, \ldots \{a, a, a, d - 1\} \ldots, d - 1\}, d - 1\}}_b\)
 * \(= \{a, a, \underbrace{\{a, a, \ldots \{a, a, a, d - 1\} \ldots, d - 1\}}_{b - 1}, d - 1\} = \{a, a, \{a, b - 1, 1, d\}, d - 1\}\)


 * \(\{a, b, c, d\} = \underbrace{\{a, \{a, \ldots \{a, a, c - 1, d\} \ldots, c - 1, d\}, c - 1, d\}}_b\)
 * \(= \{a, \underbrace{\{a, \ldots \{a, a, c - 1, d\} \ldots, c - 1, d\}}_{b - 1}, c - 1, d\} = \{a, \{a, b - 1, c, d\}, c - 1, d\}\)

But you'll notice a problem with this refactoring. We've specified an inductive rule, but no base case, so in both cases \(b\) will keep decreasing forever! We supply a rule explaining what happens when \(b\) reaches \(1\):


 * \(\{a, 1, c, d\} = a\)

This step is very important to the definition of BEAF. If it is not clear to you, try working it out on paper.

Five entries and more
Let's recap with our current ruleset:


 * \(\{a, b, 1, 1\} = \{a, b\} = a^b\)
 * \(\{a, 1, c, d\} = a\)
 * \(\{a, b, 1, d\} = \{a, a, \{a, b - 1, 1, d\}, d - 1\}\), \(b,d > 1\)
 * \(\{a, b, c, d\} = \{a, \{a, b - 1, c, d\}, c - 1, d\}\), \(b,c > 1\)

With our new simplification, a pattern is faintly visible in the final two terms. Equipped with this knowledge, we will attempt a fifth argument:


 * \(\{a, b\} = a^b\)
 * \(\{a, 1, c, d, e\} = a\)
 * \(\{a, b, 1, 1, e\} = \{a, a, a, \{a, b-1, 1, 1, e\}, e-1\}\), \(b,e > 1\)
 * \(\{a, b, 1, d, e\} = \{a, a, \{a, b - 1, 1, d, e\}, d - 1, e\}\), \(b,d > 1\)
 * \(\{a, b, c, d, e\} = \{a, \{a, b - 1, c, d, e\}, c - 1, d, e\}\), \(b,c > 1\)

There's a gap in the third rule, but we can mend it by extrapolating back from the fourth and fifth rules:


 * \(\{a, b, 1, 1, e\} = \{a, a, a, \{a, b - 1, 1, 1, e\}, e - 1\}\)

The addition of the fifth entry was mercifully simple. We can continue the pattern and add a sixth:


 * \(\{a, b\} = a^b\)
 * \(\{a, 1, c, d, e, f\} = a\)
 * \(\{a, b, 1, 1, 1, f\} = \{a, a, a, a, \{a, b - 1, 1, 1, 1, f\}, f - 1\}\), \(b,f > 1\)
 * \(\{a, b, 1, 1, e, f\} = \{a, a, a, \{a, b - 1, 1, 1, e, f\}, e - 1, f\}\), \(b,e > 1\)
 * \(\{a, b, 1, d, e, f\} = \{a, a, \{a, b - 1, 1, d, e, f\}, d - 1, e, f\}\), \(b,d > 1\)
 * \(\{a, b, c, d, e, f\} = \{a, \{a, b - 1, c, d, e, f\}, c - 1, d, e, f\}\), \(b,c > 1\)

We should generalize this to an arbitrary number of terms. To keep this concise, we'll introduce some terminology. The first entry \(a\) is the base, and the second \(b\) is the prime. After the prime, the first non-1 entry is the pilot; the entry immediately before it is the copilot, and all entries before that are the passengers. The value of the array is written \(v(A)\). Using these terms, we can completely describe linear array notation.


 * Linear array notation

Let \(b\) be the base and \(p\) the prime.


 * 1) If there is no pilot (that is, all entries after the prime are 1), then \(v(A) = b^p\).
 * 2) If the prime is 1, \(v(A) = b\).
 * 3) Otherwise...
 * 4) Replace the copilot with a copy of the original array, but with the prime decreased by one.
 * 5) Decrease the value of the pilot by 1.
 * 6) Set all passengers to \(b\).


 * (end of definition)

This is a modern redefinition of Bowers' classic array notation, written around 2002. The original used seven rules, but we managed to slim it down to three!

Examples
We have completely solved linear arrays now, and now we'll present some examples to get a better intuitive sense.

\begin{eqnarray*} \{3,3,1,1,1,3\} &=& \{3,3,3,3,\{3,2,1,1,1,3\},2\} \\ &=& \{3,3,3,3,\{3,3,3,3,3,2\},2\} \\ &=& \{3,3,3,3,\{3,\{3,2,3,3,3,2\},2,3,3,2\},2\} \\ &=& \{3,3,3,3,\{3,\{3,\{3,1,3,3,3,2\},2,3,3,2\},2,3,3,2\},2\} \\ &=& \{3,3,3,3,\{3,\{3,3,2,3,3,2\},2,3,3,2\},2\} \end{eqnarray*}

If all the entries in an array are the same, we can convert it to a simpler higher-order array:

Three entries converted to four:


 * {a,a,a} = {a,2,1,2}
 * {a,a,{a,a,a}} = {a,3,1,2}
 * {a,a,{a,a,a,{a,a,a}}} = {a,4,1,2} and so on.

Four entries converted to five:


 * {a,a,a,a} = {a,2,1,1,2}
 * {a,a,a,{a,a,a,a}} = {a,3,1,1,2}
 * {a,a,a,{a,a,a,{a,a,a,{a,a,a,{a,a,a,a}}}}} = {a,6,1,1,2}

Five entries converted to six:


 * {a,a,a,a,a} = {a,2,1,1,1,2}
 * {a,a,a,a,a,{a,a,a,a,a}} = {a,3,1,1,1,2}
 * {a,a,a,a,a,{a,a,a,a,a,{a,a,a,a,a}}} = {a,4,1,1,1,2}

In general, {a,b,1,1,...,1,1,2} = {a,a,a,...,a,a,{a,a,a,...a,a,{a,a,a,...,a,a,{a,a,a,...,a,a}...}}} with b layers.

Multidimensional arrays
We'll introduce a new operator, "b array of a":


 * \(b \& a = \underbrace{\{a, a, ..., a, a\}}_b\)

This function "diagonalizes" through everything we've done so far. It's a sizable function; if you're familiar with the fast-growing hierarchy, then \(n \& n\) is about the level of \(f_{\omega^\omega}(n)\).

To continue extending array notation, we need to take a bit of a leap of intuition. \(b \& a\) is vaguely similar to \(a^b = \underbrace{\{a \cdot a \cdots a \cdot a\}}_b\), so let's write an "second-order array notation" with the base rule changed:


 * 1) Base rule. If there is no pilot (that is, all entries after the prime are 1), then \(v(A) = p \& b\).

To indicate second-order array notation, we'll put a subscript number 2 after the array: \(\{a, b\}_2 = p \& b\). We might as well do order 3 while we're at it. Define \(b \&_2 a = \underbrace{\{a, a, ..., a, a\}_2}_b\), and replace \(\&\) with \(\&_2\) in the above base rule. Bam. Third-order array notation.

From here the extension should be obvious and a little dull. Let's generalize and create a new ruleset with \(r\) as the order:


 * 1) Base rule. If there is no pilot and \(r = 1\), then \(v(A) = b^p\).
 * 2) Order rule. If there is no pilot and \(r > 1\), then \(v(A) = p \&_{r - 1} b\).
 * 3) The prime rule and catastrophic rule are unchanged.

So how can we take maximum advantage of this extension? By letting \(r\) be the value of an array:


 * \(\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}}\)

Heck, why not nest it \(b\) times?


 * \(\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{._{._.}}}}\)

We'll use \(b \&_{1, 2} a\) to write this, allowing us to define "order-1,2 notation." (Hmmm...why "1,2"?) Next is \(2,2\), which is merely \(\{a, a, \ldots, a, a\}_{1,2}\). We can inductively define order-n,2 in the same way we defined order-n.

Now for 1,3:


 * \(\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{._{._.}},2},2}\)

and in general 1,n for n > 1:


 * \(\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{\{a, a, \ldots, a, a\}_{._{._.}},n - 1},n - 1}\)

Not bad so far. How about 1,1,2? We can see from here that \(r\) is taking on multiple entries, and can start to mirror the way ordinary arrays work. We find the first non-1 entry in \(r\), call that the "order-pilot," replace the order-copilot with a copy of the array with the prime decreased by 1, decrease the order-pilot, and set the first \(p\) entries to \(b\).

But why do we need to segregate the pilot and the order-pilot at all? We only need to care about the order when the array is just the base and the prime, as in \(\{b, p\}_{1,1,2}\). The crucial step here is saying that \(r\) is part of the array, and therefore the order-pilot is the pilot.

Let's revise our notation to put \(r\) within the curly braces. Bowers' fascination with higher dimensions let him to put \(r\) as the second row, e.g.:

\[\left\{ \begin{matrix} b,p \\ 1,1,2 \end{matrix} \right\}\]

Inline, we will write this as \(\{b, p\ (1)\ 1, 1, 2\}\), where the (1) indicates a break between rows. Again, each row is automatically filled with a (countably) infinite number of 1's, so this array is identical to \(\{b, p, 1\ (1)\ 1, 1, 2\}\) or \(\{b, p, 1, 1, 1\ (1)\ 1, 1, 2, 1, 1\}\).

Now let's write some rules for our new notation.

Our next step should be showing how to evaluate arrays with 2 dimensions or more. For example, take this array:

\[\left\{ \begin{matrix} 3,3 \\ 3,3 \end{matrix} \right\}\]

To easily operate with these ones, we need other separators (not only commas) in the array which indicate the beginning of the specified dimension. The above array can be also written as \(\{3,3 (1) 3,3\}\).

We have a two dimensional array: two entries in the first row and two in the second. (1) here indicates that the following two entries are on the next line. Generally, (n) separator means going to the next n-dimension.

How could we expand these arrays? When the very first row contains more than 2 entries, we can apply our current rules described above. For instance:

\begin{eqnarray*} \{3,3,3 (1) 2\} &=& \{3,\{3,2,3 (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,\{3,1,3 (1) 2\},2 (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,3,2 (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,\{3,2,2 (1) 2\},1 (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,\{3,2,2 (1) 2\} (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,\{3,\{3,1,2 (1) 2\},1 (1) 2\} (1) 2\} (1) 2\},2 (1) 2\} \\ &=& \{3,\{3,\{3,3 (1) 2\} (1) 2\} (1) 2\},2 (1) 2\} \end{eqnarray*}

When the first row contains 2 entries, we use this simple rule:


 * \(\{a,b (1) 2\} = \{\underbrace{a,a,a,\cdots,a,a,a}_{\text{b a's}}\}\)

e.g. \(\{3,6 (1) 2\} = \{3,3,3,3,3,3\}\).

Now look what would happen with our example above. The innermost array is equal to \(\{3,3 (1) 2\} = \{3,3,3\} = 3 \uparrow\uparrow\uparrow 3 = 3 \uparrow\uparrow 7625597484987 = N\). After evaluating this N, the next array becomes \(\{3,N (1) 2\} = \{\underbrace{3,3,3,\cdots,3,3,3}_{\text{N 3's}}\}\).

Bowers made his notation so that every next level is so advanced and powerful that simple examples in that level can clobber upper limits of current and previous levels. We can see, even so easy expressions in multidimensional arrays can be as powerful that they make linear arrays negligible.

Returning back to rules, we can notice that we can have linear array prior to (1) separator. A "2" after (1) indicates 2nd level of linear arrays. So, we can have more levels of linear array notations, each explodes the previous levels. The connection between these levels:


 * \(\{a,b (1) c\} = \{\underbrace{a,a,a,\cdots,a,a,a}_{\text{b a's}} (1) c-1\}\)

When c=1, \(\{a,b (1) 1\} = \{a,b\} = a^b\), 1-chopping still works in 2nd row. Furthermore, it will still works with arbitrary large structures.

Now how could we define \(\{a,b (1) 1,2\}\) (the smallest array with 2 entries in 2nd row)?

We notice the similarity of \(\{a,b,1,2\} = \{a,a,\{a,b-1,1,2\}\}\) and \(\{a,b (1) 1,2\}\), which leads to:


 * \(\{a,b (1) 1,2\} = \{\underbrace{a,a,a,\cdots,a,a,a}_{\text{b a's}} (1) \{a,b-1 (1) 1,2\}\}\)

When the first entry after (1) is equal to 1, we can apply linear array rules except that the first row fills with b a's (if we apply the rules, decreasing some entry in the second row). For example, \(\{3,3 (1) 1,1,1,3\} = \{3,3,3 (1) 3,3,\{3,2 (1) 1,1,1,3\},2\}\). If the first entry after (1) is not 1, then decrease it by 1 and fill the first row with b a's.

We can add entries in the third row:


 * \(\{a,b (1)(1) c\} = \{\underbrace{a,a,a,\cdots,a,a,a}_{\text{b a's}} (1) \underbrace{a,a,a,\cdots,a,a,a}_{\text{b a's}} (1) c-1\}\)

Now we apply our rules on the third row. When we decrease an entry in the second row, we fill the first row. If we decrease an entry in the third row, we fill both previous rows. Generally, decreasing an entry in the n-th row leads to filling all previous rows with b a's in each. For example:


 * \(\{3,4 (1)(1)(1)(1)(1) 5\} = \{3,3,3,3 (1) 3,3,3,3 (1) 3,3,3,3 (1) 3,3,3,3 (1) 3,3,3,3 (1) 4\}\)

Recall that if we have more than one entry on the last row, we replace the penultimate entry with an array identical to the original array except that the second entry is decreased by 1:


 * \(\{3,4 (1)(1) 1,1,1,1,9\} = \{3,3,3,3 (1) 3,3,3,3 (1) 3,3,3,\{3,3 (1)(1) 1,1,1,1,9\},8\}\)

Now we introduce the (2) separator:


 * \(\{a,b (2) c\} = \{\underbrace{a,a,\cdots,a,a}_{\text{b a's}} (1) \underbrace{a,a,\cdots,a,a}_{\text{b a's}} (1) \cdots (1) \underbrace{a,a,\cdots,a,a}_{\text{b a's}} (2) c-1\}\) (with b rows)

Note that the comma can be also written as the (0) separator, and reducting an entry after it just makes one entry prior to it, (1) makes a row of entries, (2) makes a square of entries. By analogy, (n) makes n-D hypercube of entries prior to it. How to solve all this? To go any further, we should introduce the special "array of" operator, an important and powerful tool.

Array of operator
The array of operator, notated & (not to be confused with logical "and" operator) returns the array assigned to the structure at the left to &, filled with the number of entries at the right to &. What are these structures? First structures are numbers, and \(n\ \&\ m = \{\underbrace{m,m,m,\cdots,m,m,m}_{\text{n m's}}\}\). The structure above numbers, so called X-structure, should be evaluated to m. So, \(X\ \&\ m = m \&\ m = \{m,m (1) 2\}\).

If we want to specify other number, we can enclose it by brackets: \(X\ \&\ a[b] = b\ \&\ a[b]\). This notation hasn't been used by Bowers himself.

The structures above numbers X are X+1,X+2,X+3,...,2X,2X+1,2X+2,2X+3,...,3X,4X,...,\(X^2\), etc. X+m can be thought as a line of entries with m entries below it, 2X as two lines, 3X as three lines, nX+m as n lines of entries with m entries below it all. Here are some correspondences between our notations above and "array of":

\begin{eqnarray*} 1\ \&\ n &=& \{n\} = n \\ 2\ \&\ n &=& \{n,n\} = n^n \\ 3\ \&\ n &=& \{n,n,n\} = n \uparrow^{n} n \\ 4\ \&\ n &=& \{n,n,n,n\} = n \underbrace{ \{\{\cdots\{\{n\}\}\cdots\}\} }_{n \{\}'s} n \\ m\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{m n's}}\} &=& \{n,m (1) 2\} \\ X\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}}\} &=& \{n,n (1) 2\} \\ X+1\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) n\} \\ X+2\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) n,n\} \\ X+3\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) n,n,n\} \\ X+m\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) \underbrace{n,n,n,\cdots,n,n,n}_{\text{m n's}}\} \\ 2X\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) \underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}}\} \\ 3X\ \&\ n &=& \{\underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) \underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}} (1) \underbrace{n,n,n,\cdots,n,n,n}_{\text{n n's}}\} \\ mX\ \&\ n &=& \{\underbrace{X\ \&\ n(1)X\ \&\ n(1)X\ \&\ n(1)\cdots(1)X\ \&\ n(1)X\ \&\ n(1)X\ \&\ n}_{\text{m X's}}\} &=& \{n,m (2) 2\} \\ X^2\ \&\ n &=& \{\underbrace{X\ \&\ n(1)X\ \&\ n(1)X\ \&\ n(1)\cdots(1)X\ \&\ n(1)X\ \&\ n(1)X\ \&\ n}_{\text{n X's}} &=& \{n,n (2) 2\} \end{eqnarray*}

As can be seen, last three examples can be simplified to \(\{n,3 (2) 2\}, \{n,m (2) 2\}\) and \(\{n,n (2) 2\}\) respectively. Here the last "2" is in the next plane and marks the start of 3-D arrays. Fortunately, we don't have to draw multidimensional arrays in its natural form. The main key to it is using polynomial form: the expression \(a_1X^m+a_2X^{m-1}+a_3X^{m-2}+\cdots+a_{m-1}X+a_m \&\ b[p]\) means that its array is formed by \(a_1\) sections of \(X^m\) (m-D array of b's), then \(a_2\) sections of \(X^{m-1}\), then \(a_3\) sections of \(X^{m-2}\), and so on. The total number of entries can be found by replacing every X to p and solving like normal polynomial. For example, \(X^{100}+X^{99} \&\ 3[4]\) has \(4^{100}+4^{99}\) entries.