Normal numbers can be uniquely expressed as powers of 10. For example the number 7246 can be expressed as (7 2 4 6) = (7 * 10^3) + (2 * 10^2) + (4 * 10^1) + (6 * 10^0). Normal numbers can also be uniquely expressed as powers of 2, for example, 23 can be expressed as (1 0 1 1) = (1 * 2^4) + (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0).
Now recall that the factorial of some number k is k * (k-1) * (k-2) * . . . * 1. So factorial(5), usually abbreviated as 5! is 5 * 4 * 3 * 2 * 1 = 120. Somewhat surprisingly, numbers can be expressed as the sum of factorials. For example, the number 1047 can be expressed as (1 2 3 2 1 1 0):
(1 * 6!) + (2 * 5!) + (3 * 4!) + (2 * 3!) + (1 * 2!) + (1 * 1!) =
(1 * 720) + (2 * 120) + (3 * 24) + (2 * 6) + (1 * 2) + (1 * 1) =
720 + 240 + 72 + 12 + 2 + 1 =
1047
Here is placed a dummy 0 value at the right-most position. The representation of a number n as the sum of factorials is called the factoradic of n. By themselves factoradics are interesting by not particularly useful. But, it turns out that the factoradic of a number n maps directly to the nth permutation of n items. This allows arbitrary permutations to be computed extremely quickly.
Listed below is some demo C# language code to illustrate basic factoradic concepts. The code uses the idea of ‘nits’ (n-ary digits) to stand for how many factoradic digits to use. The code also places a dummy 0 value in the right-most position — this is useful when working with permutations and to account for the fact that both 1! and 0! equal 1 by definition.
using System;
namespace Factoradic
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\nBegin factoradic demo\n");
int nits = 9; // 'nits' is n-ary digits = how many places
int n = 1047;
int[] factoradic = IntToFactoradic(n, nits);
Console.WriteLine("Factoradic of " + n +
" is: " + FactoradicAsString(factoradic));
Console.WriteLine("");
int f = FactoradicToInt(factoradic, nits);
Console.WriteLine("Value of factoradic " +
FactoradicAsString(factoradic) + " is: " + f);
Console.WriteLine("\nEnd demo\n");
Console.ReadLine(); }
public static int FactoradicToInt(int[] factoradic, int nits)
{
int result = 0;
for (int i = 0; i < factoradic.Length; ++i)
{
int f = Factorial(nits - 1 - i);
int v = f * factoradic[i];
result = result + v;
}
return result;
}
public static int Factorial(int n)
{
int ans = 1;
for (int i = 1; i <e; n; ++i)
ans = ans * i;
return ans;
}
public static int[] IntToFactoradic(int n, int nits)
{
int[] factoradic = new int[nits];
for (int j = 1; j <e; nits; ++j)
{
factoradic[nits - j] = n % j;
n /= j;
}
return factoradic;
}
public static string FactoradicAsString(int[] factoradic)
{
string s = "";
for (int i = 0; i < factoradic.Length; ++i)
s += factoradic[i] + " ";
return s;
}
}
}

.NET Test Automation Recipes
Software Testing
SciPy Programming Succinctly
Keras Succinctly
R Programming
2026 Visual Studio Live
2025 Summer MLADS Conference
2025 DevIntersection Conference
2025 Machine Learning Week
2025 Ai4 Conference
2025 G2E Conference
2025 iSC West Conference
You must be logged in to post a comment.