Special neighbor primes

From Rosetta Code
Revision as of 09:01, 6 August 2021 by PureFox (talk | contribs) (→‎{{header|Wren}}: Removed a superfluous condition.)
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

The output list is displayed in numerical order by prime   P   and then by prime   Q. <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...

Wren

Library: Wren-math
Library: Wren-fmt

I assume that 'neighbor' primes means pairs of successive primes.

Anticipating a likely stretch goal. <lang ecmascript>import "/math" for Int import "/fmt" for Fmt

var max = 1e7 - 1 var primes = Int.primeSieve(max)

var specialNP = Fn.new { |limit, showAll|

   if (showAll) System.print("Neighbor primes, p1 and p2, where p1 + p2 - 1 is prime:")
   var count = 0
   var p3
   for (i in 1...primes.where { |p| p < limit }.count) {
       var p2 = primes[i]
       var p1 = primes[i-1]
       if (Int.isPrime(p3 = p1 + p2 - 1)) {
           if (showAll) Fmt.print("($2d, $2d) => $3d", p1, p2, p3)
           count = count + 1
       }
   }
   Fmt.print("\nFound $,d special neighbor primes under $,d.", count, limit)

}

specialNP.call(100, true) for (i in 3..7) {

   specialNP.call(10.pow(i), false)

}</lang>

Output:
Neighbor primes, p1 and p2, where p1 + p2 - 1 is prime:
( 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 under 100.

Found 71 special neighbor primes under 1,000.

Found 367 special neighbor primes under 10,000.

Found 2,165 special neighbor primes under 100,000.

Found 14,526 special neighbor primes under 1,000,000.

Found 103,611 special neighbor primes under 10,000,000.