Twin primes: Difference between revisions

m
m (→‎{{header|Phix}}: added syntax colouring the hard way)
m (→‎{{header|Wren}}: Minor tidy)
 
(42 intermediate revisions by 24 users not shown)
Line 1:
{{draft task|Prime Numbers}}
 
Twin primes are pairs of natural numbers &nbsp; (P<sub>1</sub> &nbsp;and&nbsp; P<sub>2</sub>) &nbsp; that satisfy the following:
Line 39:
{{works with|ALGOL 68G|Any - tested with release 2.8.3.win32}}
Simplifies array bound checking by using the equivalent definition of twin primes: p and p - 2.
<langsyntaxhighlight lang="algol68">BEGIN
# count twin primes (where p and p - 2 are prime) #
PR heap=128M PR # set heap memory size for Algol 68G #
Line 64:
FOR p FROM 3 BY 2 TO max number - 1 DO IF primes[ p ] AND primes[ p - 2 ] THEN twin count +:= 1 FI OD;
print( ( "twin prime pairs below ", whole( max number, 0 ), ": ", whole( twin count, 0 ), newline ) )
END</langsyntaxhighlight>
{{out}}
<pre>
Line 94:
twin prime pairs below 10000000: 58980
</pre>
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">pairsOfPrimes: function [upperLim][
count: 0
j: 0
k: 1
i: 0
while [i=<upperLim][
i: (6 * k) - 1
j: i + 2
if and? [prime? i] [prime? j] [
count: count + 1
]
k: k + 1
]
return count + 1
]
 
ToNum: 10
while [ToNum =< 1000000][
x: pairsOfPrimes ToNum
print ["From 2 to" ToNum ": there are" x "pairs of twin primes"]
ToNum: ToNum * 10
]</syntaxhighlight>
 
{{out}}
 
<pre>From 2 to 10 : there are 3 pairs of twin primes
From 2 to 100 : there are 9 pairs of twin primes
From 2 to 1000 : there are 35 pairs of twin primes
From 2 to 10000 : there are 205 pairs of twin primes
From 2 to 100000 : there are 1224 pairs of twin primes
From 2 to 1000000 : there are 8169 pairs of twin primes</pre>
 
