Here's the solution I ended up using:

_&q:^:_1 >./ _ q: >: i. 10000x

Just factorize to prime exponents representation, find maximums and convert
back from prime exponent representation.

On Sun, Mar 10, 2019 at 2:35 PM Raul Miller <rauldmil...@gmail.com> wrote:

> J's extended precision integer implementation is part of it. But
> floating point numbers don't really work for this kind of problem for
> anything longer than i.11
>
> But, also, I imagine a part of this also might be that Haskell has
> optimizations which improve performance of this kind of problem, which
> we don't have in J.
>
> Here's a J approach that gets the solution to this kind of problem a bit
> faster:
>
> lcmseq=:3 :0
>   primes=. i.&.(p:inv) y
>   maxsq=. 1+primes I.%:y
>   */primes^x:1>.(#primes){.<.(maxsq{.primes)^.y
> )
>
>    lcmseq 100000x
>
> 6952838362417071970003075865264183883398742917680351135360275375615041442175021237506257986828602047763612877697876454892733660081058707575359683162985199273472095475166897891861381578830560627099383483382709560516260628624180504874681127372319705939469099...
>    6!:2'lcmseq 100000x'
> 0.398073
>
> I hope this helps,
>
> --
> Raul
>
> --
> Raul
>
> On Sun, Mar 10, 2019 at 5:10 PM james faure <james.fa...@epitech.eu>
> wrote:
> >
> > That, I suspect, can be blamed mostly on the abysmally slow extended
> precision integers in J, and the fact that *. must manipulate these
> extended precision integers more often than other verbs.
> >
> > Indeed, If you remove the 'x', it runs extremely fast.
> > ________________________________
> > From: Programming <programming-boun...@forums.jsoftware.com> on behalf
> of Eugene Nonko <eno...@gmail.com>
> > Sent: Sunday, March 10, 2019 9:00 PM
> > To: programm...@jsoftware.com
> > Subject: [Jprogramming] LCM performance
> >
> > I need to find the smallest number that divides all numbers from 1 to n.
> > The solution, of course is this:
> >
> > *./ >: i. n
> >
> > What I don't understand is why this solution seems to scale so poorly:
> >
> >    6!:2 '*./ >: i.10000x'
> > 0.326128
> >    6!:2 '*./ >: i.11000x'
> > 1.00384
> >    6!:2 '*./ >: i.12000x'
> > 4.133
> >    6!:2 '*./ >: i.13000x'
> > 11.8082
> >
> > When I perform similar calculation in Haskell it produces result in
> > negligible time, even when n = 100,000.
> >
> > λ: foldr1 lcm [1 .. 100000]
> > 695283836241707197000307586...
> >
> > If I use a verb other than *. it runs very quickly, as expected.
> >
> > What's so special about LCM?
> >
> > Thanks,
> > Eugene
> > ----------------------------------------------------------------------
> > 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