1 ! Copyright (C) 2013 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: combinators combinators.short-circuit inverse kernel
5 math math.functions math.primes ranges sequences ;
9 MEMO: factorial ( n -- n! )
10 dup 1 > [ [1..b] product ] [ drop 1 ] if ;
14 : factorials ( n -- seq )
15 1 swap [0..b] [ dup 1 > [ * ] [ drop ] if dup ] map nip ;
17 MEMO: double-factorial ( n -- n!! )
18 dup [ even? ] [ 0 < ] bi [
20 2 + -1 swap -2 <range> product recip
23 2 3 ? swap 2 <range> product
26 ALIAS: n!! double-factorial
28 : factorial/ ( n k -- n!/k! )
30 { [ dup 1 <= ] [ drop factorial ] }
31 { [ over 1 <= ] [ nip factorial recip ] }
33 2dup < [ t ] [ swap f ] if
34 [ (a..b] product ] dip [ recip ] when
38 : rising-factorial ( x n -- x(n) )
43 dup 0 < [ neg [ + ] keep t ] [ f ] if
44 [ dupd + [a..b) product ] dip
49 ALIAS: pochhammer rising-factorial
51 : falling-factorial ( x n -- (x)n )
56 dup 0 < [ neg [ + ] keep t ] [ f ] if
57 [ dupd - swap (a..b] product ] dip
62 : factorial-power ( x n h -- (x)n(h) )
64 { 1 [ falling-factorial ] }
68 [ [ nip + ] [ swap neg * + ] 3bi ] keep
71 neg [ [ dupd 1 - ] [ * ] bi* + ] keep
77 : primorial ( n -- p# )
78 dup 0 > [ nprimes product ] [ drop 1 ] if ;
80 : multifactorial ( n k -- n!(k) )
82 dupd [ - ] keep multifactorial *
83 ] [ 2drop 1 ] if ; inline recursive
85 : quadruple-factorial ( n -- m )
86 [ 2 * ] keep factorial/ ;
88 : super-factorial ( n -- m )
90 [1..b] [ factorial ] [ * ] map-reduce
93 : hyper-factorial ( n -- m )
95 [1..b] [ dup ^ ] [ * ] map-reduce
98 : alternating-factorial ( n -- m )
100 [ [1..b] ] keep even? '[
101 [ factorial ] [ odd? _ = ] bi [ neg ] when
105 : exponential-factorial ( n -- m )
106 dup 1 > [ [1..b] 1 [ swap ^ ] reduce ] [ drop 1 ] if ;
110 : -prime? ( n quot: ( n -- m ) -- ? )
111 [ 1 1 [ pick over - 1 <= ] ] dip
112 '[ drop [ 1 + ] _ bi ] until nip - abs 1 = ; inline
116 : factorial-prime? ( n -- ? )
117 { [ prime? ] [ [ factorial ] -prime? ] } 1&& ;
119 : primorial-prime? ( n -- ? )
120 { [ prime? ] [ 2 > ] [ [ primorial ] -prime? ] } 1&& ;
122 : reverse-factorial ( m -- n )
123 1 1 [ 2over > ] [ 1 + [ * ] keep ] while [ = ] dip and ;
125 \ factorial [ reverse-factorial ] define-inverse