Factorial algorithm