Start with a list of ones:

1, 1, 1, 1, 1, …

Taking the partial sums of this sequence gives consecutive numbers. That is, the *n*th 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 *n*th triangular number.

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

1, 4, 10, 20, 35, …

The *n*th 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 *n*th 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)