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> |
||