Special factorials: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: eliminated the need for abutment.)
(→‎{{header|Wren}}: More efficient.)
Line 247: Line 247:
<lang ecmascript>import "/big" for BigInt
<lang ecmascript>import "/big" for BigInt
import "/fmt" for Fmt
import "/fmt" for Fmt

var f = Fn.new { |n|
if (n < 2) return BigInt.one
var fact = BigInt.one
for (i in 2..n) fact = fact * i
return fact
}


var sf = Fn.new { |n|
var sf = Fn.new { |n|
if (n < 2) return BigInt.one
if (n < 2) return BigInt.one
var sfact = BigInt.one
var sfact = BigInt.one
for (i in 2..n) sfact = sfact * f.call(i)
var fact = BigInt.one
for (i in 2..n) {
fact = fact * i
sfact = sfact * fact
}
return sfact
return sfact
}
}
Line 272: Line 269:
if (n < 1) return BigInt.zero
if (n < 1) return BigInt.zero
var afact = BigInt.zero
var afact = BigInt.zero
var fact = BigInt.one
var sign = (n%2 == 0) ? -1 : 1
var sign = (n%2 == 0) ? -1 : 1
for (i in 1..n) {
for (i in 1..n) {
afact = afact + f.call(i) * sign
fact = fact * i
afact = afact + fact * sign
sign = -sign
sign = -sign
}
}
Line 288: Line 287:
var rf = Fn.new { |n|
var rf = Fn.new { |n|
var i = 0
var i = 0
var fact = BigInt.one
while (true) {
while (true) {
var fact = f.call(i)
if (fact == n) return i
if (fact == n) return i
if (fact > n) return "none"
if (fact > n) return "none"
i = i + 1
i = i + 1
fact = fact * i
}
}
}
}