=={{header|Applesoft BASIC}}==
<syntaxhighlight lang="gwbasic"> 0 INPUT "SEARCH SIZE: ";S: FOR N = 1 TO S - 3 STEP 2:P = N: GOSUB 3: IF F THEN P = N + 2: GOSUB 3:C = C + F
1 J = J + (N > 5): IF J = 3 THEN N = N + 4:J = 0
2 NEXT N: PRINT C" TWIN PRIME PAIRS.": END
3 F = 0: IF P < 2 THEN RETURN
4 F = P = 2: IF F THEN RETURN
5 F = P - INT (P / 2) * 2: IF NOT F THEN RETURN
6 FOR B = 3 TO SQR (P) STEP 2: IF B > = P THEN NEXT B
7 IF B > = P THEN RETURN
8 F = 0: FOR I = B TO SQR (P) STEP 2: IF P - INT (P / I) * I = 0 THEN RETURN
9 NEXT I:F = 1: RETURN</syntaxhighlight>
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f TWIN_PRIMES.AWK
BEGIN {
Line 129 ⟶ 174:
return(1)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 139 ⟶ 184:
twin prime pairs < 1000000 : 8169
</pre>
 
 
=={{header|BASIC256}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic256">
function isPrime(v)
if v < 2 then return False
if v mod 2 = 0 then return v = 2
if v mod 3 = 0 then return v = 3
d = 5
while d * d <= v
if v mod d = 0 then return False else d += 2
end while
return True
end function
 
function paresDePrimos(limite)
p1 = 0
p2 = 1
p3 = 1
cont = 0
for i = 5 to limite
p3 = p2
p2 = p1
p1 = isPrime(i)
if (p3 and p1) then cont += 1
next i
return cont
end function
 
n = 1
for i = 1 to 6
n = n * 10
print "pares de primos gemelos por debajo de < "; n; " : "; paresDePrimos(n)
next i
end
</syntaxhighlight>
{{out}}
<pre>
Similar a la entrada de FreeBASIC.
</pre>
 
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
Line 198 ⟶ 285:
test(100000000);
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>Number of twin prime pairs less than 10 is 2
Line 215 ⟶ 302:
(The module Math::Primesieve, which is used by the Raku example on this page, is implemented
on top of this library.)
<langsyntaxhighlight lang="cpp">#include <cstdint>
#include <iostream>
#include <string>
Line 245 ⟶ 332:
}
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 261 ⟶ 348:
Number of twin prime pairs less than 100,000,000,000 is 224,376,048
</pre>
 
===Without external libraries===
<syntaxhighlight lang="c++">
#include <bitset>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <vector>
 
const uint32_t limit = 1'000'000'000;
std::bitset<limit + 1> primes;
 
void sieve_primes(uint32_t limit) {
primes.set();
primes.reset(0); primes.reset(1);
 
for ( uint32_t p = 2; p * p <= limit; ++p ) {
if ( primes.test(p) ) {
for ( uint32_t i = p * p; i <= limit; i += p ) {
primes.reset(i);
}
}
}
}
 
int main() {
sieve_primes(limit);
 
uint32_t target = 10;
uint32_t count = 0;
bool last = false;
bool first = true;
 
for ( uint32_t index = 5; index <= limit; index += 2 ) {
last = first;
first = primes[index];
if ( last && first ) {
count += 1;
}
if ( index + 1 == target ) {
std::cout << std::setw(8) << count << " twin primes below " << index + 1 << std::endl;
target *= 10;
}
}
}
</syntaxhighlight>
{{ out }}
<pre>
2 twin primes below 10
8 twin primes below 100
35 twin primes below 1000
205 twin primes below 10000
1224 twin primes below 100000
8169 twin primes below 1000000
58980 twin primes below 10000000
440312 twin primes below 100000000
3424506 twin primes below 1000000000
</pre>
 
=={{header|C sharp}}==
===Conventional===
<syntaxhighlight lang="csharp">using System;
 
class Program {
 
static uint[] res = new uint[10];
static uint ri = 1, p = 10, count = 0;
 
static void TabulateTwinPrimes(uint bound) {
if (bound < 5) return; count++;
uint cl = (bound - 1) >> 1, i = 1, j,
limit = (uint)(Math.Sqrt(bound) - 1) >> 1;
var comp = new bool[cl]; bool lp;
for (j = 3; j < cl; j += 3) comp[j] = true;
while (i < limit) {
if (lp = !comp[i]) {
uint pr = (i << 1) + 3;
for (j = (pr * pr - 2) >> 1; j < cl; j += pr)
comp[j] = true;
}
if (!comp[++i]) {
uint pr = (i << 1) + 3;
if (lp) {
if (pr > p) {
res[ri++] = count;
p *= 10;
}
count++;
i++;
}
for (j = (pr * pr - 2) >> 1; j < cl; j += pr)
comp[j] = true;
}
}
cl--;
while (i < cl) {
lp = !comp[i++];
if (!comp[i] && lp) {
if ((i++ << 1) + 3 > p) {
res[ri++] = count;
p *= 10;
}
count++;
}
}
res[ri] = count;
}
 
static void Main(string[] args) {
var sw = System.Diagnostics.Stopwatch.StartNew();
string fmt = "{0,9:n0} twin primes below {1,-13:n0}";
TabulateTwinPrimes(1_000_000_000);
sw.Stop();
p = 1;
for (var j = 1; j <= ri; j++)
Console.WriteLine(fmt, res[j], p *= 10);
Console.Write("{0} sec", sw.Elapsed.TotalSeconds);
}
}</syntaxhighlight>
{{out|Output @ Tio.run}}
<pre> 2 twin primes below 10
8 twin primes below 100
35 twin primes below 1,000
205 twin primes below 10,000
1,224 twin primes below 100,000
8,169 twin primes below 1,000,000
58,980 twin primes below 10,000,000
440,312 twin primes below 100,000,000
3,424,506 twin primes below 1,000,000,000
17.8284822 sec</pre>
 
===Using C# 8 features===
{{works with|C sharp|8}}
Runs in about 18 seconds.
<syntaxhighlight lang="csharp">using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
 
public static class TwinPrimes
{
public static void Main()
{
CountTwinPrimes(Enumerable.Range(1, 9).Select(i => (int)Math.Pow(10, i)).ToArray());
}
 
private static void CountTwinPrimes(params int[] bounds)
{
Array.Sort(bounds);
int b = 0;
int count = 0;
string format = "There are {0:N0} twin primes below {1:N0}";
foreach (var twin in FindTwinPrimes(bounds[^1])) {
if (twin.p2 >= bounds[b]) {
Console.WriteLine(format, count, bounds[b]);
b++;
}
count++;
}
Console.WriteLine(format, count, bounds[b]);
}
 
private static IEnumerable<(int p1, int p2)> FindTwinPrimes(int bound) =>
PrimeSieve(bound).Pairwise().Where(pair => pair.p1 + 2 == pair.p2);
 
private static IEnumerable<int> PrimeSieve(int bound)
{
if (bound < 2) yield break;
yield return 2;
 
var composite = new BitArray((bound - 1) / 2);
int limit = (int)(Math.Sqrt(bound) - 1) / 2;
for (int i = 0; i < limit; i++) {
if (composite[i]) continue;
int prime = 2 * i + 3;
yield return prime;
for (int j = (prime * prime - 2) / 2; j < composite.Count; j += prime) {
composite[j] = true;
}
}
for (int i = limit; i < composite.Count; i++) {
if (!composite[i]) yield return 2 * i + 3;
}
}
 
private static IEnumerable<(T p1, T p2)> Pairwise<T>(this IEnumerable<T> source)
{
using var e = numbers.GetEnumerator();
if (!e.MoveNext()) yield break;
T p1 = e.Current;
while (e.MoveNext()) {
T p2 = e.Current;
yield return (p1, p2);
p1 = p2;
}
}
}</syntaxhighlight>
{{out}}
<pre style="height:30ex;overflow:scroll">
There are 2 twin primes below 10
There are 8 twin primes below 100
There are 35 twin primes below 1,000
There are 205 twin primes below 10,000
There are 1,224 twin primes below 100,000
There are 8,169 twin primes below 1,000,000
There are 58,980 twin primes below 10,000,000
There are 440,312 twin primes below 100,000,000
There are 3,424,506 twin primes below 1,000,000,000</pre>
 
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|Wren}}
<syntaxhighlight lang="delphi">
<lang Delphi>
program Primes;
 
Line 386 ⟶ 681:
end.
 
</syntaxhighlight>
</lang>
 
