Roger Hui wrote:
> j=. _4 4 p:"0 n are the integers that need to be
> considered. 

That's nice!  (And I had overlooked that -- thanks
also for pointing it out.)

Given this, I'd be inclined to write the function
porpp (which returns a nearest prime or prime
power) as:

close=: ((i. <./)@:|@:- { ]),
nearp=: _4 4&(p:"0)^:(0&p:)("0)@(2&>.)
powrs=: >:@[EMAIL PROTECTED]@#:
porpp=: (close 1,([EMAIL PROTECTED] [EMAIL PROTECTED]) ^&x: powrs)"0


Result of:

x close y is the atom from y that's nearest x.

nearp y includes the largest prime not larger than y and 
the smallest prime not smaller than y (assuming these exist)

powrs y is a list of somewhat plausible integer powers to be
considered in this context

porpp y is a prime or prime power nearest y

   porpp i. 5 20
 1  1  2  3  4  5  5  7  8  9 11 11 11 13 13 16 16 17 17 19
19 19 23 23 23 25 25 27 29 29 29 31 32 32 32 37 37 37 37 37
41 41 41 43 43 43 47 47 47 49 49 53 53 53 53 53 53 59 59 59
59 61 61 64 64 64 67 67 67 67 71 71 71 73 73 73 73 79 79 79
79 81 83 83 83 83 83 89 89 89 89 89 89 89 97 97 97 97 97 97
   porpp 1+3^30x
205891132094649

Note: this may produce incorrect results for some arguments
around 2^106 or larger.  This is because I expect to be able
to represent the square root of the argument as a floating
point number.

And, of course, the definition of prime I'm using here for
large numbers, is that implemented by p:

When there are two primes or prime powers equally close
to the argument, porpp returns the smaller.

-- 
Raul


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to