Special factorials: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: changed personal tag)
(Add Seed7 example)
Line 1,221: Line 1,221:
the inverse factorial of 3628800 is: 10
the inverse factorial of 3628800 is: 10
the inverse factorial of 119 is: undefined
the inverse factorial of 119 is: undefined
</pre>

=={{header|Seed7}}==
<lang seed7>$ include "seed7_05.s7i";
include "bigint.s7i";

const func bigInteger: superfactorial (in bigInteger: limit) is func
result
var bigInteger: product is 1_;
local
var bigInteger: k is 0_;
begin
for k range 1_ to limit do
product *:= !k; # prefix ! calculates the factorial in Seed7
end for;
end func;

const func bigInteger: hyperfactorial (in bigInteger: limit) is func
result
var bigInteger: product is 1_;
local
var bigInteger: k is 0_;
begin
for k range 1_ to limit do
product *:= k ** ord(k);
end for;
end func;

const func bigInteger: alternating (in bigInteger: limit) is func
result
var bigInteger: sum is 0_;
local
var bigInteger: i is 0_;
begin
for i range 1_ to limit do
sum +:= (-1_) ** ord(limit - i) * !i;
end for;
end func;

const func bigInteger: exponential (in bigInteger: limit) is func
result
var bigInteger: pow is 0_;
local
var bigInteger: n is 0_;
begin
for n range 1_ to limit do
pow := n ** ord(pow);
end for;
end func;

const func integer: invFactorial (in integer: n) is func
result
var integer: r is 0;
local
var integer: a is 1;
var integer: b is 1;
begin
if n <> 1 then
while n > a do
incr(b);
a *:= b;
end while;
if a = n then
r := b;
else
r := -1;
end if;
end if;
end func;

const proc: show (in bigInteger: limit, inout bigInteger: aVariable,
ref func bigInteger: anExpression) is func

begin
for aVariable range 0_ to limit do
write(anExpression <& " ");
end for;
writeln; writeln;
end func;

const proc: main is func
local
var bigInteger: x is 0_;
var integer: n is 0;
begin
writeln("First 10 superfactorials:");
show(9_, x, superfactorial(x));
writeln("First 10 hyperfactorials:");
show(9_, x, hyperfactorial(x));
writeln("First 10 alternating factorials:");
show(9_, x, alternating(x));
writeln("First 5 exponential factorials:");
show(4_, x, exponential(x));
for n range [] (1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 119) do
writeln("invFactorial(" <& n <& ") = " <& invFactorial(n));
end for;
end func;</lang>
{{out}}
<pre>
First 10 superfactorials:
1 1 2 12 288 34560 24883200 125411328000 5056584744960000 1834933472251084800000

First 10 hyperfactorials:
1 1 4 108 27648 86400000 4031078400000 3319766398771200000 55696437941726556979200000 21577941222941856209168026828800000

First 10 alternating factorials:
0 1 1 5 19 101 619 4421 35899 326981

First 5 exponential factorials:
0 1 2 9 262144

invFactorial(1) = 0
invFactorial(2) = 2
invFactorial(6) = 3
invFactorial(24) = 4
invFactorial(120) = 5
invFactorial(720) = 6
invFactorial(5040) = 7
invFactorial(40320) = 8
invFactorial(362880) = 9
invFactorial(3628800) = 10
invFactorial(119) = -1
</pre>
</pre>