# factorial / k_perm / choose

Definition: | atom res = factorial(atom n) -- or -- atom res = k_perm(integer n, k) -- or -- atom res = choose(integer n, k)
Description: | factorial(): standard iterative factorial function, with memoisation. k_perm(): standard partial permutations calculation (sequences without repetition). choose(): standard combinations calculation - choose k from n aka "n choose k"
pwa/p2js: | Supported.
Comments: | factorial() returns infinity for n>170 on 32-bit, and for n>1754 on 64-bit. Atoms on 32-bit are limited to 53 bits of precision, which means that the largest factorial which can be held exactly is 18 on 32-bit and 20 on 64-bit, anything above that up to the limits just given are approximations. There is also an mpz version, mpz_fac_ui(), with far higher limits, and perfect accuracy. The k_perm() routine calculates the result directly, rather than via the slightly less efficient (/limit-exceeding) way of using complete factorials, ie n(n-1)..(n-k-1) rather than n!/(n-k)!, and choose() simply divides that by k!.
Implementation: | See builtins\factorial.e (an autoinclude) for details of the actual implementation.
Example: |
    --            n : 0 1 2 3 4  5   6   7    8
    --  factorial(n): 1 1 2 6 24 120 720 5040 40320
See Also: | mpz_fac_ui, mpz_bin_uiui