Remember addition? Remember how that used to go?

Sure ya do.

a+b = a+1+1+1+1+1+...+1

How about multiplication? Moving into high school territory here.

a*b = a+a+a+a+a+...+a

Man, that's like repeated addition, isn't it? Groovy.

Okay, let's go for degree level: exponentiation.

a^b = a*a*a*a*a*...*a

Repeated multiplication! Iiiiiiiinteresting. If only we could... continue this pattern. Generalise this sequence. What would come next? Let's call that "tetration".

"a tetrated to b" is:

a^^b = a^a^a^a^...^a

i.e. "a power tower of b instances of a".

By the way, you know how addition and multiplication are associative (x+(y+z)=(x+y)+z, x*(y*z)=(x*y)*z, always, the brackets don't matter)? Exponentiation isn't. x^(y^z) does not equal (x^y)^z, most of the time. So here "a^a^a" is ambiguous, it could mean "(a^a)^a" or "a^(a^a)", which are two different things. So we will make it a convention from now on to consider all operators to be right-associative. That is:

a^^b = a^(a^(a^(a^...^(a^a)...)))

This convention will mean we can leave out all those tedious brackets in future.

We can keep going. The less well known term "pentation" is next. "a pentated to b" is:

a^^^b = a^^a^^a^^...^^a

(Still right-associative here.)

And we can keep going.

The "hyper operator" is a way of generalising all of the above into an function with just three arguments: a, b, and the type of operation, n, where we'll say addition means n=1, multiplication is n=2, exponentiation is n=3, tetration is n=4 (ah, you see where that came from?), pentation is n=5 and so on to infinity.

hyper(a,1,b) = a+b
hyper(a,2,b) = a*b
hyper(a,3,b) = a^b
hyper(a,4,b) = a^^b etc.

Note that n does not equal the number of arrows. n is the number of arrows minus two. This is confusing.


Observe the clever bit.

              /                                           \
a^^^...^^^b = a^^^...^^^a^^^...^^^a^^^...^^^ ... ^^^...^^^a
 \_______/     \_______/ \_______/ \_______/     \_______/
     n            n-1       n-1       n-1           n-1
                        /                                 \
            = a^^^...^^^a^^^...^^^a^^^...^^^ ... ^^^...^^^a
               \_______/ \_______/ \_______/     \_______/
                  n-1       n-1       n-1           n-1
            = a^^^...^^^(a^^^...^^^(b-1))
               \_______/  \_______/
                  n-1         n

In other words:

hyper(a,n,b) = hyper(a,n-1,hyper(a,n,b-1))

The hyper operator has a recursive definition. Every number expressible in terms of hyper operators is built from smaller pieces which are also expressible in terms of hyper operators. (That is, unless n=1, in which case hyper(a,1,b) = a+b as above. Or unless b=1, in which case hyper(a,1,1) = a+1, and hyper(a,n,1) = a the rest of the time. You have to start building somewhere.)


The hyper operator is essentially identical to Donald Knuth's up-arrow notation except in as much as the preponderance of arrows is reduced to an integer representing the number of arrows - this saves space on the page, meaning the hyper operator is sometimes a more convenient piece of notation to use.

Like arrow notation, the hyper operator provides a generalisation of several mathematical operators into a single one - which is always handy - and also provides easy access to some useful additional ones. It provides a logical progression from addition, multiplication and exponentiation to higher operations.

These facts in turn mean that the hyper operator, even more easily than up-arrow notation, provides quick access to some startlingly, even shockingly big numbers.


2^^^^3 = hyper(2,6,3)
       = hyper(2,5,hyper(2,6,2))
       = hyper(2,5,hyper(2,5,hyper(2,6,1)))
       = hyper(2,5,hyper(2,5,2))
       = hyper(2,5,hyper(2,4,hyper(2,5,1)))
       = hyper(2,5,hyper(2,4,2))
       = hyper(2,5,hyper(2,3,hyper(2,4,1)))
       = hyper(2,5,hyper(2,3,2))
       = hyper(2,5,2^2)
       = hyper(2,5,4)
       = hyper(2,4,hyper(2,5,3))
       = hyper(2,4,hyper(2,4,hyper(2,5,2)))
       = hyper(2,4,hyper(2,4,hyper(2,4,hyper(2,5,1))))
       = hyper(2,4,hyper(2,4,hyper(2,4,2)))
       = hyper(2,4,hyper(2,4,hyper(2,3,hyper(2,4,1))))
       = hyper(2,4,hyper(2,4,hyper(2,3,2)))
       = hyper(2,4,hyper(2,4,2^2))
       = hyper(2,4,hyper(2,4,4))
       = hyper(2,4,hyper(2,3,hyper(2,4,3)))
       = hyper(2,4,hyper(2,3,hyper(2,3,hyper(2,4,2))))
       = hyper(2,4,hyper(2,3,hyper(2,3,hyper(2,3,hyper(2,4,1)))))
       = hyper(2,4,hyper(2,3,hyper(2,3,hyper(2,3,2))))
       = hyper(2,4,hyper(2,3,hyper(2,3,2^2)))
       = hyper(2,4,hyper(2,3,hyper(2,3,4)))
       = hyper(2,4,hyper(2,3,2^4))
       = hyper(2,4,hyper(2,3,16))
       = hyper(2,4,2^16)
       = hyper(2,4,65536)
       = 2^2^2^2^...^2

        = ...?

3^^^^3 = hyper(3,6,3)
       = hyper(3,5,hyper(3,6,2))
       = hyper(3,5,hyper(3,5,hyper(3,5,1)))
       = hyper(3,5,hyper(3,5,3))
       = hyper(3,5,hyper(3,4,hyper(3,5,2)))
       = hyper(3,5,hyper(3,4,hyper(3,4,hyper(3,5,1))))
       = hyper(3,5,hyper(3,4,hyper(3,4,3)))
       = hyper(3,5,hyper(3,4,hyper(3,3,hyper(3,4,2))))
       = hyper(3,5,hyper(3,4,hyper(3,3,hyper(3,3,hyper(3,4,1)))))
       = hyper(3,5,hyper(3,4,hyper(3,3,hyper(3,3,3))))
       = hyper(3,5,hyper(3,4,hyper(3,3,3^3)))
       = hyper(3,5,hyper(3,4,hyper(3,3,27)))
       = hyper(3,5,hyper(3,4,hyper(3^27)))
       = hyper(3,5,hyper(3,4,7625597484987))

       = ...!!?!

As for stuff like hyper(10,8,7) and hyper(456,10000003,121), forget it. You're going to be here for a million years evaluating these things. Finding a use for such gigantic numbers? Rare indeed.

But the hyper operator and the enormous numbers it generates also serve to illuminate some deeper mathematical truths. One is the "Frivolous Theorem of Arithmetic", which is a somewhat tongue-in-cheek but very accurate theorem, which states, bluntly, that the vast majority of natural numbers are very, very, very, very large. Consider any integer, N. Then - and it doesn't matter what N is, or what hoops you jumped through to construct it, invoking hyper operators, adding extra recursive arguments to generate larger numbers still, whatever - essentially all integers are larger than N. Infinity, a number bandied about so casually in mathematical circles - "One, two, three, infinity" - is in reality terrifyingly, incomprehensibly far beyond anything we can describe.

The other, rather less frivolous observation, is that for n>2, hyper(a,n,b) can only express numbers which are exact powers of a. In other words, the vast majority of integers are largely inexpressible in terms of hyper operators - or, indeed, any operators. Like a lift which will only stop at floor 100 or floor 1000, but nowhere in between, once hyper operators have got you as close as possible to your target, you will almost certainly still have a lot of walking to do. You can place upper and lower bounds on whatever number it is you are actually seeking, but to define every digit becomes impossible on paper once you exceed... oh, something well below 2^^5. In fact, regardless of how clever we make our notation, we will always be limited to using a strictly finite number of characters to express anything we wish to express on paper, and so the number of numbers we as a civilisation will ever be able to fully define, let alone express, over the course of our universe's lifetime, is likewise subject to a strict upper bound.

There are unthinkably gigantic deserts of integers which nobody will ever be able to see, use, describe or understand. The same applies to the even larger gulf of real numbers lying between any two integers.

So... yeah.