# Hyperfactorial in Java

Hyperfactorial of a number is the outcome of multiplying a given number of continuous numbers from 1 to that number, where each number is raised to its power.

Mathematically,

Thus,

H(1) = 1 ^ 1 = 1

H(2) = 1 ^ 1 × 2 ^ 2 = 1 × 4 = 4

H(3) = 1 ^ 1 × 2 ^ 2 × 3 ^ 3 = 1 × 4 × 27 = 108

H(4) = 1 ^ 1 × 2 ^ 2 × 3 ^ 3 × 4 ^ 4 = 1 × 4 × 27 × 256 = 27648

H(5) = 1 ^ 1 × 2 ^ 2 × 3 ^ 3 × 4 ^ 4 × 5 ^ 5 = 1 × 4 × 27 × 256 × 3125 = 86400000

## Java Program to Find the Hyperfactorial Number

The following program uses the mathematical formula to find the Hyperfactorial numbers.

FileName: HyperFactorialNumber.java

Output:

```The first 5 HyperFactorial numbers are:
1 4 108 27648 86400000
```

To find each hyperfactorial number, the above program is taking O(n ^ 2) time. We can do the optimization to reduce the time complexity. Consider the following program.

FileName: HyperFactorialNumber1.java

Output:

```The first 5 HyperFactorial numbers are:
1 4 108 27648 86400000
```

The findPow() method has the time complexity of O(log(n)), and this method has been called by a for-loop that runs with the time complexity of O(n). Thus, the total time complexity is O(nlog(n)), which is better than the previous code.

## Finding Hyperfactorial Number Using Recursion

Using recursion also, one can find the HyperFactorial numbers. The recursive formula to find the hyperfactorial number is:

H(1) = 1

H(p) = H(p - 1) × p ^ p, where p >= 2

Thus,

H(2) = H(2 - 1) × 2 ^ 2 = H(1) × 4 = 1 × 4 = 4

H(3) = H(3 - 1) × 3 ^ 3 = H(2) × 27 = 4 × 27 = 108

H(4) = H(4 - 1) × 4 ^ 4 = H(3) × 256 = 108 × 256 = 27648

H(5) = H(5 - 1) × 5 ^ 5 = H(4) × 15625 = 27648 × 15625 = 86400000

Let's translate the above recursive formula into the Java code.

FileName: HyperFactorialNumber2.java

Output:

```The first 5 HyperFactorial numbers are:
1 4 108 27648 86400000
```

### Feedback   