factors=:,@>@(*/&.>/)@(<@(1,*/\)/.~)@q:

factors each 10 47 360 2357047123200

+--------+----+------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------...

|1 5 2 10|1 47|1 5 3 15 9 45 2 10 6 30 18 90 4 20 12 60 36 180 8 40 24 120
72 360|1 11 7 77 5 55 35 385 25 275 175 1925 3 33 21 231 15 165 105 1155 75
825 525 5775 9 99 63 693 45 495 315 3465 225 2475 1575 17325 27 297 189
2079 135 1485 945 10395 675 7425 ...

+--------+----+------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------...

ts 'factors each 10 47 360 2357047123200'

1.93e_5 41792

On Sat, Apr 25, 2020 at 1:23 PM Skip Cave <[email protected]> wrote:

> So far, Roger's solution for counting the divisors of any integer using __
> q: seems the most efficient.
>
> * div=:3 :'*/>:{:__ q:y'*
>
>
> Test it:
>
>
> * >div each 10 47 360 2357047123200*
>
> *4 2 24 1620*
>
>
> * ts '>div each 10 47 360 2357047123200' *
>
> *2.89e_5 10944*
>
>
> Finding and listing the actual divisors is much more resource-intensive in
> both time and space.
>
>
> Skip Cave
> Cave Consulting LLC
>
>
> On Sat, Apr 25, 2020 at 5:47 AM 'Michael Day' via Programming <
> [email protected]> wrote:
>
> > Yes, that works as expected.
> >
> > BUT consider:
> >
> >     __ q: 360   NB. generate a table of primes and powers:
> > 2 3 5
> > 3 2 1
> >     ((3+3*>:i._10),:~p:i.10) NB. set up a bigger table
> >   2  3  5  7 11 13 17 19 23 29
> > 33 30 27 24 21 18 15 12  9  6
> >        NB. generate a number from it:
> >     __ q: N   NB. __ q: factors it quite fast
> >   2  3  5  7 11 13 17 19 23 29
> > 33 30 27 24 21 18 15 12  9  6
> >     _ q: N   NB. so does _ q:
> > 33 30 27 24 21 18 15 12 9 6
> >
> >     ts'__ q: N'
> > 0.0001254 45504
> >     ts'_ q: N'
> > 0.0001236 61696
> >     */>:_ q: N   NB. the number of divisors is quite large!
> > 4490309824000
> >
> >     */>: 33 30 27 24 21 18 15 12  9  6  NB. checking result
> > 4490309824000
> >
> > The performance of q: in its various guises will of course deteriorate
> > with the
> >
> > presence of large prime factors!
> >
> > Anyway,  it's advisable not to generate all divisors here unless you
> > really need them!
> >
> > Cheers,
> >
> > Mike
> >
> > Note - I've trimmed the history below here...
> >
> > On 25/04/2020 03:47, Devon McCormick wrote:
> > > I found this one in my bag of tricks:
> > >     allFactors=: */&>@{@((^ i.@>:)&.>/)@q:~&__
> > >     #,allFactors */p:i.10
> > > 1024
> > >
> > >
> > > On Fri, Apr 24, 2020 at 7:15 PM 'Mike Day' via Programming <
> > > [email protected]> wrote:
> > >
> > >> Numbers of divisors below, not the divisors themselves... the thread
> had
> > >> split! I was attempting to comment on Hauke Rehr’s post.
> > >> M
> > >>
> > >> Sent from my iPad
> > >>
> > >>> On 24 Apr 2020, at 23:52, 'Jon' via Programming <
> > >> [email protected]> wrote:
> > >>> This is missing a few divisors. It seems Skip's original method would
> > be
> > >> difficult to beat. It's O(n) in time and space. You could improve
> space
> > >> complexity by doing a simple loop, but as far as I can see there are
> no
> > >> shortcuts, and the best way is to just "brute force" it.
> > >>> ⁣Sent from BlueMail
> > >>>
> > >>>> On Apr 25, 2020, 5:35 AM, at 5:35 AM, 'Mike Day' via Programming <
> > >> [email protected]> wrote:
> > >>>> I think this is near to the approved way:
> > >>>>
> > >>>>   (*/"1@:>:@(_& q:))24 360 4711
> > >>>> 8 24 4
> > >>>>
> > >>>> Mike
> > >>>>
> > >>>> Sent from my iPad
> > >>>>
> > >>>>> On 24 Apr 2020, at 21:13, Hauke Rehr <[email protected]>
> wrote:
> > >>>>>
> > >>>>> I now have an answer for the number of results:
> > >>>>>
> > >>>>>   */ >: +/"1 (=/~ ~.) q: 4711
> > >>>>> 4
> > >>>>>   */ >: +/"1 (=/~ ~.) q: 42
> > >>>>> 8
> > >>>>>
> > >>>>> I hesitate using =/~ (it’s actually deprecated)
> > >>>>> but I wouldn’t know a better way in this case
> > >>>>>
> > >>>>>
> > >>>>>
> >
> > --
> > This email has been checked for viruses by Avast antivirus software.
> > https://www.avast.com/antivirus
> >
> > ----------------------------------------------------------------------
> > 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