# General tetrahedral numbers

1, 1, 1, 1, 1, …

Taking the partial sums of this sequence gives consecutive numbers. That is, the nth number of the new series is the sum of the first n terms of the previous series.

1, 2, 3, 4, 5, …

If we take partial sums again, we get the triangular numbers.

1, 3, 6, 10, 15, …

They’re called triangle numbers because if we arrange coins in a triangle, with n on a side, the total number of coins is the nth triangular number.

If we repeat the process again, we get the tetrahedral numbers.

1, 4, 10, 20, 35, …

The nth tetrahedral number is the number of cannonballs is a tetrahedral stack, with each layer of the stack being a triangle.

We can produce the examples above in Python using the `cumsum` (cumulative sum) function on NumPy arrays.

```    >>> import numpy as np
>>> x = np.ones(5, int)
>>> x
array([1, 1, 1, 1, 1])
>>> x.cumsum()
array([1, 2, 3, 4, 5])
>>> x.cumsum().cumsum()
array([ 1, 3, 6, 10, 15])
>>> x.cumsum().cumsum().cumsum()
array([ 1, 4, 10, 20, 35])
```

We could continue this further, taking tetrahedral numbers of degree k. The sequences above could be called the tetrahedral numbers of degree k for k = 0, 1, 2, and 3.

Here’s Python code to find the nth tetrahedral number of a given dimension.

```    def tetrahedral(n, dim):
x = np.ones(n, int)
for _ in range(dim):
x = x.cumsum()
return x[-1]
```

It turns out that and so we could rewrite the code above more simply as

```    from math import comb

def tetrahedral(n, dim):
return comb(n + dim - 1, dim)
```