Special neighbor primes
- Task
- Let (p1, p2) are neighbor primes. Find and show here in base ten if p1+ p2 -1 is prime, where p1, p2 < 100.
REXX
<lang rexx>/*REXX program finds special neighbor primes: P, Q, P+Q-1 are primes, and P and Q < 100.*/ parse arg hi cols . /*obtain optional argument from the CL.*/ if hi== | hi=="," then hi= 100 /*Not specified? Then use the default.*/ if cols== | cols=="," then cols= 5 /* " " " " " " */ call genP hi /*build semaphore array for low primes.*/
low#= #; #m= # - 1 /*obtain the two high primes generated.*/
call genP @.low# + @.#m - 1 /*build semaphore array for high primes*/ w= 20 /*width of a number in any column. */ title= ' special neighbor primes: P, Q, P+Q-1 are primes, and P and Q < ' commas(hi) if cols>0 then say ' index │'center(title, 1 + cols*(w+1) ) if cols>0 then say '───────┼'center("" , 1 + cols*(w+1), '─') found= 0; idx= 1 /*init. # special neighbor primes & IDX*/ $= /*a list of sp neighbor primes (so far)*/
do j=1 for low#; p= @.j /*look for special neighbor P in range.*/ do k=j+1 to low#; q= @.k /* " " " " Q " " */ s= p+q - 1; if \!.s then iterate /*sum of 2 primes minus one not prime? */ found= found + 1 /*bump number of sp. neighbor primes. */ if cols==0 then iterate /*Build the list (to be shown later)? */ y= p','q"──►"s /*flag sum-1 is a sp. neighbor prime.*/ $= $ right(y, w) /*add sp. neighbor prime ──► the $ list*/ if found//cols\==0 then iterate /*have we populated a line of output? */ say center(idx, 7)'│' substr($, 2); $= /*display what we have so far (cols). */ idx= idx + cols /*bump the index count for the output*/ end /*k*/ end /*j*/
if $\== then say center(idx, 7)"│" substr($, 2) /*possible display residual output.*/ if cols>0 then say '───────┴'center("" , 1 + cols*(w+1), '─') say say 'Found ' commas(found) title exit 0 /*stick a fork in it, we're all done. */ /*──────────────────────────────────────────────────────────────────────────────────────*/ commas: parse arg ?; do jc=length(?)-3 to 1 by -3; ?=insert(',', ?, jc); end; return ? /*──────────────────────────────────────────────────────────────────────────────────────*/ genP: !.= 0; parse arg limit /*placeholders for primes (semaphores).*/
@.1=2; @.2=3; @.3=5; @.4=7; @.5=11 /*define some low primes. */ !.2=1; !.3=1; !.5=1; !.7=1; !.11=1 /* " " " " flags. */ #=5; sq.#= @.# **2 /*number of primes so far; prime square*/ /* [↓] generate more primes ≤ high.*/ do j=@.#+2 by 2 to limit /*find odd primes from here on. */ parse var j -1 _; if _==5 then iterate /*J ÷ by 5? (right digit).*/ if j//3==0 then iterate; if j//7==0 then iterate /*" " " 3? Is J ÷ by 7? */ do k=5 while sq.k<=j /* [↓] divide by the known odd primes.*/ if j//@.k==0 then iterate j /*Is J ÷ X? Then not prime. ___ */ end /*k*/ /* [↑] only process numbers ≤ √ J */ #= #+1; @.#= j; sq.#= j*j; !.j= 1 /*bump # of Ps; assign next P; P²; P# */ end /*j*/; return</lang>
- output when using the default inputs:
index │ special neighbor primes: P, Q, P+Q-1 are primes, and P and Q < 100 ───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 │ 3,5──►7 3,11──►13 3,17──►19 3,29──►31 3,41──►43 6 │ 3,59──►61 3,71──►73 5,7──►11 5,13──►17 5,19──►23 11 │ 5,37──►41 5,43──►47 5,67──►71 5,79──►83 5,97──►101 16 │ 7,11──►17 7,13──►19 7,17──►23 7,23──►29 7,31──►37 21 │ 7,37──►43 7,41──►47 7,47──►53 7,53──►59 7,61──►67 26 │ 7,67──►73 7,73──►79 7,83──►89 7,97──►103 11,13──►23 31 │ 11,19──►29 11,31──►41 11,37──►47 11,43──►53 11,61──►71 36 │ 11,73──►83 11,79──►89 11,97──►107 13,17──►29 13,19──►31 41 │ 13,29──►41 13,31──►43 13,41──►53 13,47──►59 13,59──►71 46 │ 13,61──►73 13,67──►79 13,71──►83 13,89──►101 13,97──►109 51 │ 17,31──►47 17,37──►53 17,43──►59 17,67──►83 17,73──►89 56 │ 17,97──►113 19,23──►41 19,29──►47 19,41──►59 19,43──►61 61 │ 19,53──►71 19,61──►79 19,71──►89 19,79──►97 19,83──►101 66 │ 19,89──►107 23,31──►53 23,37──►59 23,61──►83 23,67──►89 71 │ 23,79──►101 29,31──►59 29,43──►71 29,61──►89 29,73──►101 76 │ 29,79──►107 31,37──►67 31,41──►71 31,43──►73 31,53──►83 81 │ 31,59──►89 31,67──►97 31,71──►101 31,73──►103 31,79──►109 86 │ 31,83──►113 31,97──►127 37,43──►79 37,47──►83 37,53──►89 91 │ 37,61──►97 37,67──►103 37,71──►107 37,73──►109 41,43──►83 96 │ 41,61──►101 41,67──►107 41,73──►113 41,97──►137 43,47──►89 101 │ 43,59──►101 43,61──►103 43,67──►109 43,71──►113 43,89──►131 106 │ 43,97──►139 47,61──►107 47,67──►113 53,61──►113 53,79──►131 111 │ 53,97──►149 59,73──►131 59,79──►137 61,67──►127 61,71──►131 116 │ 61,79──►139 61,89──►149 61,97──►157 67,71──►137 67,73──►139 121 │ 67,83──►149 67,97──►163 71,79──►149 71,97──►167 73,79──►151 126 │ 79,89──►167 83,97──►179 ───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────── Found 127 special neighbor primes: P, Q, P+Q-1 are primes, and P and Q < 100
Ring
<lang ring> load "stdlib.ring"
see "working..." + nl see "Special neighbor primes are:" + nl row = 0 oldPrime = 2
for n = 3 to 100
if isprime(n) and isprime(oldPrime) sum = oldPrime + n - 1 if isprime(sum) row++ see "" + oldPrime + "," + n + " => " + sum + nl ok oldPrime = n ok
next
see "Found " + row + " special neighbor primes" see "done..." + nl </lang>
- Output:
working... Special neighbor primes are: 3,5 => 7 5,7 => 11 7,11 => 17 11,13 => 23 13,17 => 29 19,23 => 41 29,31 => 59 31,37 => 67 41,43 => 83 43,47 => 89 61,67 => 127 67,71 => 137 73,79 => 151 Found 13 special neighbor primes done...