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

Reply via email to