Yes. :) When J provides a mechanism for something it is usually worth trying. Sometimes you can write something faster, but usually J's approach will be useful.
For example, in this case, consider this approach: thru=: <. + >:@>. i.@- <. biggap=: {~ 0 1 - [: (i. <./) 2 -/\ ] F=: [: thru/ 1 _1 + [: biggap <./ >. >./ <. thru&.(p:inv) There will be cases where another approach could be more efficient, but it performs reasonably well. Thanks, -- Raul On Sun, Sep 17, 2017 at 11:04 AM, Erling Hellenäs <erl...@erlinghellenas.se> wrote: > My first version easily handles 20 000 000. And I thought the second would > be faster. Lol. J seems to have a very efficient way to see if a number is a > prime. > > timespacex'2 f 20000000' > > 12.2883 5.36873e8 > > > /Erling > > > > On 2017-09-17 16:22, Erling Hellenäs wrote: >> >> It takes quite some time at 200000 and more. Due to PrimesUntil, it seems. >> >> timespacex'2 f 2000' >> >> 0.0121769 42240 >> >> timespacex'2 f 20000' >> >> 0.426833 533760 >> >> timespacex'2 f 200000' >> >> 30.0596 4.20378e6 >> >> timespacex'PrimesUntil 200000' >> >> 30.0592 4.19981e6 >> >> >> /Erling >> >> >> On 2017-09-17 16:05, Erling Hellenäs wrote: >>> >>> Hi Raul ! >>> >>> This is what happens when I run it in a clean JQT. I added a timespecex >>> call. Not sure what might happen for you. >>> >>> Cheers, >>> Erling >>> >>> Prime=: [: -. [: +./0 = [ | ] >>> >>> (,2) Prime 3 >>> >>> 1 >>> >>> NB. 1 >>> >>> 2 3 Prime 4 >>> >>> 0 >>> >>> NB. 0 >>> >>> 2 3 Prime 5 >>> >>> 1 >>> >>> NB. 1 >>> >>> 2 3 5 Prime 6 >>> >>> 0 >>> >>> NB. 0 >>> >>> PrimesUntil=: 3 : 0 >>> >>> primes=.i.0 >>> >>> n=. 2 + i. y - 1 >>> >>> for_i. n do. >>> >>> primes=.primes,(primes Prime i) # i >>> >>> end. >>> >>> primes >>> >>> ) >>> >>> PrimesUntil 5 >>> >>> 2 3 5 >>> >>> NB. 2 3 5 >>> >>> PrimesUntil 10 >>> >>> 2 3 5 7 >>> >>> NB. 2 3 5 7 >>> >>> PrimesUntil 11 >>> >>> 2 3 5 7 11 >>> >>> NB. 2 3 5 7 11 >>> >>> PrimesInRange=: 4 : 0 >>> >>> n=. PrimesUntil y >>> >>> (n >: x)# n >>> >>> ) >>> >>> 7 PrimesInRange 11 >>> >>> 7 11 >>> >>> NB. 7 11 >>> >>> 7 PrimesInRange 10 >>> >>> 7 >>> >>> NB. 7 >>> >>> 8 PrimesInRange 10 >>> >>> >>> NB. i.0 >>> >>> AddStartRangeIfNotThere=: (([ ~: 1 {. ]) # [) , ] >>> >>> 3 AddStartRangeIfNotThere 3 5 7 11 >>> >>> 3 5 7 11 >>> >>> NB. 3 5 7 11 >>> >>> 8 AddStartRangeIfNotThere i.0 >>> >>> 8 >>> >>> NB. 8 >>> >>> AddEndRangeIfNotThere=: ] , ([ ~: _1 {. ]) # [ >>> >>> 11 AddEndRangeIfNotThere 3 5 7 11 >>> >>> 3 5 7 11 >>> >>> NB. 3 5 7 11 >>> >>> 10 AddEndRangeIfNotThere 8 >>> >>> 8 10 >>> >>> NB. 8 10 >>> >>> SequenceLengths=: 1 + (1 }. ]) - _1 }. ] >>> >>> SequenceLengths 3 5 7 11 >>> >>> 3 3 5 >>> >>> NB.3 3 5 >>> >>> SequenceLengths 8 10 >>> >>> 3 >>> >>> NB. 3 >>> >>> FirstInLongestSequence=: '' $ (([ = [: >./ [) , 0:) # ] >>> >>> 3 3 5 FirstInLongestSequence 3 5 7 11 >>> >>> 7 >>> >>> NB. 7 >>> >>> 3 FirstInLongestSequence 8 10 >>> >>> 8 >>> >>> NB. 8 >>> >>> SequenceIndices=: ] + [: i. [: >./ [ >>> >>> 3 3 5 SequenceIndices 7 >>> >>> 7 8 9 10 11 >>> >>> NB. 7 8 9 10 11 >>> >>> (,3) SequenceIndices 8 >>> >>> 8 9 10 >>> >>> NB. 8 9 10 >>> >>> DropFirstIfPrime=: ((1 {. ]) e. [) }. ] >>> >>> 7 11 DropFirstIfPrime 7 8 9 10 11 >>> >>> 8 9 10 11 >>> >>> NB. 8 9 10 11 >>> >>> (i.0) DropFirstIfPrime 8 9 10 >>> >>> 8 9 10 >>> >>> NB. 8 9 10 >>> >>> DropLastIfPrime=: ([: -(_1 {. ]) e. [) }. ] >>> >>> (,11)DropLastIfPrime 8 9 10 11 >>> >>> 8 9 10 >>> >>> NB. 8 9 10 >>> >>> (i.0)DropLastIfPrime 8 9 10 >>> >>> 8 9 10 >>> >>> f=: 4 : 0 >>> >>> NB. Find the longest sequence of non-primes in a range >>> >>> NB. x and y are the range limits >>> >>> primesInRange =. x PrimesInRange y >>> >>> NB. Add range limits if they are not primes and then already there >>> >>> rangeLimits =. y AddEndRangeIfNotThere x AddStartRangeIfNotThere >>> primesInRange >>> >>> NB. The lengths of the possible sequences, including both sequence limits >>> >>> sequenceLengths =. SequenceLengths rangeLimits >>> >>> NB. The first element of the longest sequence >>> >>> firstInLongestSequence=.sequenceLengths FirstInLongestSequence >>> rangeLimits >>> >>> NB. The longest range including it's both limits >>> >>> longestRange =. sequenceLengths SequenceIndices firstInLongestSequence >>> >>> NB. Drop the range limits if they are primes >>> >>> primesInRange DropLastIfPrime primesInRange DropFirstIfPrime longestRange >>> >>> ) >>> >>> s=: 10 f 100 >>> >>> s >>> >>> 90 91 92 93 94 95 96 >>> >>> >./90 91 92 93 94 95 96 = s >>> >>> 1 >>> >>> s=: 1 f 2 >>> >>> >./s = 1 >>> >>> 1 >>> >>> s=: 2 f 3 >>> >>> 0 = $ s >>> >>> 1 >>> >>> s=: 8 f 9 >>> >>> >./s = 8 9 >>> >>> 1 >>> >>> s=: 7 f 8 >>> >>> >./s = 8 >>> >>> 1 >>> >>> s=: 10 f 11 >>> >>> >./s = 10 >>> >>> 1 >>> >>> s=: 7 f 11 >>> >>> >./s = 8 9 10 >>> >>> 1 >>> >>> s=: 200 f 300 >>> >>> s >>> >>> 212 213 214 215 216 217 218 219 220 221 222 >>> >>> >./0 = 1 p: s >>> >>> 1 >>> >>> 1 = 1 p: _1 + 1 {. s >>> >>> 1 >>> >>> 1 = 1 p: 1 + _1 {. s >>> >>> 1 >>> >>> s=: 2000 f 3000 >>> >>> s >>> >>> 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 >>> 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 >>> >>> >./0 = 1 p: s >>> >>> 1 >>> >>> 1 = 1 p: _1 + 1 {. s >>> >>> 1 >>> >>> 1 = 1 p: 1 + _1 {. s >>> >>> 1 >>> >>> timespacex'200 f 300' >>> >>> 0.00132426 18816 >>> >>> >>> On 2017-09-17 15:35, Raul Miller wrote: >>>> >>>> I was going to look at 200 f 300 and then try timespacex between your >>>> f and other implementations of f, but I got a value error on >>>> AddStartRangeIfNotThere >>>> >>>> FYI, >>>> >>> >> > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm