Start with a list of ones:
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)