I need to do a better job of proofreading my messages.

In this case I should have said "that implementation uses floating
point" or something like that.

Sorry about that,

-- 
Raul


On Thu, Jun 23, 2016 at 12:23 PM, Raul Miller <[email protected]> wrote:
> On a tangential note, there are faster ways of doing this.
>
> If you are not comfortable with the math, yourself, you might use oeis
> with some example values and find https://oeis.org/A000330 which
> suggests F=: 3 :'y*(1+y)*(1+2*y)%6'
>
> Is that an adequate solution?
>
>    F i.10
> 0 1 5 14 30 55 91 140 204 285
>    (+/@:([:*:1+i.))"0 (i.10)
> 0 1 5 14 30 55 91 140 204 285
>    (3) 6!:2 'F i.9999'
> 0.000323
>    F 9998
> 3.33183e11
>    x:F 9998
> 333183354999
>    (+/@:([:*:1+i.)) 9998
> 333183354999
>
> Seems to be ok, and quick.
>
> But, of course, that implementation floating point, which limits the
> range of values it can handle. And we are fast enough that we can
> switch to arbitrary precision integer arithmetic and still be faster
> than the brute force approach:
>
>     (3) 6!:2 'F x:i.9999'
> 0.042063
>
> I hope this helps...
>
> Thanks,
>
> --
> Raul
>
> On Wed, Jun 22, 2016 at 8:10 PM, Moon S <[email protected]> wrote:
>> I was searching integer solutions (k,m) for
>>    1^2 + 2^2 + ... + k^2 = m^2
>> and I found that one expression runs much faster than the other:
>>
>>    (#~(0=1|[:%:+/@:([:*:1+i.))"0) 2+i.9999
>> 24
>>    (#~(0=1|[:%:+/@:(*:&>:&i.))"0) 2+i.9999
>> 24
>>
>> The first one is ~100 times faster, and moreover, the expression with '+/'
>> is faster, then without it!
>>
>>    (3) 6!:2 '(+/@:([:*:1+i.))"0 (i.9999)'         NB. with +/ and fork
>> 0.143744
>>    (3) 6!:2 '(+/@:(*:&>:&i.))"0 (i.9999)'        NB. with +/ and train
>> 13.4614
>>
>>    (3) 6!:2 '([:*:1+i.)"0 (i.9999)'      NB. without +/
>> 0.608895
>>    (3) 6!:2 '(*:&>:&i.)"0 (i.9999)'
>> 14.0192
>>
>> As for '+/' I think the explanation is that no additional arrays are
>> created, the sums are just computed on the fly.
>> But the question remains, why the (equivalent) fork is so much faster than
>> the train?
>>
>> Hm, changing the long train to a shorter one with a fork helps:
>>    (3) 6!:2 '(*:&(1+i.))"0 (i.9999)'
>> 0.62027
>> So, what's the rule?
>>
>> ---
>> Georgiy Pruss
>> ----------------------------------------------------------------------
>> 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