{{out}}
Line 400 ⟶ 695:
Under 1,000,000,000 there are 3,424,506 pairs of twin primes.
</pre>
 
=={{header|EasyLang}}==
{{trans|AWK}}
<syntaxhighlight lang=easylang>
fastfunc isprim num .
if num mod 2 = 0 and num > 2
return 0
.
i = 3
while i <= sqrt num
if num mod i = 0
return 0
.
i += 2
.
return 1
.
func count limit .
p2 = 1
p3 = 1
for i = 5 to limit
p3 = p2
p2 = p1
p1 = isprim i
if p3 = 1 and p1 = 1
cnt += 1
.
.
return cnt
.
n = 1
for i = 1 to 6
n *= 10
print "twin prime pairs < " & n & " : " & count n
.
</syntaxhighlight>
 
=={{header|F Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]
<langsyntaxhighlight lang="fsharp">
printfn "twin primes below 100000: %d" (primes64()|>Seq.takeWhile(fun n->n<=100000L)|>Seq.pairwise|>Seq.filter(fun(n,g)->g=n+2L)|>Seq.length)
printfn "twin primes below 1000000: %d" (primes64()|>Seq.takeWhile(fun n->n<=1000000L)|>Seq.pairwise|>Seq.filter(fun(n,g)->g=n+2L)|>Seq.length)
Line 411 ⟶ 742:
printfn "twin primes below 10000000000: %d" (primes64()|>Seq.takeWhile(fun n->n<=10000000000L)|>Seq.pairwise|>Seq.filter(fun(n,g)->g=n+2L)|>Seq.length)
printfn "twin primes below 100000000000: %d" (primes64()|>Seq.takeWhile(fun n->n<=100000000000L)|>Seq.pairwise|>Seq.filter(fun(n,g)->g=n+2L)|>Seq.length)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 438 ⟶ 769:
=={{header|Factor}}==
{{works with|Factor|0.99 2020-07-03}}
<langsyntaxhighlight lang="factor">USING: io kernel math math.parser math.primes.erato math.ranges
sequences tools.memory.private ;
 
Line 446 ⟶ 777:
 
"Search size: " write flush readln string>number
twin-pair-count commas write " twin prime pairs." print</langsyntaxhighlight>
{{out}}
<pre>
Line 459 ⟶ 790:
Search size: 1,000,000,000
3,424,506 twin prime pairs.
</pre>
 
 
=={{header|FreeBASIC}}==
{{trans|AWK}}
<syntaxhighlight lang="freebasic">
Function isPrime(Byval ValorEval As Integer) As Boolean
If ValorEval <=1 Then Return False
For i As Integer = 2 To Int(Sqr(ValorEval))
If ValorEval Mod i = 0 Then Return False
Next i
Return True
End Function
 
Function paresDePrimos(limite As Uinteger) As Uinteger
Dim As Uinteger p1 = 0, p2 = 1, p3 = 1, count = 0
For i As Uinteger = 5 To limite
p3 = p2
p2 = p1
p1 = isPrime(i)
If (p3 And p1) Then count += 1
Next i
Return count
End Function
 
Dim As Uinteger n = 1
For i As Byte = 1 To 6
n *= 10
Print Using "pares de primos gemelos por debajo de < ####### : ####"; n; paresDePrimos(n)
Next i
Print !"\n--- terminado, pulsa RETURN---"
Sleep
</syntaxhighlight>
{{out}}
<pre>
pares de primos gemelos por debajo de < 10 : 2
pares de primos gemelos por debajo de < 100 : 8
pares de primos gemelos por debajo de < 1000 : 35
pares de primos gemelos por debajo de < 10000 : 205
pares de primos gemelos por debajo de < 100000 : 1224
pares de primos gemelos por debajo de < 1000000 : 8169
</pre>
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">upper = eval[input["Enter upper bound:"]]
countTwins[upper]
countTwins[100000]
countTwins[10000000]
countTwins[1000000000]
 
countTwins[upper] :=
{
count = 0
for n = primes[2, upper-2]
if isPrime[n+2]
count = count + 1
 
println["$count twin primes under $upper"]
}</syntaxhighlight>
{{out}}
<pre>
35 twin primes under 1000
1224 twin primes under 100000
58980 twin primes under 10000000
3424506 twin primes under 1000000000
</pre>
 
=={{header|Go}}==
{{trans|Wren}}
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 523 ⟶ 919:
limit *= 10
}
}</langsyntaxhighlight>
 
