Special neighbor primes

Revision as of 08:36, 6 August 2021 by rosettacode>Gerard Schildberger (→‎{{header|REXX}}: added the computer programming language REXX.)
Special neighbor primes is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
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...