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

Reply via email to