{{out}}
Line 541 ⟶ 937:
===Alternative using primegen package===
See [[Extensible prime generator#Go]].
<langsyntaxhighlight lang="go">package main
 
import (
Line 569 ⟶ 965:
previous = prime
}
}</langsyntaxhighlight>
 
{{out}}
Line 587 ⟶ 983:
=={{header|Java}}==
BigInteger Implementation:
<syntaxhighlight lang="java">
<lang Java>
import java.math.BigInteger;
import java.util.Scanner;
Line 614 ⟶ 1,010:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 628 ⟶ 1,024:
</pre>
 
===Extended Task===
<syntaxhighlight lang="java">
import java.util.BitSet;
 
public final class TwinPrimes {
 
public static void main(String[] args) {
final int limit = 1_000_000_000;
sievePrimes(limit);
int target = 10;
int count = 0;
boolean last = false;
boolean first = true;
for ( int index = 5; index <= limit; index += 2 ) {
last = first;
first = primes.get(index);
if ( last && first ) {
count += 1;
}
if ( index + 1 == target ) {
System.out.println(String.format("%8d%s%d", count, " twin primes below ", index + 1));
target *= 10;
}
}
}
private static void sievePrimes(int aLimit) {
primes = new BitSet(aLimit + 1);
primes.set(2, aLimit + 1);
for ( int i = 2; i <= Math.sqrt(aLimit); i = primes.nextSetBit(i + 1) ) {
for ( int j = i * i; j <= aLimit; j += i ) {
primes.clear(j);
}
}
}
private static BitSet primes;
 
}
</syntaxhighlight>
{{ out }}
<pre>
2 twin primes below 10
8 twin primes below 100
35 twin primes below 1000
205 twin primes below 10000
1224 twin primes below 100000
8169 twin primes below 1000000
58980 twin primes below 10000000
440312 twin primes below 100000000
3424506 twin primes below 1000000000
</pre>
 
=={{header|J}}==
<syntaxhighlight lang="j">tp=: (_2 +/@:= 2 -/\ i.&.(p:inv))"0
 
NB. i.&.(p:inv) generate a list of primes below the given limit
NB. 2 -/\ pairwise subtract adjacent primes (create a list of differences)
NB. _2 +/@:= compare these differences to -2, and
NB. sum up the resulting boolean list (get the number of twin pairs)</syntaxhighlight>
{{out}}
<pre> tp 10 ^ >: i. 7
2 8 35 205 1224 8169 58980
 
NB. test larger limits, and get their time/space usage
tp 1e8
440312
timespacex 'tp 1e8'
0.657576 2.01377e8
tp 1e9
3424506
timespacex 'tp 1e9'
8.59713 1.61071e9
</pre>
 
=={{header|jq}}==
'''Slightly modified from the [[#C|C]] entry'''
 
<syntaxhighlight lang="jq">def odd_gt2_is_prime:
. as $n
| if ($n % 3 == 0) then $n == 3
elif ($n % 5 == 0) then $n == 5
elif ($n % 7 == 0) then $n == 7
elif ($n % 11 == 0) then $n == 11
elif ($n % 13 == 0) then $n == 13
elif ($n % 17 == 0) then $n == 17
elif ($n % 19 == 0) then $n == 19
else {i:23}
| until( (.i * .i) > $n or ($n % .i == 0); .i += 2)
| .i * .i > $n
end;
 
def twin_primes($max):
{count:0, i:3, isprime:true}
| until(.i >= $max;
.i += 2
| if .isprime
then if .i|odd_gt2_is_prime then .count+=1 else .isprime = false end
else .isprime = (.i|odd_gt2_is_prime)
end )
| .count;
 
pow(10; range(1;8)) | "Number of twin primes less than \(.) is \(twin_primes(.))."</syntaxhighlight>
{{out}}
<pre>
Number of twin primes less than 10 is 2.
Number of twin primes less than 100 is 8.
Number of twin primes less than 1000 is 35.
Number of twin primes less than 10000 is 205.
Number of twin primes less than 100000 is 1224.
Number of twin primes less than 1000000 is 8169.
Number of twin primes less than 10000000 is 58980.
</pre>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">using Formatting, Primes
 
function counttwinprimepairsbetween(n1, n2)
Line 649 ⟶ 1,160:
lpad(format(paircount, commas=true), 8), " pairs of twin primes.")
end
</langsyntaxhighlight>{{out}}
<pre>
Under 100 there are 8 pairs of twin primes.
Line 670 ⟶ 1,181:
prime pair as a difference tuple of (2,), and a prime quadruplet such as [11, 13, 17, 19] as the
tuple starting with 11 of type (2, 6, 8).
<langsyntaxhighlight lang="julia">using Formatting, Primes
 
const PMAX = 1_000_000_000
Line 689 ⟶ 1,200:
println("Count of a form of prime octets from 1 to 1 million: ",
format(countprimetuples((2, 6, 12, 14, 20, 24, 26), 1000000), commas=true))
</langsyntaxhighlight>{{out}}
<pre>
Count of prime pairs from 1 to 1 billion: 3,424,506
Line 698 ⟶ 1,209:
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">import java.math.BigInteger
import java.util.*
 
Line 730 ⟶ 1,241:
}
return true
}</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">ClearAll[TwinPrimeCount]
TwinPrimeCount[mx_] := Module[{pmax, min, max, total},
pmax = PrimePi[mx];
total = 0;
Do[
min = 10^6 i;
min = Max[min, 1];
max = 10^6 (i + 1);
max = Min[max, pmax];
total += Count[Differences[Prime[Range[min, max]]], 2]
,
{i, 0, Ceiling[pmax/10^6]}
];
total
]
Do[Print[{10^i, TwinPrimeCount[10^i]}], {i, 9}]</syntaxhighlight>
{{out}}
<pre>{10,2}
{100,8}
{1000,35}
{10000,205}
{100000,1224}
{1000000,8169}
{10000000,58980}
{100000000,440312}
{1000000000,3424506}</pre>
 
=={{header|Maxima}}==
Using built-in predicate function primep to detect primes and the fact that all but the first pair are of the form [6n-1,6n+1].
<syntaxhighlight lang="maxima">
/* Function to count the number of pairs below n */
twin_primes_under_n(n):=block(
L:makelist([6*i-1,6*i+1],i,1,floor(n/6)),
caching:length(L),
L1:[],
for i from 1 thru caching do if map(primep,L[i])=[true,true] then push(L[i],L1),
append([[3,5]],reverse(L1)),
length(%%));
 
/* Test cases */
twin_primes_under_n(10);
twin_primes_under_n(100);
twin_primes_under_n(1000);
twin_primes_under_n(10000);
twin_primes_under_n(100000);
</syntaxhighlight>
{{out}}
<pre>
2
8
35
205
1224
</pre>
 
=={{header|Nim}}==
Line 737 ⟶ 1,304:
As, except for the pair (3, 5), all twins pairs are composed of a number congruent to 2 modulo 3 and a number congruent to 1 modulo 3, we can save some time by using a step of 6. Unfortunately, this is the filling of the sieve which is the most time consuming, so the gain is not very important (on our computer, half a second on a total time of 8.3 s).
 
<langsyntaxhighlight Nimlang="nim">import math, strformat, strutils
 
const N = 1_000_000_000
Line 766 ⟶ 1,333:
if lim > N: break
 
composite.findTwins()</langsyntaxhighlight>
 
{{out}}
Line 780 ⟶ 1,347:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict;
use warnings;
 
Line 787 ⟶ 1,354:
sub comma { reverse ((reverse shift) =~ s/(.{3})/$1,/gr) =~ s/^,//r }
 
printf "Twin prime pairs less than %14s: %s\n", comma(10**$_), comma count_twins(1, 10**$_) for 1..10;</langsyntaxhighlight>
{{out}}
<pre>Twin prime pairs less than 10: 2
Line 805 ⟶ 1,372:
The time complexity here is all about building a table of primes. It turns out that using the builtin get_prime() is actually faster
than using an explicit sieve (as per Delphi/Go/Wren) due to retaining all the intermediate 0s, not that I particularly expect this to win any performance trophies.
<!--<lang Phix>(phixonline)-->
<syntaxhighlight lang="phix">
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
with javascript_semantics
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
atom t0 = time()
<span style="color: #008080;">function</span> <span style="color: #000000;">twin_primes</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">maxp</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">bool</span> <span style="color: #000000;">both</span><span style="color: #0000FF;">=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
function twin_primes(integer maxp, bool both=true)
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- result</span>
integer n = 0, -- result
<span style="color: #000000;">pn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- next prime index</span>
pn = 2, -- next prime index
<span style="color: #000000;">p</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- a prime, &lt;= maxp</span>
p, -- a prime, <= maxp
<span style="color: #000000;">prev_p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span>
prev_p = 2
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
while true do
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pn</span><span style="color: #0000FF;">)</span>
p = get_prime(pn)
<span style="color: #008080;">if</span> <span style="color: #000000;">both</span> <span style="color: #008080;">and</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">maxp</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if both and p>=maxp then exit end if
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">prev_p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
n += (prev_p = p-2)
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #008080;">not</span> <span style="color: #000000;">both</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">maxp</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if (not both) and p>=maxp then exit end if
<span style="color: #000000;">prev_p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span>
prev_p = p
<span style="color: #000000;">pn</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
pn += 1
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
end while
<span style="color: #008080;">return</span> <span style="color: #000000;">n</span>
return n
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
end function
<span style="color: #004080;">integer</span> <span style="color: #000000;">mp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">6</span> <span style="color: #000080;font-style:italic;">-- prompt_number("Enter limit:")</span>
integer mp = 6 -- prompt_number("Enter limit:")
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Twin prime pairs less than %,d: %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">mp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">twin_primes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mp</span><span style="color: #0000FF;">)})</span>
printf(1,"Twin prime pairs less than %,d: %,d\n",{mp,twin_primes(mp)})
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Twin prime pairs less than %,d: %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">mp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">twin_primes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">mp</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)})</span>
printf(1,"Twin prime pairs less than %,d: %,d\n",{mp,twin_primes(mp,false)})
<span style="color: #008080;">for</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
for p=1 to 9 do
<span style="color: #004080;">integer</span> <span style="color: #000000;">p10</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
integer p10 = power(10,p)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Twin prime pairs less than %,d: %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">p10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">twin_primes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p10</span><span style="color: #0000FF;">)})</span>
printf(1,"Twin prime pairs less than %,d: %,d\n",{p10,twin_primes(p10)})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">)</span>
?elapsed(time()-t0)
<!--</lang>-->
</syntaxhighlight>
{{out}}
<pre>
Line 846 ⟶ 1,414:
Twin prime pairs less than 1,000,000,000: 3,424,506
"16.2s"
</pre>
=== using primesieve ===
Windows 64-bit only, unless you can find/make a suitable dll/so.<br>
Note that unlike the above this version of twin_primes() carries on from where it left off.
<syntaxhighlight lang="phix">
requires(WINDOWS)
requires(64,true)
include builtins/primesieve.e
atom t0 = time()
integer n = 0, p = 2, prev_p = 2
function twin_primes(integer maxp, bool both=true)
while true do
if both and p>=maxp then exit end if
n += (prev_p = p-2)
if (not both) and p>=maxp then exit end if
prev_p = p
p = primesieve_next_prime()
end while
return n
end function
for i=1 to 11 do
integer p10 = power(10,i)
printf(1,"Twin prime pairs less than %,d: %,d\n",{p10,twin_primes(p10)})
end for
?elapsed(time()-t0)
</syntaxhighlight>
{{out}}
Same as above, which it completes in 7.2s (and 1e10 in 1 min 6s), less the 6's and plus two more lines:
<pre>
Twin prime pairs less than 10: 2
Twin prime pairs less than 100: 8
Twin prime pairs less than 1,000: 35
Twin prime pairs less than 10,000: 205
Twin prime pairs less than 100,000: 1,224
Twin prime pairs less than 1,000,000: 8,169
Twin prime pairs less than 10,000,000: 58,980
Twin prime pairs less than 100,000,000: 440,312
Twin prime pairs less than 1,000,000,000: 3,424,506
Twin prime pairs less than 10,000,000,000: 27,412,679
Twin prime pairs less than 100,000,000,000: 224,376,048
"10 minutes and 25s"
</pre>
 
