I would rather name lngamma as lnfactorial since,
^lngamma("0) 0 1 2 3 4 5
1 1 2 6 24 120
Be that as it may, Roger’s approach is very neat as opposed to,
LogFact=. ^.@:!`((((2 %~ ^. o. 2) + (-&0.5 * ^.) + -@:] + %@:(12&*)) +
%@:(360 * ^&3) + %@:(1260 * ^&5))@:>:)@.(170&<)"0
55 Wrap 'LogFact'
^.@:!`(((0.91893853320467267 + (-&0.5 * ^.) + -@:] + %@
:(12&*)) + %@:(360 * ^&3) + %@:(1260 * ^&5))@:>:)@.(170
&<)"0
However, I could not resist comparing their performance,
(lngamma -: LogFact) 1111.1
1
st=. (, */&.:>@:(1 2&{))@:(] ; 7!:2@:] ; 6!:2)
111 st&> 'lngamma 1111.1' ; 'LogFact 1111.1'
┌────────────────┬─────┬──────────┬─────────┐
│lngamma 1111.1│34944│3.61106e_5│1.26185 │
├────────────────┼─────┼──────────┼─────────┤
│LogFact 1111.1│2944 │1.3729e_5 │0.0404183│
└────────────────┴─────┴──────────┴─────────┘
111 st&> 'lngamma 11111.1' ; 'LogFact 11111.1'
┌────────────────┬──────┬───────────┬─────────┐
│lngamma 11111.1│264320│0.000197226│52.1308 │
├────────────────┼──────┼───────────┼─────────┤
│LogFact 11111.1│2944 │5.70576e_6 │0.0167978│
└────────────────┴──────┴───────────┴─────────┘
111 st&> 'lngamma 111111.1' ; 'LogFact 111111.1'
┌────────────────┬───────┬──────────┬─────────┐
│lngamma 111111.1│2099328│0.00184993│3883.61 │
├────────────────┼───────┼──────────┼─────────┤
│LogFact 111111.1│2944 │5.92946e_6│0.0174563│
└────────────────┴───────┴──────────┴─────────┘
Nevertheless, I favor neatness over performance when posting to Rosetta
Code.
On Wed, Jun 10, 2015 at 10:24 AM, Raul Miller <[email protected]> wrote:
> Ohh, that is really nice.
>
> Or, converted to tacit:
>
> lngamma=: ^.@!@(1 | ]) + +/@:^.@(1 + 1&| + i.@<.)
>
> Thanks!
>
> --
> Raul
>
>
> On Wed, Jun 10, 2015 at 10:15 AM, Roger Hui <[email protected]>
> wrote:
> > For non-negative real x, !x can be computed as (!1|x)**/(1+1|x)+i.<.x,
> > therefore ^.x is ^. of the long expression, which is
> > (^.!1|x)++/^.(1+1|x)+i.<.x . For example:
> >
> > x=: 4.75
> > !x
> > 78.7845
> > (!1|x)**/(1+1|x)+i.<.x
> > 78.7845
> >
> > ^.!x
> > 4.36672
> > (^.!1|x)++/^.(1+1|x)+i.<.x
> > 4.36672
> >
> > x=: 140.23
> > ^.!x
> > 556.358
> > (^.!1|x)++/^.(1+1|x)+i.<.x
> > 556.358
> >
> > Works for non-negative integers:
> >
> > x=: 10
> > ^.!x
> > 15.1044
> > (^.!1|x)++/^.(1+1|x)+i.<.x
> > 15.1044
> >
> > x=: 0
> > ^.!x
> > 0
> > (^.!1|x)++/^.(1+1|x)+i.<.x
> > 0
> >
> >
> >
> > On Wed, Jun 10, 2015 at 6:36 AM, Raul Miller <[email protected]>
> wrote:
> >
> >> Yes.
> >>
> >> Motivation is this rosettacode task:
> >> http://rosettacode.org/wiki/Calculate_P-Value
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >> On Wed, Jun 10, 2015 at 9:25 AM, Roger Hui <[email protected]>
> >> wrote:
> >> > Can the argument be other than positive integers?
> >> >
> >> > On Wed, Jun 10, 2015 at 6:22 AM, Raul Miller <[email protected]>
> >> wrote:
> >> >
> >> >> Does anyone have an implementation of ^.@! which will work for
> >> >> moderately large values (like 1000)?
> >> >>
> >> >> Thanks,
> >> >>
> >> >> --
> >> >> Raul
> >> >>
> ----------------------------------------------------------------------
> >> >> For information about J forums see
> http://www.jsoftware.com/forums.htm
> >> >>
> >> > ----------------------------------------------------------------------
> >> > For information about J forums see
> http://www.jsoftware.com/forums.htm
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> >>
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm