# hyperoperate

This module exports the hyperoperation function. This recursive function generalises the binary operations of addition (*n* = 1), multiplication (*n* = 2) and exponentiation (*n* = 3) to arbitrary non-negative *n* (tetration, pentation, hexation, ...)

H(0,a,b) =b+ 1

H(1,a, 0) =a

H(2,a, 0) = 0

H(n,a, 0) = 1

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

`H`

accepts only non-negative integers `n`

, `a`

and `b`

.

Note that for the purposes of this module, 0 to the power of 0 is 1.

## Installation

`npm install hyperoperate`

## Usage

```
const H = require('hyperoperate')
// n = 0: successor (`a` is ignored)
H(0, 1000, 3) // 4
// n = 1: addition
H(1, 33, 44) // 77
// n = 2: multiplication
H(2, 6, 7) // 42
// n = 3: exponentiation
H(3, 2, 10) // 1024
// n = 4: tetration
H(4, 3, 3) // 3^^3 = 3^3^3 = 7625597484987
// n = 5: pentation
H(5, 2, 3) // 2^^^3 = 2^^2^^2 = 2^^4 = 2^2^2^2 = 65536
// and so on...
```

The result is rounded to the nearest JavaScript number. If the result is too large to express as a JavaScript number, `Infinity`

is returned.

`hyperoperate`

will also accept a trio of `BigInt`

s. In this case, the return value is also a `BigInt`

:

`H(4n, 5n, 3n) // 5^^3 = 5^5^5 = 5^3125 = 1911...03125n`

`hyperoperate`

throws an exception if passed a mixture of regular JavaScript numbers and `BigInt`

s. If the result is too large to express as a `BigInt`

, a `RangeError`

is thrown.