So I guess the best way to calculate lngamma is more like this: lngamma=: ^.@!@<:`(^.@!@(1 | ]) + +/@:^.@(1 + 1&| + i.@<.)@<:)@.(1&<:)"0
Ah well, the prior elegance would be nice, but I guess this works... Thanks, -- Raul On Fri, Jul 3, 2015 at 3:27 AM, Raul Miller <[email protected]> wrote: > Hmm... except this doesn't work for values less than 1. And that > relates back to my error in thinking - I was talking in terms of ! and > Roger gave me an answer in that form. But I it's lngamma which needs > to support positive values - so for ! the values can be between _1 and > 0. > > :/ > > -- > Raul > > > On Fri, Jul 3, 2015 at 1:44 AM, Raul Miller <[email protected]> wrote: >> Just so I can find this easily, next time I am searching for it - yes, >> you are right. >> >> Here's a properly labeled and implemented lngamma: >> >> lngamma=: ^.@!@(1 | ]) + +/@:^.@(1 + 1&| + i.@<.)@<: >> >> Thanks, >> >> -- >> Raul >> >> On Wed, Jun 10, 2015 at 5:43 PM, Jose Mario Quintana >> <[email protected]> wrote: >>> 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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
