Strange unique prime triplets: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|REXX}}: added the computer programming language REXX.)
m (added whitespace to the task's preamble.)
Line 6: Line 6:
;Task:
;Task:
:*   Find all triplets of strange unique primes in which   '''n,   m,'''   and   '''p'''   are all less than   '''30'''.
:*   Find all triplets of strange unique primes in which   '''n,   m,'''   and   '''p'''   are all less than   '''30'''.
:* &nbsp; (stretch goal) &nbsp; Show the <u>count</u> (only) of all the triplets of strange unique primes in which &nbsp; '''n, &nbsp; m,''' &nbsp; and &nbsp; '''p''' &nbsp; are all less than &nbsp; '''1,000'''.
:* &nbsp; (stretch goal) &nbsp; Show the <u>count</u> (only) of all the triplets of strange unique primes in which &nbsp; &nbsp;&nbsp;'''n,&nbsp;m,'''&nbsp;and&nbsp;'''p'''&nbsp; &nbsp; are all less than &nbsp; '''1,000'''.
<br><br>
<br><br>



Revision as of 13:19, 10 March 2021

Strange unique prime triplets 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.

Integers   n,   m,   and   p   are   strange unique primes   if   n,   m,   and   p   are unique primes,   and the sum of     n + m + p     is also prime.


Task
  •   Find all triplets of strange unique primes in which   n,   m,   and   p   are all less than   30.
  •   (stretch goal)   Show the count (only) of all the triplets of strange unique primes in which     n, m, and p    are all less than   1,000.



Python

Using sympy.primerange.

<lang python>from sympy import primerange

def strange_triplets(mx: int = 30) -> None:

   primes = list(primerange(0, mx))
   primes3 = set(primerange(0, 3 * mx))
   c = 0
   for i, n in enumerate(primes):
       for j, m in enumerate(primes[i + 1:], i + 1):
           for p in primes[j + 1:]:
               if n + m + p in primes3:
                   c += 1
                   print(f"{c:2}: {n:2}+{m:2}+{p:2} = {n + m + p}")

strange_triplets()</lang>

Output:
 1:  3+ 5+11 = 19
 2:  3+ 5+23 = 31
 3:  3+ 5+29 = 37
 4:  3+ 7+13 = 23
 5:  3+ 7+19 = 29
 6:  3+11+17 = 31
 7:  3+11+23 = 37
 8:  3+11+29 = 43
 9:  3+17+23 = 43
10:  5+ 7+11 = 23
11:  5+ 7+17 = 29
12:  5+ 7+19 = 31
13:  5+ 7+29 = 41
14:  5+11+13 = 29
15:  5+13+19 = 37
16:  5+13+23 = 41
17:  5+13+29 = 47
18:  5+17+19 = 41
19:  5+19+23 = 47
20:  5+19+29 = 53
21:  7+11+13 = 31
22:  7+11+19 = 37
23:  7+11+23 = 41
24:  7+11+29 = 47
25:  7+13+17 = 37
26:  7+13+23 = 43
27:  7+17+19 = 43
28:  7+17+23 = 47
29:  7+17+29 = 53
30:  7+23+29 = 59
31: 11+13+17 = 41
32: 11+13+19 = 43
33: 11+13+23 = 47
34: 11+13+29 = 53
35: 11+17+19 = 47
36: 11+19+23 = 53
37: 11+19+29 = 59
38: 13+17+23 = 53
39: 13+17+29 = 59
40: 13+19+29 = 61
41: 17+19+23 = 59
42: 19+23+29 = 71

REXX

<lang rexx>/*REXX pgm lists triple strange primes (<HI) where the sum of the primes sum is a prime,*/ parse arg hi . /*obtain optional argument from the CL.*/ if hi== | hi=="," then hi= 30 /*Not specified? Then use the default.*/ tell= hi>0; hi= abs(hi); hi= hi - 1 /*use the absolute value of HI. */ if tell>0 then say 'list of unique strange (three) primes that sum to a prime:' call genP /*build array of semifores for primes. */ finds= 0 /*The number of strange primes (so far)*/ say

   do       m=2    to hi; if \!.m  then iterate
      do    n=m+1  to hi; if \!.n  then iterate
      mn= m + n                                 /*compute a partial sum for deep loops.*/
         do p=n+1  to hi; if \!.p  then iterate
         sum= mn + p
         if \!.sum  then iterate                /*Is the sum a prime?  No, skip it.    */
         finds= finds + 1                       /*bump the number of "strange" primes. */
         if tell  then say right(m, w+9)      right(n, w)        right(p, w)   ,
                                              '  sum to: '       right(sum, w)
         end   /*p*/
      end      /*n*/
   end         /*m*/

say say 'Found ' commas(finds) " unique strange primes which sum to a prime," ,

                                     " each triple numbers are  < "    commas(hi+1).

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; w= length(hi) /*placeholders for primes; width of #'s*/

     @.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;     s.#= @.# **2    /*number of primes so far;     prime². */
                                                /* [↓]  generate more  primes  ≤  high.*/
       do j=@.#+2  by 2  for hi*3%2             /*find odd primes from here on.        */
       parse var j  -1 _; if     _==5  then iterate  /*J divisible by 5?  (right dig)*/
                            if j// 3==0  then iterate  /*"     "      " 3?             */
                            if j// 7==0  then iterate  /*"     "      " 7?             */
                                                /* [↑]  the above five lines saves time*/
              do k=5  while s.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;    s.#= j*j;   !.j= 1 /*bump # of Ps; assign next P;  P²; P# */
       end          /*j*/
    return</lang>
output   when using the default input:
list of unique strange (three) primes that sum to a prime:

          3  5 11   sum to:  19
          3  5 23   sum to:  31
          3  5 29   sum to:  37
          3  7 13   sum to:  23
          3  7 19   sum to:  29
          3 11 17   sum to:  31
          3 11 23   sum to:  37
          3 11 29   sum to:  43
          3 17 23   sum to:  43
          5  7 11   sum to:  23
          5  7 17   sum to:  29
          5  7 19   sum to:  31
          5  7 29   sum to:  41
          5 11 13   sum to:  29
          5 13 19   sum to:  37
          5 13 23   sum to:  41
          5 13 29   sum to:  47
          5 17 19   sum to:  41
          5 19 23   sum to:  47
          5 19 29   sum to:  53
          7 11 13   sum to:  31
          7 11 19   sum to:  37
          7 11 23   sum to:  41
          7 11 29   sum to:  47
          7 13 17   sum to:  37
          7 13 23   sum to:  43
          7 17 19   sum to:  43
          7 17 23   sum to:  47
          7 17 29   sum to:  53
          7 23 29   sum to:  59
         11 13 17   sum to:  41
         11 13 19   sum to:  43
         11 13 23   sum to:  47
         11 13 29   sum to:  53
         11 17 19   sum to:  47
         11 19 23   sum to:  53
         11 19 29   sum to:  59
         13 17 23   sum to:  53
         13 17 29   sum to:  59
         13 19 29   sum to:  61
         17 19 23   sum to:  59
         19 23 29   sum to:  71

Found  42  unique strange primes which sum to a prime,  each triple numbers are  <  30.
output   when using the input of:     -1000
Found  241,580  unique strange primes which sum to a prime,  each triple numbers are  <  1,000.

Ring

<lang ring> load "stdlib.ring"

num = 0 limit = 30

see "working..." + nl see "the strange primes are:" + nl

for n = 1 to limit

   for m = n+1 to limit
       for p = m+1 to limit
           sum = n+m+p
           if isprime(sum) and isprime(n) and isprime(m) and isprime(p)
              num = num + 1
              see "" + num + ": " + n + "+" + m + "+" + p + " = " + sum + nl
           ok
       next
   next

next

see "done..." + nl </lang>

Output:
working...
the strange primes are:
1: 3+5+11 = 19
2: 3+5+23 = 31
3: 3+5+29 = 37
4: 3+7+13 = 23
5: 3+7+19 = 29
6: 3+11+17 = 31
7: 3+11+23 = 37
8: 3+11+29 = 43
9: 3+17+23 = 43
10: 5+7+11 = 23
11: 5+7+17 = 29
12: 5+7+19 = 31
13: 5+7+29 = 41
14: 5+11+13 = 29
15: 5+13+19 = 37
16: 5+13+23 = 41
17: 5+13+29 = 47
18: 5+17+19 = 41
19: 5+19+23 = 47
20: 5+19+29 = 53
21: 7+11+13 = 31
22: 7+11+19 = 37
23: 7+11+23 = 41
24: 7+11+29 = 47
25: 7+13+17 = 37
26: 7+13+23 = 43
27: 7+17+19 = 43
28: 7+17+23 = 47
29: 7+17+29 = 53
30: 7+23+29 = 59
31: 11+13+17 = 41
32: 11+13+19 = 43
33: 11+13+23 = 47
34: 11+13+29 = 53
35: 11+17+19 = 47
36: 11+19+23 = 53
37: 11+19+29 = 59
38: 13+17+23 = 53
39: 13+17+29 = 59
40: 13+19+29 = 61
41: 17+19+23 = 59
42: 19+23+29 = 71
done...