=={{header|PureBasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="purebasic">
Procedure isPrime(v.i)
If v <= 1 : ProcedureReturn #False
ElseIf v < 4 : ProcedureReturn #True
ElseIf v % 2 = 0 : ProcedureReturn #False
ElseIf v < 9 : ProcedureReturn #True
ElseIf v % 3 = 0 : ProcedureReturn #False
Else
Protected r = Round(Sqr(v), #PB_Round_Down)
Protected f = 5
While f <= r
If v % f = 0 Or v % (f + 2) = 0
ProcedureReturn #False
EndIf
f + 6
Wend
EndIf
ProcedureReturn #True
EndProcedure
 
Procedure paresDePrimos(limite.d)
p1.i = 0
p2.i = 1
p3.i = 1
count.i = 0
For i.i = 5 To limite
p3 = p2
p2 = p1
p1 = isPrime(i)
If p3 And p1
count + 1
EndIf
Next i
ProcedureReturn count
EndProcedure
 
OpenConsole()
n.i = 1
For i.i = 1 To 6
n = n * 10
PrintN("pares de primos gemelos por debajo de < " + Str(n) + " : " + Str(paresDePrimos(n)))
Next i
PrintN(#CRLF$ + "--- terminado, pulsa RETURN---"): Input()
CloseConsole()
End
</syntaxhighlight>
{{out}}
<pre>
Similar a la entrada de FreeBASIC.
</pre>
 
 
=={{header|Python}}==
 
<syntaxhighlight lang="python">primes = [2, 3, 5, 7, 11, 13, 17, 19]
 
 
def count_twin_primes(limit: int) -> int:
global primes
if limit > primes[-1]:
ram_limit = primes[-1] + 90000000 - len(primes)
reasonable_limit = min(limit, primes[-1] ** 2, ram_limit) - 1
 
while reasonable_limit < limit:
ram_limit = primes[-1] + 90000000 - len(primes)
if ram_limit > primes[-1]:
reasonable_limit = min(limit, primes[-1] ** 2, ram_limit)
else:
reasonable_limit = min(limit, primes[-1] ** 2)
 
sieve = list({x for prime in primes for x in
range(primes[-1] + prime - (primes[-1] % prime), reasonable_limit, prime)})
primes += [x - 1 for i, x in enumerate(sieve) if i and x - 1 != sieve[i - 1] and x - 1 < limit]
 
count = len([(x, y) for (x, y) in zip(primes, primes[1:]) if x + 2 == y])
 
return count
 
 
def test(limit: int):
count = count_twin_primes(limit)
print(f"Number of twin prime pairs less than {limit} is {count}\n")
 
 
test(10)
test(100)
test(1000)
test(10000)
test(100000)
test(1000000)
test(10000000)
test(100000000)</syntaxhighlight>
{{out}}
<pre>Number of twin prime pairs less than 10 is 2
Number of twin prime pairs less than 100 is 8
Number of twin prime pairs less than 1000 is 35
Number of twin prime pairs less than 10000 is 205
Number of twin prime pairs less than 100000 is 1224
Number of twin prime pairs less than 1000000 is 8169
Number of twin prime pairs less than 10000000 is 58980
Number of twin prime pairs less than 100000000 is 440312
</pre>
 
=={{header|Quackery}}==
 
<code>primes</code> and <code>eratosthenes</code> are defined at [[Sieve of Eratosthenes#Quackery]].
 
<syntaxhighlight lang="quackery"> [ dup dip
[ eratosthenes
0 1 primes share ]
bit 1 - & 1 >>
[ dup while
dup 5 & 5 = if
[ rot 1+ unrot ]
2 >>
dip [ 2 + ]
again ]
2drop ] is twinprimes ( n --> [ )
 
5 times
[ say "Number of twin primes below "
10 i^ 1+ ** dup echo
say " is "
twinprimes echo say "." cr ]</syntaxhighlight>
 
{{out}}
 
<pre>Number of twin primes below 10 is 2.
Number of twin primes below 100 is 8.
Number of twin primes below 1000 is 35.
Number of twin primes below 10000 is 205.
Number of twin primes below 100000 is 1224.
</pre>
 
Line 851 ⟶ 1,596:
{{works with|Rakudo|2020.07}}
 
<syntaxhighlight lang="raku" perl6line>use Lingua::EN::Numbers;
 
use Math::Primesieve;
Line 857 ⟶ 1,602:
my $p = Math::Primesieve.new;
 
printf "Twin prime pairs less than %14s17s: %s\n", comma(10**$_), comma $p.count(10**$_, :twins) for 1 .. 1012;</lang>
say (now - INIT now).round(.01) ~ ' seconds';</syntaxhighlight>
{{out}}
<pre>Twin prime pairs less than 10: 2
Twin prime pairs less than 100: 8
Twin prime pairs less than 1,000: 35
Twin prime pairs less than 10,000: 205
Twin prime pairs less than 100,000: 1,224
Twin prime pairs less than 1,000,000: 8,169
Twin prime pairs less than 10,000,000: 58,980
Twin prime pairs less than 100,000,000: 440,312
Twin prime pairs less than 1,000,000,000: 3,424,506
Twin prime pairs less than 10,000,000,000: 27,412,679</pre>
Twin prime pairs less than 100,000,000,000: 224,376,048
Twin prime pairs less than 1,000,000,000,000: 1,870,585,220
6.89 seconds</pre>
 
=={{header|REXX}}==
=== straight-forward prime generator ===
The &nbsp; '''genP''' &nbsp; function could be optimized for higher specifications of the limit(s).
<langsyntaxhighlight lang="rexx">/*REXX pgm counts the number of twin prime pairs under a specified number N (or a list).*/
parse arg $ . /*get optional number of primes to find*/
if $='' | $="," then $= 10 100 1000 10000 100000 1000000 10000000 /*No $? Use default.*/
Line 886 ⟶ 1,635:
commas: parse arg _; do ?=length(_)-3 to 1 by -3; _=insert(',', _, ?); end; return _
/*──────────────────────────────────────────────────────────────────────────────────────*/
genP: parse arg y; @.1=2; @.2=3; @.3=5; @.4=7; @.5=11; @.6=13; #= 56; tp= 2; tpsq.6= 2169
if y>10 then tp= tp+1
do j=13 by 2 while j<y /*continue on with the next odd prime. */
do j=@.#+2 parseby var2 j ''for max(0, y%2-@.#%2-1 _ ) /*obtainfind theodd lastprimes digitfrom ofhere theon. J var.*/
parse var ifj _ '' -1 _ ==5 then iterate /*isobtain thisthe integerlast a multipledigit of five?the J var.*/
if j // 3 _==05 then iterate; if j// 3==0 then iterate /*J "÷ by 5? " J ÷ by " " " " three3? */
if j // 7 ==0 then iterate; if j//11==0 then iterate /* " " " 7? " " " seven11? */
if j //11 ==0 then iterate /* " " " " " " eleven?*/
/* [↓] divide by the primes. ___ */
do k=6 to # while k*sq.k<=j /*divide J by other primes ≤ √ J */
if j//@.k == 0 then iterate j /*÷ by prev. prime? ¬prime ___ */
end /*k*/ /* [↑] only divide up to √ J */
prev= @.#; #= # + 1; sq.#= j*j; @.#= j /*save prev. P; bump # primes; assign P*/
if j-2==prev then tp= tp + 1 /*This & previous prime twins? Bump TP.*/
end /*j*/; return tp</syntaxhighlight>
return tp</lang>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 915 ⟶ 1,662:
This REXX version has some optimization for prime generation.
 
This version won't return a correct value (for the number of twin pairs) for a limit < 73 &nbsp; (because of the manner in which low
<br>which low primes are generated from a list), &nbsp; however, &nbsp; the primes are returned from the function.
primes are generated).
<langsyntaxhighlight lang="rexx">/*REXX pgm counts the number of twin prime pairs under a specified number N (or a list).*/
parse arg $ . /*get optional number of primes to find*/
if $='' | $="," then $= 100 1000 10000 100000 1000000 10000000 /*No $? Use default.*/
Line 931 ⟶ 1,678:
/*──────────────────────────────────────────────────────────────────────────────────────*/
genP: arg y; _= 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101
tp=8; #= words(_); tpsq.103= 8 103*103 /*#: number of prims; TP: # twin pairs.*/
do aa=1 for #; @.aa= word(_, aa) /*assign some low primes for quick ÷'s.*/
end /*aa*/
Line 941 ⟶ 1,688:
 
do a=4 for 23 /*divide low primes starting with seven*/
if j//@.a ==0 then iterate j /*is integer a multilemultiple of a low prime? */
end /*a*/
/* [↓] divide by the primes. ___ */
do k=27 to # while sq.k*k <= j /*divide J by other primes ≤ √ J */
if j//@.k ==0 then iterate j /*÷ by prev. prime? ¬prime ___ */
end /*k*/ /* [↑] only divide up to √ J */
prev= @.#; #= # + 1; sq.#= j*j; @.#= j /*save prev. P; bump # primes; assign P*/
if j-2==prev then tp= tp + 1 /*This & previous prime twins? Bump TP.*/
end /*j*/; return tp</syntaxhighlight><br><br>
return tp</lang><br><br>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
load "stdlib.ring"
 
Line 989 ⟶ 1,735:
see "twin prime pairs below " + pow(10,n) + ": " + numTwin[n] + nl + nl
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,012 ⟶ 1,758:
Maximum: 10000000
twin prime pairs below 10000000: 58980
</pre>
 
=={{header|RPL}}==
{{works with|HP|49}}
« → m
« 0 2
'''WHILE''' DUP m < '''REPEAT'''
DUP NEXTPRIME DUP ROT - 2 == ROT + SWAP
'''END''' DROP
» » ‘<span style="color:blue">TWINP</span>’ STO
 
100000 <span style="color:blue">TWINP</span>
{{out}}
<pre>
1: 1224
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">require 'prime'
 
(1..8).each do |n|
count = Prime.each(10**n).each_cons(2).count{|p1, p2| p2-p1 == 2}
puts "Twin primes below 10**#{n}: #{count}"
end
</syntaxhighlight>
{{out}}
<pre>Twin primes below 10**1: 2
Twin primes below 10**2: 8
Twin primes below 10**3: 35
Twin primes below 10**4: 205
Twin primes below 10**5: 1224
Twin primes below 10**6: 8169
Twin primes below 10**7: 58980
Twin primes below 10**8: 440312
</pre>
 
Line 1,017 ⟶ 1,797:
Limits can be specified on the command line, otherwise the twin prime counts for powers
of ten from 1 to 10 are shown.
<langsyntaxhighlight lang="rust">// [dependencies]
// primal = "0.3"
// num-format = "0.4"
Line 1,077 ⟶ 1,857:
twin_prime_count_for_powers_of_ten(10);
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,092 ⟶ 1,872:
Number of twin prime pairs less than 10,000,000,000 is 27,412,679
</pre>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">func twin_primes_count(upto) {
var count = 0
var p1 = 2
each_prime(3, upto, {|p2|
if (p2 - p1 == 2) {
++count
}
p1 = p2
})
return count
}
 
for n in (1..9) {
var count = twin_primes_count(10**n)
say "There are #{count} twin primes <= 10^#{n}"
}</syntaxhighlight>
{{out}}
<pre>
There are 2 twin primes <= 10^1
There are 8 twin primes <= 10^2
There are 35 twin primes <= 10^3
There are 205 twin primes <= 10^4
There are 1224 twin primes <= 10^5
There are 8169 twin primes <= 10^6
There are 58980 twin primes <= 10^7
There are 440312 twin primes <= 10^8
There are 3424506 twin primes <= 10^9
</pre>
 
=={{header|Visual Basic}}==
{{works with|Visual Basic|4}}
{{works with|Visual Basic|5}}
{{works with|Visual Basic|6}}
<syntaxhighlight lang="vb">Function IsPrime(x As Long) As Boolean
Dim i As Long
If x Mod 2 = 0 Then
Exit Function
Else
For i = 3 To Int(Sqr(x)) Step 2
If x Mod i = 0 Then Exit Function
Next i
End If
IsPrime = True
End Function
 
Function TwinPrimePairs(max As Long) As Long
Dim p1 As Boolean, p2 As Boolean, count As Long, i As Long
p2 = True
For i = 5 To max Step 2
p1 = p2
p2 = IsPrime(i)
If p1 And p2 Then count = count + 1
Next i
TwinPrimePairs = count
End Function
 
Sub Test(x As Long)
Debug.Print "Twin prime pairs below" + Str(x) + ":" + Str(TwinPrimePairs(x))
End Sub
 
Sub Main()
Test 10
Test 100
Test 1000
Test 10000
Test 100000
Test 1000000
Test 10000000
End Sub</syntaxhighlight>
{{out}}
<pre>Twin prime pairs below 10: 2
Twin prime pairs below 100: 8
Twin prime pairs below 1000: 35
Twin prime pairs below 10000: 205
Twin prime pairs below 100000: 1224
Twin prime pairs below 1000000: 8169
Twin prime pairs below 10000000: 58980</pre>
 
=={{header|Wren}}==
{{libheader|Wren-math}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./math" for Int
import "./fmt" for Fmt
 
var c = Int.primeSieve(1e8-1, false)
Line 1,112 ⟶ 1,971:
start = limit + 1
limit = limit * 10
}</langsyntaxhighlight>
 
{{out}}
Line 1,123 ⟶ 1,982:
Under 10,000,000 there are 58,980 pairs of twin primes.
Under 100,000,000 there are 440,312 pairs of twin primes.
</pre>
 
=={{header|XPL0}}==
100 million takes 150 seconds on Pi4.
<syntaxhighlight lang="xpl0">func IsPrime(N); \Return 'true' if N is prime
int N, I;
[if N <= 2 then return N = 2;
if (N&1) = 0 then \even >2\ return false;
for I:= 3 to sqrt(N) do
[if rem(N/I) = 0 then return false;
I:= I+1;
];
return true;
];
 
func Twins(Limit);
int Limit, C, N;
[C:= 0; N:= 3;
repeat if IsPrime(N) then
loop [N:= N+2;
if N >= Limit then return C;
if not IsPrime(N) then quit;
C:= C+1;
];
N:= N+2;
until N >= Limit;
return C;
];
 
[IntOut(0, Twins(100_000)); CrLf(0);
IntOut(0, Twins(10_000_000)); CrLf(0);
IntOut(0, Twins(100_000_000)); CrLf(0);
]</syntaxhighlight>
 
{{out}}
<pre>
1224
58980
440312
</pre>
 
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="yabasic">
sub isPrime(v)
if v < 2 then return False : fi
if mod(v, 2) = 0 then return v = 2 : fi
if mod(v, 3) = 0 then return v = 3 : fi
d = 5
while d * d <= v
if mod(v, d) = 0 then return False else d = d + 2 : fi
wend
return True
end sub
 
sub paresDePrimos(limite)
p1 = 0 : p2 = 1 : p3 = 1 : count = 0
for i = 5 to limite
p3 = p2
p2 = p1
p1 = isPrime(i)
if (p3 and p1) then count = count + 1 : fi
next i
return count
end sub
 
n = 1
for i = 1 to 6
n = n * 10
print "pares de primos gemelos por debajo de < ", n, " : ", paresDePrimos(n)
next i
end
</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de FreeBASIC.
</pre>
9,479

edits