Multifactorial
You are encouraged to solve this task according to the task description, using any language you may know.
The factorial of a number, written as is defined as
A generalization of this is the multifactorials where:
- Where the products are for positive integers.
If we define the degree of the multifactorial as the difference in successive terms that are multiplied together for a multifactorial (The number of exclamation marks) then the task is to
- Write a function that given n and the degree, calculates the multifactorial.
- Use the function to generate and display here a table of the first 1..10 members of the first five degrees of multifactorial.
Note: The wikipedia entry on multifactorials gives a different formula. This task uses the Wolfram mathworld definition.
Ada
<lang Ada>with Ada.Text_IO; use Ada.Text_IO; procedure Mfact is
function MultiFact (num : Natural; deg : Positive) return Natural is Result, N : Integer := num; begin if N = 0 then return 1; end if; loop N := N - deg; exit when N <= 0; Result := Result * N; end loop; return Result; end MultiFact;
begin
for deg in 1..5 loop Put("Degree"& Integer'Image(deg) &":"); for num in 1..10 loop Put(Integer'Image(MultiFact(num,deg))); end loop; New_line; end loop;
end Mfact;</lang>
- Output:
Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50
C
<lang c> /* Include statements and constant definitions */
- include <stdio.h>
- define HIGHEST_DEGREE 5
- define LARGEST_NUMBER 10
/* Recursive implementation of multifactorial function */ int multifact(int n, int deg){
return n <= deg ? n : n * multifact(n - deg, deg);
}
/* Iterative implementation of multifactorial function */ int multifact_i(int n, int deg){
int result = n; while (n >= deg + 1){ result *= (n - deg); n -= deg; } return result;
}
/* Test function to print out multifactorials */ int main(void){
int i, j; for (i = 1; i <= HIGHEST_DEGREE; i++){ printf("\nDegree %d: ", i); for (j = 1; j <= LARGEST_NUMBER; j++){ printf("%d ", multifact(j, i)); } }
} </lang>
- Output:
Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50
C#
<lang csharp>namespace RosettaCode.Multifactorial {
using System; using System.Linq;
internal static class Program { private static void Main() { Console.WriteLine(string.Join(Environment.NewLine, Enumerable.Range(1, 5) .Select( degree => string.Join(" ", Enumerable.Range(1, 10) .Select( number => Multifactorial(number, degree)))))); }
private static int Multifactorial(int number, int degree) { if (degree < 1) { throw new ArgumentOutOfRangeException("degree"); }
var count = 1 + (number - 1) / degree; if (count < 1) { throw new ArgumentOutOfRangeException("number"); }
return Enumerable.Range(0, count) .Aggregate(1, (accumulator, index) => accumulator * (number - degree * index)); } }
}</lang> Output:
1 2 6 24 120 720 5040 40320 362880 3628800 1 2 3 8 15 48 105 384 945 3840 1 2 3 4 10 18 28 80 162 280 1 2 3 4 5 12 21 32 45 120 1 2 3 4 5 6 14 24 36 50
C++
<lang cpp>
- include <algorithm>
- include <iostream>
- include <iterator>
/*Generate multifactorials to 9
Nigel_Galloway November 14th., 2012.
- /
int main(void) {
for (int g = 1; g < 10; g++) { int v[11], n=0; generate_n(std::ostream_iterator<int>(std::cout, " "), 10, [&]{n++; return v[n]=(g<n)? v[n-g]*n : n;}); std::cout << std::endl; } return 0;
} </lang>
- Output:
1 2 6 24 120 720 5040 40320 362880 3628800 1 2 3 8 15 48 105 384 945 3840 1 2 3 4 10 18 28 80 162 280 1 2 3 4 5 12 21 32 45 120 1 2 3 4 5 6 14 24 36 50 1 2 3 4 5 6 7 16 27 40 1 2 3 4 5 6 7 8 18 30 1 2 3 4 5 6 7 8 9 20 1 2 3 4 5 6 7 8 9 10
Clojure
<lang Clojure>(defn !! [m n]
(apply * (take-while pos? (iterate #(- % m) n))))
(doseq [m (range 1 6)]
(prn m (map #(!! m %) (range 1 11))))</lang>
- Output:
1 (1 2 6 24 120 720 5040 40320 362880 3628800) 2 (1 2 3 8 15 48 105 384 945 3840) 3 (1 2 3 4 10 18 28 80 162 280) 4 (1 2 3 4 5 12 21 32 45 120) 5 (1 2 3 4 5 6 14 24 36 50)
Common Lisp
<lang lisp> (defun mfac (n m)
(reduce #'* (loop for i from n downto 1 by m collect i)))
(loop for i from 1 to 10
do (format t "~2@a: ~{~a~^ ~}~%" i (loop for j from 1 to 10 collect (mfac j i))))
</lang>
- Output:
1: 1 2 6 24 120 720 5040 40320 362880 3628800 2: 1 2 3 8 15 48 105 384 945 3840 3: 1 2 3 4 10 18 28 80 162 280 4: 1 2 3 4 5 12 21 32 45 120 5: 1 2 3 4 5 6 14 24 36 50 6: 1 2 3 4 5 6 7 16 27 40 7: 1 2 3 4 5 6 7 8 18 30 8: 1 2 3 4 5 6 7 8 9 20 9: 1 2 3 4 5 6 7 8 9 10 10: 1 2 3 4 5 6 7 8 9 10
D
<lang d>import std.stdio, std.algorithm, std.range;
T multifactorial(T=long)(in int n, in int m) /*pure*/ {
T one = 1; return reduce!q{a * b}(one, iota(n, 0, -m));
}
void main() {
foreach (m; 1 .. 11) writefln("%2d: %s", m, iota(1, 11) .map!(n => multifactorial(n, m))());
}</lang>
- Output:
1: 1 2 6 24 120 720 5040 40320 362880 3628800 2: 1 2 3 8 15 48 105 384 945 3840 3: 1 2 3 4 10 18 28 80 162 280 4: 1 2 3 4 5 12 21 32 45 120 5: 1 2 3 4 5 6 14 24 36 50 6: 1 2 3 4 5 6 7 16 27 40 7: 1 2 3 4 5 6 7 8 18 30 8: 1 2 3 4 5 6 7 8 9 20 9: 1 2 3 4 5 6 7 8 9 10 10: 1 2 3 4 5 6 7 8 9 10
Erlang
<lang erlang>-module(multifac). -compile(export_all).
multifac(N,D) ->
lists:foldl(fun (X,P) -> X * P end, 1, lists:seq(N,1,-D)).
main() ->
Ds = lists:seq(1,5), Ns = lists:seq(1,10), lists:foreach(fun (D) -> io:format("Degree ~b: ~p~n",[D, [ multifac(N,D) || N <- Ns]]) end, Ds).</lang>
- Output:
<lang erlang>5> multifac:main(). Degree 1: [1,2,6,24,120,720,5040,40320,362880,3628800] Degree 2: [1,2,3,8,15,48,105,384,945,3840] Degree 3: [1,2,3,4,10,18,28,80,162,280] Degree 4: [1,2,3,4,5,12,21,32,45,120] Degree 5: [1,2,3,4,5,6,14,24,36,50] ok</lang>
F#
<lang fsharp>let rec mfact d = function
| n when n <= d -> n | n -> n * mfact d (n-d)
[<EntryPoint>] let main argv =
let (|UInt|_|) = System.UInt32.TryParse >> function | true, v -> Some v | false, _ -> None let (maxDegree, maxN) = match argv with | [| UInt d; UInt n |] -> (int d, int n) | [| UInt d |] -> (int d, 10) | _ -> (5, 10) let showFor d = List.init maxN (fun i -> mfact d (i+1)) |> printfn "%i: %A" d ignore (List.init maxDegree (fun i -> showFor (i+1))) 0
</lang>
1: [1; 2; 6; 24; 120; 720; 5040; 40320; 362880; 3628800] 2: [1; 2; 3; 8; 15; 48; 105; 384; 945; 3840] 3: [1; 2; 3; 4; 10; 18; 28; 80; 162; 280] 4: [1; 2; 3; 4; 5; 12; 21; 32; 45; 120] 5: [1; 2; 3; 4; 5; 6; 14; 24; 36; 50]
GAP
<lang gap>MultiFactorial := function(n, k)
local r; r := 1; while n > 1 do r := r*n; n := n - k; od; return r;
end;
PrintArray(List([1 .. 10], n -> List([1 .. 5], k -> MultiFactorial(n, k)))); [ [ 1, 1, 1, 1, 1 ],
[ 2, 2, 2, 2, 2 ], [ 6, 3, 3, 3, 3 ], [ 24, 8, 4, 4, 4 ], [ 120, 15, 10, 5, 5 ], [ 720, 48, 18, 12, 6 ], [ 5040, 105, 28, 21, 14 ], [ 40320, 384, 80, 32, 24 ], [ 362880, 945, 162, 45, 36 ], [ 3628800, 3840, 280, 120, 50 ] ]</lang>
Go
<lang go>package main
import "fmt"
func multiFactorial(n, k int) int {
r := 1 for ; n > 1; n -= k { r *= n } return r
}
func main() {
for k := 1; k <= 5; k++ { fmt.Print("degree ", k, ":") for n := 1; n <= 10; n++ { fmt.Print(" ", multiFactorial(n, k)) } fmt.Println() }
}</lang>
- Output:
degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 degree 2: 1 2 3 8 15 48 105 384 945 3840 degree 3: 1 2 3 4 10 18 28 80 162 280 degree 4: 1 2 3 4 5 12 21 32 45 120 degree 5: 1 2 3 4 5 6 14 24 36 50
Haskell
<lang haskell>mulfac k = 1:s where s = [1 .. k] ++ zipWith (*) s [k+1..]
-- for single n mulfac1 k n = product [n, n-k .. 1]
main = mapM_ (print . take 10 . tail . mulfac) [1..5]</lang>
- Output:
[1,2,6,24,120,720,5040,40320,362880,3628800] [1,2,3,8,15,48,105,384,945,3840] [1,2,3,4,10,18,28,80,162,280] [1,2,3,4,5,12,21,32,45,120] [1,2,3,4,5,6,14,24,36,50]
J
<lang J>
NB. tacit implementation of the recursive c function NB. int multifact(int n,int deg){return n<=deg?n:n*multifact(n-deg,deg);}
multifact=: [`([ * - $: ])@.(<~) (a:,<' degree'),multifact table >:i.10
┌─────────┬──────────────────────────────────────┐ │ │ degree │ ├─────────┼──────────────────────────────────────┤ │multifact│ 1 2 3 4 5 6 7 8 9 10│ ├─────────┼──────────────────────────────────────┤ │ 1 │ 1 1 1 1 1 1 1 1 1 1│ │ 2 │ 2 2 2 2 2 2 2 2 2 2│ │ 3 │ 6 3 3 3 3 3 3 3 3 3│ │ 4 │ 24 8 4 4 4 4 4 4 4 4│ │ 5 │ 120 15 10 5 5 5 5 5 5 5│ │ 6 │ 720 48 18 12 6 6 6 6 6 6│ │ 7 │ 5040 105 28 21 14 7 7 7 7 7│ │ 8 │ 40320 384 80 32 24 16 8 8 8 8│ │ 9 │ 362880 945 162 45 36 27 18 9 9 9│ │10 │3628800 3840 280 120 50 40 30 20 10 10│ └─────────┴──────────────────────────────────────┘ </lang>
JavaScript
Iterative
<lang JavaScript> function multifact(n, deg){ var result = n; while (n >= deg + 1){ result *= (n - deg); n -= deg; } return result; } </lang>
Template:Test <lang JavaScript> function test (n, deg) { for (var i = 1; i <= deg; i ++) { var results = ; for (var j = 1; j <= n; j ++) { results += multifact(j, i) + ' '; } console.log('Degree ' + i + ': ' + results); } } </lang>
- Output:
<lang JavaScript> test(10, 5) Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50 </lang>
Recursive
<lang JavaScript> function multifact(n, deg){ return n <= deg ? n : n * multifact(n - deg, deg); } </lang>
Template:Test <lang JavaScript> function test (n, deg) { for (var i = 1; i <= deg; i ++) { var results = ; for (var j = 1; j <= n; j ++) { results += multifact(j, i) + ' '; } console.log('Degree ' + i + ': ' + results); } } </lang>
- Output:
<lang JavaScript> test(10, 5) Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50 </lang>
Mathematica
<lang perl6>Multifactorial[n_, m_] := Abs[ Apply[ Times, Range[-n, -1, m]]] Table[ Multifactorial[j, i], {i, 5}, {j, 10}] // TableForm</lang>
- Output:
1: 1 2 6 24 120 720 5040 40320 362880 3628800 2: 1 2 3 8 15 48 105 384 945 3840 3: 1 2 3 4 10 18 28 80 162 280 4: 1 2 3 4 5 12 21 32 45 120 5: 1 2 3 4 5 6 14 24 36 50
МК-61/52
<lang>П1 <-> П0 П2 ИП0 ИП1 1 + - x>=0 23 ИП2 ИП0 ИП1 - * П2 ИП0 ИП1 - П1 БП 04 ИП2 С/П</lang>
Instruction: number ^ degree В/О С/П
Objeck
<lang objeck> class Multifact {
function : MultiFact(n : Int, deg : Int) ~ Int { result := n; while (n >= deg + 1){ result *= (n - deg); n -= deg; };
return result; }
function : Main(args : String[]) ~ Nil { for (i := 1; i <= 5; i+=1;){ IO.Console->Print("Degree ")->Print(i)->Print(": "); for (j := 1; j <= 10; j+=1;){ IO.Console->Print(' ')->Print(MultiFact(j, i)); }; IO.Console->PrintLine(); }; }
} </lang>
Output:
Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50
PARI/GP
<lang parigp>fac(n,d)=prod(k=0,(n-1)\d,n-k*d) for(k=1,5,for(n=1,10,print1(fac(n,k)" "));print)</lang>
1 2 6 24 120 720 5040 40320 362880 3628800 1 2 3 8 15 48 105 384 945 3840 1 2 3 4 10 18 28 80 162 280 1 2 3 4 5 12 21 32 45 120 1 2 3 4 5 6 14 24 36 50
Perl
<lang perl>{ # <-- scoping the cache and bigint clause my @cache; use bigint; sub mfact { my ($s, $n) = @_; return 1 if $n <= 0; $cache[$s][$n] //= $n * mfact($s, $n - $s); } }
for my $s (1 .. 10) { print "step=$s: "; print join(" ", map(mfact($s, $_), 1 .. 10)), "\n"; }</lang>
- Output:
step=1: 1 2 6 24 120 720 5040 40320 362880 3628800 step=2: 1 2 3 8 15 48 105 384 945 3840 step=3: 1 2 3 4 10 18 28 80 162 280 step=4: 1 2 3 4 5 12 21 32 45 120 step=5: 1 2 3 4 5 6 14 24 36 50 step=6: 1 2 3 4 5 6 7 16 27 40 step=7: 1 2 3 4 5 6 7 8 18 30 step=8: 1 2 3 4 5 6 7 8 9 20 step=9: 1 2 3 4 5 6 7 8 9 10 step=10: 1 2 3 4 5 6 7 8 9 10
Perl 6
<lang perl6>sub mfact($n, :$degree = 1) { [*] $n, *-$degree ...^ * <= 0 }
for 1 .. 5 -> $degree {
say "$degree: ", map &mfact.assuming(:$degree), 1 .. 10;
}</lang>
- Output:
1: 1 2 6 24 120 720 5040 40320 362880 3628800 2: 1 2 3 8 15 48 105 384 945 3840 3: 1 2 3 4 10 18 28 80 162 280 4: 1 2 3 4 5 12 21 32 45 120 5: 1 2 3 4 5 6 14 24 36 50
PL/I
<lang> multi: procedure options (main); /* 29 October 2013 */
declare (i, j, n) fixed binary; declare text character (6) static initial ('n!!!!!');
do i = 1 to 5; put skip edit (substr(text, 1, i+1), '=' ) (A, COLUMN(8)); do n = 1 to 10; put edit ( trim( multifactorial(n,i) ) ) (X(1), A); end; end;
multifactorial: procedure (n, j) returns (fixed(15));
declare (n, j) fixed binary; declare f fixed (15), m fixed(15);
f, m = n; do while (m > j); f = f * (m-fixed(j)); m = m - j; end; return (f);
end multifactorial;
end multi; </lang> Output:
n! = 1 2 6 24 120 720 5040 40320 362880 3628800 n!! = 1 2 3 8 15 48 105 384 945 3840 n!!! = 1 2 3 4 10 18 28 80 162 280 n!!!! = 1 2 3 4 5 12 21 32 45 120 n!!!!! = 1 2 3 4 5 6 14 24 36 50
Python
Python: Iterative
<lang python>>>> from functools import reduce >>> from operator import mul >>> def mfac(n, m): return reduce(mul, range(n, 0, -m))
>>> for m in range(1, 11): print("%2i: %r" % (m, [mfac(n, m) for n in range(1, 11)]))
1: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] 2: [1, 2, 3, 8, 15, 48, 105, 384, 945, 3840] 3: [1, 2, 3, 4, 10, 18, 28, 80, 162, 280] 4: [1, 2, 3, 4, 5, 12, 21, 32, 45, 120] 5: [1, 2, 3, 4, 5, 6, 14, 24, 36, 50] 6: [1, 2, 3, 4, 5, 6, 7, 16, 27, 40] 7: [1, 2, 3, 4, 5, 6, 7, 8, 18, 30] 8: [1, 2, 3, 4, 5, 6, 7, 8, 9, 20] 9: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> </lang>
Python: Recursive
<lang python>>>> def mfac2(n, m): return n if n <= (m + 1) else n * mfac2(n - m, m)
>>> for m in range(1, 6): print("%2i: %r" % (m, [mfac2(n, m) for n in range(1, 11)]))
1: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] 2: [1, 2, 3, 8, 15, 48, 105, 384, 945, 3840] 3: [1, 2, 3, 4, 10, 18, 28, 80, 162, 280] 4: [1, 2, 3, 4, 5, 12, 21, 32, 45, 120] 5: [1, 2, 3, 4, 5, 6, 14, 24, 36, 50]
>>> </lang>
Racket
<lang racket>#lang racket
(define (multi-factorial-fn m)
(lambda (n) (let inner ((acc 1) (n n)) (if (<= n m) (* acc n) (inner (* acc n) (- n m))))))
- using (multi-factorial-fn m) as a first-class function
(for*/list ([m (in-range 1 (add1 5))] [mf-m (in-value (multi-factorial-fn m))])
(for/list ([n (in-range 1 (add1 10))]) (mf-m n)))
(define (multi-factorial m n) ((multi-factorial-fn m) n))
(for/list ([m (in-range 1 (add1 5))])
(for/list ([n (in-range 1 (add1 10))]) (multi-factorial m n)))</lang>
Output:
'((1 2 6 24 120 720 5040 40320 362880 3628800) (1 2 3 8 15 48 105 384 945 3840) (1 2 3 4 10 18 28 80 162 280) (1 2 3 4 5 12 21 32 45 120) (1 2 3 4 5 6 14 24 36 50)) '((1 2 6 24 120 720 5040 40320 362880 3628800) (1 2 3 8 15 48 105 384 945 3840) (1 2 3 4 10 18 28 80 162 280) (1 2 3 4 5 12 21 32 45 120) (1 2 3 4 5 6 14 24 36 50))
REXX
This version also handles zero as well as positive integers. <lang rexx>/*REXX pgm calculates K-fact (multifactorial) of non-negative integers.*/ numeric digits 1000 /*lets get ka-razy with precision*/ parse arg num deg . /*allow user to specify num & deg*/ if num== | num==',' then num=15 /*Not specified? Then use default*/ if deg== | deg==',' then deg=10 /* " " " " " */ say '═══showing multiple factorials (1 ──►' deg") for numbers 1 ──►" num say
do d=1 for deg /*the factorializing (º) of !'s. */ _= /*the list of factorials so far. */ do f=1 for num /* ◄── do a ! from 1 to num.*/ _=_ Kfact(f,d) /*construct a list of factorials.*/ end /*f*/ /*(above) D can default to 1.*/
say right('n'copies("!", d),1+deg) right('['d"]",2+length(num))':' _ end /*d*/
exit /*stick a fork in it, we're done.*/ /*──────────────────────────────────KFACT subroutine────────────────────*/ Kfact: procedure; !=1; do j=arg(1) to 2 by -word(arg(2) 1, 1)
!=!*j end /*j*/
return !</lang> output when using the default input:
═══showing multiple factorials (1 ──► 10) for numbers 1 ──► 15 n! [1]: 1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600 6227020800 87178291200 1307674368000 n!! [2]: 1 2 3 8 15 48 105 384 945 3840 10395 46080 135135 645120 2027025 n!!! [3]: 1 2 3 4 10 18 28 80 162 280 880 1944 3640 12320 29160 n!!!! [4]: 1 2 3 4 5 12 21 32 45 120 231 384 585 1680 3465 n!!!!! [5]: 1 2 3 4 5 6 14 24 36 50 66 168 312 504 750 n!!!!!! [6]: 1 2 3 4 5 6 7 16 27 40 55 72 91 224 405 n!!!!!!! [7]: 1 2 3 4 5 6 7 8 18 30 44 60 78 98 120 n!!!!!!!! [8]: 1 2 3 4 5 6 7 8 9 20 33 48 65 84 105 n!!!!!!!!! [9]: 1 2 3 4 5 6 7 8 9 10 22 36 52 70 90 n!!!!!!!!!! [10]: 1 2 3 4 5 6 7 8 9 10 11 24 39 56 75
Ruby
<lang ruby> def multifact(n, d)
n.step(1, -d).inject( :* )
end
(1..5).each {|d| puts "Degree #{d}: #{(1..10).map{|n| multifact(n, d)}.join "\t"}"} </lang> output
Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50
Tcl
<lang tcl>package require Tcl 8.6
proc mfact {n m} {
set mm [expr {-$m}] for {set r $n} {[incr n $mm] > 1} {set r [expr {$r * $n}]} {} return $r
}
foreach n {1 2 3 4 5 6 7 8 9 10} {
puts $n:[join [lmap m {1 2 3 4 5 6 7 8 9 10} {mfact $m $n}] ,]
}</lang>
- Output:
1:1,2,6,24,120,720,5040,40320,362880,3628800 2:1,2,3,8,15,48,105,384,945,3840 3:1,2,3,4,10,18,28,80,162,280 4:1,2,3,4,5,12,21,32,45,120 5:1,2,3,4,5,6,14,24,36,50 6:1,2,3,4,5,6,7,16,27,40 7:1,2,3,4,5,6,7,8,18,30 8:1,2,3,4,5,6,7,8,9,20 9:1,2,3,4,5,6,7,8,9,10 10:1,2,3,4,5,6,7,8,9,10
Wortel
<lang wortel>@let {
facd &[d n]?{<= n d n @prod@range[n 1 @-d]} l @to 10 ~@each @to 5 &n !console.log "Degree {n}: {@join ' ' !*\facd n l}"
}</lang> Output
Degree 1: 1 2 6 24 120 720 5040 40320 362880 3628800 Degree 2: 1 2 3 8 15 48 105 384 945 3840 Degree 3: 1 2 3 4 10 18 28 80 162 280 Degree 4: 1 2 3 4 5 12 21 32 45 120 Degree 5: 1 2 3 4 5 6 14 24 36 50
XPL0
<lang XPL0>code ChOut=8, CrLf=9, IntOut=11;
func MultiFac(N, D); \Return multifactorial of N in degree D int N, D; int F; [F:= 1; repeat F:= F*N;
N:= N-D;
until N <= 1; return F; ];
int I, J; \generate table of multifactorials for J:= 1 to 5 do
[for I:= 1 to 10 do [IntOut(0, MultiFac(I, J)); ChOut(0, 9\tab\)]; CrLf(0); ]</lang>
- Output:
1 2 6 24 120 720 5040 40320 362880 3628800 1 2 3 8 15 48 105 384 945 3840 1 2 3 4 10 18 28 80 162 280 1 2 3 4 5 12 21 32 45 120 1 2 3 4 5 6 14 24 36 50