Not to be confused with ε function.
Hyper-E notation
Based onExponentiation
Growth rate$$f_{\omega}(n)$$

Hyper-E Notation (E# for short) is a notation for large numbers devised by Sbiis Saibian. It was first introduced on his Web book One to Infinity: A Finite Journey on November 19, 2011, and was generalized to Extended Hyper-E Notation (xE# for short). Hyper-E Notation is a refined version of a notation Sbiis Saibian devised as a child.

E# is not primitive recursive, and specifically the function E(n) = En##n eventually dominates all primitive recursive functions. In fact, in the fast-growing hierarchy, $$n \mapsto\textrm E100\#\#n$$ dominates $$f_n$$ for all $$n < \omega$$ and is itself dominated by $$f_\omega$$.

E# and xE# form part of a larger notation, the Extensible-E System, that also encompasses Cascading-E Notation.

Nathan Ho and Wojowu proved termination for the rules of Hyper-E Notation.[dead link]

## Original definition

The original Hyper-E Notation consists of a sequence an of one or more positive integer arguments separated by hyperions (or hyper marks) #. We notate this as E[b]a1#a2#...#an. b is called the base — if it is omitted, as it often is, it defaults to 10. "E[b]d" is also equal to "b^d".

The three rules are as follows:

• Rule 1. If there are no hyperions:
$$\textrm E[b]x = b^x$$.
• Rule 2. If the last entry is 1:
$$\textrm E[b]{a_1}\#{a_2}\#{a_3}\cdots\#{a_n}\#1 = E[b]{a_1}\#{a_2}\#{a_3}\cdots\#{a_n}$$.
• Rule 3. Otherwise:
$$\textrm E[b]{a_1}\#{a_2}\#{a_3}\cdots\#{a_{n-2}}\#{a_{n-1}}\#{a_n} =$$
$$= \textrm E[b]{a_1}\#{a_2}\#{a_3}\cdots\#{a_{n-2}}\#(\textrm E[b]{a_1}\#{a_2}\#{a_3}\cdots\#{a_{n-2}}\#{a_{n-1}}\#{(a_n-1)})$$

In plain English:

1. If there is only one argument x, the value of the expression is bx.
2. If the last entry is 1, it may be removed.
3. Otherwise...
1. Evaluate the original expression, but with the last entry decreased by 1. Call this value z.
2. Remove the last two entries of the expression.
3. Add z as an entry to the end of the expression.

## Extended definition

Extended Hyper-E notation
Based onhyperion marks
Growth rate$$f_{\omega^{\omega}}(n)$$

Extended Hyper-E Notation allows multiple hyperions to appear between each entry. The number of hyperions following entry an is represented by h(n). For the sake of this definition, #n is a shorthand for n successive hyperion marks. For example, a full expression would be written E(b)a1#h(1)a2#h(2)...#h(n - 1)an#h(n). Saibian uses @ to indicate the rest of the expression such as Bowers uses # to indicate the rest of the array.

The difference between original and extended notation is that extended Hyper-E notation allows more than one consecutive #'s.

• Rule 1. If there are no hyperions:
$$E(b)x = b^x$$.
• Rule 2. If the last entry is 1:
$$E(b) @ \#^{h(n-1)}{a_n}\#^{h(n)}1 = E(b) @ \#^{h(n-1)}{a_n}$$.
• Rule 3. If $$h(n-1)>1$$:
$$E(b) @ \#^{h(n-2)}{a_{n-1}}\#^{h(n-1)}{a_n} = E(b) @ \#^{h(n-2)}{a_{n-1}}\#^{h(n-1)-1}{a_{n-1}}\#^{h(n-1)}{a_n-1}$$.
• Rule 4. Otherwise:
$$E(b) @ \#^{h(n-2)}{a_{n-1}}\#{a_n} = E(b) @ \#^{h(n-2)}(E(b) @ \#^{h(n-2)}{a_{n-1}}\#{a_n-1})$$ (note $$\#^1$$ = $$\#$$).

It seems similar to linear array notation rules. We can also rewrite it in plain English:

1. If there is only one argument x, the value of the expression is bx.
2. If the last entry is 1, it may be removed.
3. Let h be the length of the last set of hyperion marks. If h > 1:
1. Remove the last entry of the expression and call it r.
2. Again remove the last entry of the expression; this time call it z.
3. Repeat "z" r times with h - 1 hyperion marks in between each repetition. Append this to the end of the expression. (Restore a removed hyperion mark sequence to glue the two expressions together.)
4. If the last set of hyperion marks is of length one:
1. Evaluate the original expression, but with the last entry decreased by 1. Call this value z.
2. Remove the last two entries of the expression.
3. Add z as an entry to the end of the expression. (Again, restore a removed hyperion mark sequence to glue the two expressions together.)

## Examples

• E(10)6 = E6 = E6#1 = 106 = million
• E(10)100 = E100 = E100#1 = 10100 = googol
This is an example of rule 1 with a one-entry expressions. Since the base defaults to 10, we can abbreviate E(10)100 as E100.
• E100#2 = E(E100#1) = E10100 = 1010100 = googolplex
• E100#3 = E(E100#2) = E1010100 = 101010100 = googolduplex
This is an example of rule 3 (rule 4 in the expansion) with a two-entry expressions. In the second expression, the parentheses can be omitted: E(E100#1) = EE100#1.
• E303#1 = E303 = eceton = centillion = 10303
• E303#2 = ecetonplex = EE303 = 1010303
• E303#3 = EEE303 = 101010303 = ecetonduplex
• E1#3 = EEE1 = 101010 = trialogue
• E1#4 = EEEE1 = 10101010 = tetralogue
• E1#10 = EEEEEEEEEE1 = 10^^10 = Decker
• E303#6 = EEEEEE303 = 101010101010303 = ecetonquintiplex
• E1#100 = EEE...EEE1 (100 E's) = giggol
Repeated application of rule 3: E1#100 = EE1#99 = EEE1#98 = ...
• E100#100 = EEE...EEE100 (100 E's) = grangol
This is the same as E1#100, but with a different first entry.
• E100#101 = EEE...EEE100 (101 E's) = grangolplex
E100#101 = EE100#100 = 10grangol, hence the name.
• E100#100#2 = E100#(E100#100) = EEE...EEE100 (grangol E's) = grangoldex
Now we enter three-entry expressions.
• E100#100#3 = E100#(E100#100#2) = E100#(E100#(E100#100)) = EEE...EEE100 (grangoldex E's) = grangoldudex
Increasing the value of the third entry makes nesting deeper and deeper.
• E100#100#100#100 = E100#100#(E100#100#100#99) = E100#100#(E100#100#(E100#100#100#98)) = ... gigangol
Four-entry expressions are similar — they create deeper and deeper nesting in the array level below them. This can also be written as E100##4; the beginning of the next level of the notation.
• E100##100 = E100#100#100#...#100#100#100 with 100 repetitions of 100 = gugold
Now we have arrived at Extended Hyper-E Notation. Two successive hyperion marks (deutero-hyperions) indicate repetition at the lower level.
• E100##100#100 = graatagold
This expression decomposes into Ea##b expressions by applying rule 4 repeatedly.
• E100##100##100 = E100##100#100#...#100#100 with 100 repetitions of 100 = gugolthra
We ignore the first ## until the second one has been expanded and all the 100s have been solved.
• E100###100 = E100##100##...##100##100 with 100 repetitions of 100 = throogol
Three hyperion marks (trito-hyperions) constitute a repetition of two hyperion marks. Remember, the double marks are solved from right to left.
• E100####100 = E100###100###...###100###100 with 100 repetitions of 100 = teroogol
• Godgahlah = E100#####...#####100 with 100 hyperion marks or E100#100100
Sets of 100 hyperion marks decompose into 99s, 99s decompose into 98s, etc. Also note that the superscript 100 means that there are 100 #'s, and should not be confused with E100#(100100).

## Relationship to Other Notations

The first segments of Hyper-E notation are based on exponentiation, i.e. En equals 10n. Nesting in a single-entry Hyper-E produces iterated exponentiation, such as EEEn=101010n. Then, hyperion marks come into play. Because hyperion marks are crucial to the recursion in this notation, certain arrangements of hyperions can indicate similarity to other notations defined by recursion.

Hyper-E can relate to arrow notation through the following rule: for positive integers a, b, c. For example,

• a↑b = E(a)b
• a↑↑b = E(a)1#b
• a↑↑↑b = E(a)1#1#b
• a↑↑↑↑b = E(a)1#1#1#b

## Pseudocode

For a fixed number of variables, the original Hyper-E Notation is primitive-recursive, although the values it produces are well beyond that of any computer. The extended Hyper-E Notation is nonprimitive-recursive for two variables or more.

function Eb(a1, a2, ..., an - 1, an): //Default value of b is 10

if n = 1:
return ba1

if an = 1:
return Eb(a1, a2, ..., an - 1)

z := Eb(a1, a2, ..., an - 1, an - 1)

return Eb(a1, a2, ..., an - 2, z)

function xEb(a1, a2, ..., an - 1, an;
h1, h2, ..., hn - 2, hn - 1): //Default value of b is 10

if n = 1:
return ba1

if an = 1:
return xEb(a1, a2, ..., an - 1;
h1, h2, ..., hn - 2)

if hn - 1 > 1:
r := an
z := an - 1
zseq := z, z, ..., z, z (r times)
h := ah - 1
hseq := h, h, ..., h, h (r - 1 times)
return xEb(a1, a2, ..., an - 2, zseq;
h1, h2, ..., hn - 2, hseq)

z := xEb(a1, a2, ..., an - 1;
h1, h2, ..., hn - 2, hn - 1)
return xEb(a1, a2, ..., an - 2, z;
h1, h2, ..., hn - 2)