Special neighbor primes: Difference between revisions
(→{{header|Wren}}: Removed a superfluous condition.) |
(Added Go) |
||
Line 4: | Line 4: | ||
<br><br> |
<br><br> |
||
=={{header|Go}}== |
|||
{{trans|Wren}} |
|||
{{libheader|Go-rcu}} |
|||
<lang go>package main |
|||
import ( |
|||
"fmt" |
|||
"rcu" |
|||
) |
|||
const MAX = 1e7 - 1 |
|||
var primes = rcu.Primes(MAX) |
|||
func specialNP(limit int, showAll bool) { |
|||
if showAll { |
|||
fmt.Println("Neighbor primes, p1 and p2, where p1 + p2 - 1 is prime:") |
|||
} |
|||
count := 0 |
|||
for i := 1; i < len(primes); i++ { |
|||
p2 := primes[i] |
|||
if p2 >= limit { |
|||
break |
|||
} |
|||
p1 := primes[i-1] |
|||
p3 := p1 + p2 - 1 |
|||
if rcu.IsPrime(p3) { |
|||
if showAll { |
|||
fmt.Printf("(%2d, %2d) => %3d\n", p1, p2, p3) |
|||
} |
|||
count++ |
|||
} |
|||
} |
|||
ccount := rcu.Commatize(count) |
|||
climit := rcu.Commatize(limit) |
|||
fmt.Printf("\nFound %s special neighbor primes under %s.\n", ccount, climit) |
|||
} |
|||
func main() { |
|||
specialNP(100, true) |
|||
var pow = 1000 |
|||
for i := 3; i < 8; i++ { |
|||
specialNP(pow, false) |
|||
pow *= 10 |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
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. |
|||
</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |
Revision as of 09:30, 6 August 2021
- Task
- Let (p1, p2) are neighbor primes. Find and show here in base ten if p1+ p2 -1 is prime, where p1, p2 < 100.
Go
<lang go>package main
import (
"fmt" "rcu"
)
const MAX = 1e7 - 1
var primes = rcu.Primes(MAX)
func specialNP(limit int, showAll bool) {
if showAll { fmt.Println("Neighbor primes, p1 and p2, where p1 + p2 - 1 is prime:") } count := 0 for i := 1; i < len(primes); i++ { p2 := primes[i] if p2 >= limit { break } p1 := primes[i-1] p3 := p1 + p2 - 1 if rcu.IsPrime(p3) { if showAll { fmt.Printf("(%2d, %2d) => %3d\n", p1, p2, p3) } count++ } } ccount := rcu.Commatize(count) climit := rcu.Commatize(limit) fmt.Printf("\nFound %s special neighbor primes under %s.\n", ccount, climit)
}
func main() {
specialNP(100, true) var pow = 1000 for i := 3; i < 8; i++ { specialNP(pow, false) pow *= 10 }
}</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.
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
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.