Double Twin Primes: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 496: Line 496:
if isP(P[m]) AND isP(P[m+1]) AND isP(P[m+2]) AND isP(P[m+3])
if isP(P[m]) AND isP(P[m+1]) AND isP(P[m+2]) AND isP(P[m+3])
if (P[m+1] - P[m] = 2) AND (P[m+2] - P[m+1] = 4) AND (P[m+3] - P[m+2] = 2)
if (P[m+1] - P[m] = 2) AND (P[m+2] - P[m+1] = 4) AND (P[m+3] - P[m+2] = 2)
see " " + P[m]+ " " + P[m+1] + " " +
see " " + P[m]+ " " + P[m+1] + " " + P[m+2] + " " + P[m+3] + nl
P[m+2] + " " + P[m+3] + nl
ok
ok
ok
ok

Revision as of 15:18, 25 March 2023

Double Twin 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.

Definition
Let (p1,p2) and (p3,p4) be twin primes where p3 - p2 = 4.
Such primes called Double Twin Primes

Example
[5,7,11,13]
Task
Find and show here all Double Twin Primes under 1000.

See also



ALGOL 68

BEGIN # find some sequences of primes where the gaps between the elements #
      # are 2, 4, 2 - i.e., n, n+2, n+6 and n+8 are all prime             #
    PR read "primes.incl.a68" PR                # include prime utilities #
    []BOOL prime  = PRIMESIEVE 1 000;
    INT    count := 0;
    FOR p FROM LWB prime TO UPB prime - 8 DO
        IF prime[ p ] THEN
            IF prime[ p + 2 ] THEN
                IF prime[ p + 6 ] THEN
                    IF prime[ p + 8 ] THEN
                        count +:= 1;
                        print( ( "["
                               , whole( p,     -4 ), whole( p + 2, -4 )
                               , whole( p + 6, -4 ), whole( p + 8, -4 )
                               , " ]"
                               , newline
                               )
                             )
                    FI
                FI
            FI
        FI
    OD;
    print( ( "Found ", whole( count, 0 ), " double twin primes below ", whole( UPB prime, 0 ), newline ) )
END
Output:
[   5   7  11  13 ]
[  11  13  17  19 ]
[ 101 103 107 109 ]
[ 191 193 197 199 ]
[ 821 823 827 829 ]
Found 5 double twin primes beflow 1000

Arturo

r: range .step: 2 1 1000
r | map 'x -> @[x x+2 x+6 x+8]
  | select => [every? & => prime?]
  | loop => print
Output:
5 7 11 13
11 13 17 19
101 103 107 109
191 193 197 199
821 823 827 829

BASIC

BASIC256

Translation of: FreeBASIC
#include "isPrime.kbs"

num = 3
while num < 992
	if isPrime(num) then
		if isPrime(num+2) then
			if isPrime(num+6) then
				if isPrime(num+8) then print num; " "; num+2; " "; num+6; " "; num+8
			end if
		end if
	end if
	num += 2
end while
end
Output:
Same as FreeBASIC entry.

Gambas

Translation of: FreeBASIC
Public Sub Main() 

  Dim num As Integer = 3 
  Do 
    If isPrime(num) Then 
      If isPrime(num + 2) Then 
        If isPrime(num + 6) Then 
          If isPrime(num + 8) Then Print num; " "; num + 2; " "; num + 6; " "; num + 8 
        End If 
      End If 
    End If 
    num += 2 
  Loop Until num > 992

End 

Public Sub isPrime(ValorEval As Long) As Boolean   
  
  If ValorEval < 2 Then Return False   
  If ValorEval Mod 2 = 0 Then Return ValorEval = 2   
  If ValorEval Mod 3 = 0 Then Return ValorEval = 3   
  Dim d As Long = 5   
  While d * d <= ValorEval   
    If ValorEval Mod d = 0 Then Return False Else d += 2   
  Wend    
  Return True   
  
End Function
Output:
Same as FreeBASIC entry.

PureBasic

Translation of: FreeBASIC
Procedure.b 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

OpenConsole()
num.I = 3
While num < 992
  If isPrime(num):
    If isPrime(num+2):
      If isPrime(num+6):
        If isPrime(num+8):
          PrintN(Str(num) + " " + Str(num+2) + " " + Str(num+6) + " " + Str(num+8))
        EndIf
      EndIf
    EndIf
  EndIf
  num + 2
Wend

Input()
CloseConsole();
Output:
Same as FreeBASIC entry.

Run BASIC

Translation of: FreeBASIC
function isPrime(n)
if n < 2       then isPrime = 0 : goto [exit]
if n = 2       then isPrime = 1 : goto [exit]
if n mod 2 = 0 then isPrime = 0 : goto [exit]
isPrime = 1
for i = 3 to int(n^.5) step 2
  if n mod i = 0 then isPrime = 0 : goto [exit]
next i
[exit]
end function

num = 3
while num < 992
    if isPrime(num) then
        if isPrime(num+2) then
            if isPrime(num+6) then
                if isPrime(num+8) then print num; " "; num+2; " "; num+6; " "; num+8
            end if
        end if
    end if
    num = num + 2
wend
end
Output:
Same as FreeBASIC entry.

Tiny BASIC

REM Rosetta Code problem: https://rosettacode.org/wiki/Double_Twin_Primes
REM by Jjuanhdez, 03/2023

    LET I = 3
 10 LET X = I
    GOSUB 100
	IF Z = 1 THEN LET X = I + 2
	IF Z = 1 THEN GOSUB 100
	IF Z = 1 THEN LET X = I + 6
	IF Z = 1 THEN GOSUB 100	
	IF Z = 1 THEN LET X = I + 8
	IF Z = 1 THEN GOSUB 100
	IF Z = 1 THEN PRINT I, " ", I + 2, " ", I + 6, " ", I + 8 
    LET I = I + 2
	IF I > 992 THEN GOTO 20
	GOTO 10
 20 END

100 REM is X a prime? Z=1 for yes, 0 for no
    LET Z = 1
    IF X = 3 THEN RETURN
    IF X = 2 THEN RETURN    
    LET A = 1
110 LET A = A + 1
    IF (X / A) * A = X THEN GOTO 120
    IF A * A <= X THEN GOTO 110
    RETURN
120 LET Z = 0
    RETURN
Same as FreeBASIC entry.

XBasic

Translation of: BASIC256
Works with: Windows XBasic
PROGRAM  "DoubleTwinPrimes"
VERSION  "0.0000"

DECLARE FUNCTION Entry ()
INTERNAL FUNCTION ISPrime(n%%)

FUNCTION  Entry ()
num%% = 3
DO
  IF ISPrime(num%%) THEN
    IF ISPrime(num%%+2) THEN
      IF ISPrime(num%%+6) THEN
        IF ISPrime(num%%+8) THEN
          PRINT num%%; num%%+2; num%%+6; num%%+8
        ENDIF
      ENDIF
    ENDIF
  ENDIF
  num%% = num%% + 2
LOOP UNTIL num%% > 992
END FUNCTION

FUNCTION ISPrime(n%%)
  IF n%% < 2 THEN RETURN $$FALSE
  IF n%% MOD 2 = 0 THEN RETURN n%% = 2
  IF n%% MOD 3 = 0 THEN RETURN n%% = 3
  d%% = 5
  DO WHILE d%% * d%% <= n%%
      IF n%% MOD d%% = 0 THEN RETURN $$FALSE ELSE d%% = d%% + 2
  LOOP
  RETURN $$TRUE
END FUNCTION
END PROGRAM
Output:
Same as BASIC256 entry.

Yabasic

Translation of: FreeBASIC
//import isPrime

num = 3
repeat
    if isPrime(num) if isPrime(num+2) if isPrime(num+6) if isPrime(num+8) print num, " ", num+2, " ", num+6, " ", num+8
    num = num + 2
until num > 992
end
Output:
Same as FreeBASIC entry.

C

#include <stdio.h>
#include <stdbool.h>

bool isPrime(int n) {
    if (n < 2) return false;
    if (n%2 == 0) return n == 2;
    if (n%3 == 0) return n == 3;
    int d = 5;
    while (d*d <= n) {
        if (n%d == 0) return false;
        d += 2;
        if (n%d == 0) return false;
        d += 4;
    }
    return true;
}

int main() {
    printf("Double twin primes under 1,000:\n");
    for (int i = 3; i < 992; i+=2) {
        if (isPrime(i) && isPrime(i+2) && isPrime(i+6) && isPrime(i+8)) {
            printf("%4d %4d %4d %4d\n", i, i+2, i+6, i+8);
        }
    }    
    return 0;
}
Output:
Double twin primes under 1,000:
   5    7   11   13
  11   13   17   19
 101  103  107  109
 191  193  197  199
 821  823  827  829

Dart

import 'dart:math';

void main() {
  for (int num = 3; num < 992; num += 2) {
    if (isPrime(num) &&
        isPrime(num + 2) &&
        isPrime(num + 6) &&
        isPrime(num + 8)) {
      print("$num ${num + 2} ${num + 6} ${num + 8}");
    }
  }
}

bool isPrime(int n) {
  if (n <= 1) return false;
  if (n == 2) return true;
  for (int i = 2; i <= sqrt(n); ++i) {
    if (n % i == 0) return false;
  }
  return true;
}
Output:
Same as FreeBASIC entry.

FreeBASIC

#include "isprime.bas"

Dim As Uinteger num = 3
Do
    If isPrime(num) Then
        If isPrime(num+2) Then
            If isPrime(num+6) Then
                If isPrime(num+8) Then Print num; " "; num+2; " "; num+6; " "; num+8
            End If
        End If
    End If
    num += 2
Loop Until num > 992

Sleep
Output:
5 7 11 13
11 13 17 19
101 103 107 109
191 193 197 199
821 823 827 829

Go

Translation of: Wren
Library: Go-rcu
package main

import (
    "fmt"
    "rcu"
)

func main() {
    p := rcu.Primes(1000)
    fmt.Println("Double twin primes under 1,000:")
    for i := 1; i < len(p)-3; i++ {
        if p[i+1]-p[i] == 2 && p[i+2]-p[i+1] == 4 && p[i+3]-p[i+2] == 2 {
            fmt.Printf("%4d\n", p[i:i+4])
        }
    }
}
Output:
Double twin primes under 1,000:
[   5    7   11   13]
[  11   13   17   19]
[ 101  103  107  109]
[ 191  193  197  199]
[ 821  823  827  829]

Julia

Translation of: C
using Primes
using Printf

function printdt(N)
    @printf("Double twin primes under 1,000:\n")
    for i in 3:2:N-8
        if isprime(i) && isprime(i+2) && isprime(i+6) && isprime(i+8)
            @printf("%4d %4d %4d %4d\n", i, i+2, i+6, i+8)
        end
    end
end

printdt(1000)
Output:

Same as C example.

Perl

Library: ntheory
use v5.36;
use ntheory 'is_prime';

sub dt ($p) { map { $p + $_ } <0 2 6 8> }
for my $n (1..1000) { say "@{[dt $n]}" if 4 == +(grep { is_prime $_ } dt $n) }
Output:
5 7 11 13
11 13 17 19
101 103 107 109
191 193 197 199
821 823 827 829

Phix

with javascript_semantics
sequence p = get_primes_le(1000)
for i=1 to length(p)-3 do
    if p[i+3]-p[i]=8 and p[i+2]-p[i]!=4 then
        printf(1,"%s\n",join(p[i..i+3],fmt:="%4d"))
    end if
end for
Output:
   5    7   11   13
  11   13   17   19
 101  103  107  109
 191  193  197  199
 821  823  827  829

Python

#!/usr/bin/python

def isPrime(n):
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False        
    return True
    
if __name__ == "__main__":
    num = 3
    while num <= 1000:
        if isPrime(num):
            if isPrime(num+2):
                if isPrime(num+6):
                    if isPrime(num+8):
                        print(num, num+2, num+6, num+8, sep="\t")
        num += 2
Output:
5	7	11	13
11	13	17	19
101	103	107	109
191	193	197	199
821	823	827	829

Raku

Cousin twin primes:

sub dt { $^p, $p+2, $p+6, $p+8 }
.&dt.say for (^1000).grep: { all .&dt».is-prime };
Output:
(5 7 11 13)
(11 13 17 19)
(101 103 107 109)
(191 193 197 199)
(821 823 827 829)

Ring

see "working..." + nl
P = []

limit = 1000
for n =1 to limit
    if isP(n)
       add(P,n)
    ok
next
lenP = len(P)-3
for m = 1 to lenP
    if isP(P[m]) AND isP(P[m+1]) AND isP(P[m+2]) AND isP(P[m+3])
       if (P[m+1] - P[m] = 2) AND (P[m+2] - P[m+1] = 4) AND (P[m+3] - P[m+2] = 2)
          see " " + P[m]+ " " + P[m+1] + " " + P[m+2] + " " + P[m+3] + nl
       ok
    ok
next

see "done..." + nl

func isP num
     if (num <= 1) return 0 ok
     if (num % 2 = 0 AND num != 2) return 0 ok
     
     for i = 3 to floor(num / 2) -1 step 2
         if (num % i = 0) return 0 ok
     next
return 1
Output:
works...
 5 7 11 13
 11 13 17 19
 101 103 107 109
 191 193 197 199
 821 823 827 829
done...

Wren

Library: Wren-math
Library: Wren-fmt
import "./math" for Int
import "./fmt" for Fmt

var p = Int.primeSieve(1000)
System.print("Double twin primes under 1,000:")
for (i in 1...p.count-3) {
    if (p[i+1] - p[i] == 2 && p[i+2] - p[i+1] == 4 && p[i+3] - p[i+2] == 2) {
        Fmt.aprint(p[i..i+3], 4, 0, "")
    }
}
Output:
Double twin primes under 1,000:
   5    7   11   13
  11   13   17   19
 101  103  107  109
 191  193  197  199
 821  823  827  829

XPL0

func IsPrime(N);        \Return 'true' if odd N is prime
int  N, D;
[for D:= 3 to sqrt(N) do
    [if rem(N/D) = 0 then return false;
    D:= D+1;
    ];
return true;
];

int N;
[N:= 3;
repeat  if IsPrime(N) then
          if IsPrime(N+2) then
            if IsPrime(N+6) then
              if IsPrime(N+8) then
                [IntOut(0, N);   ChOut(0, ^ );
                 IntOut(0, N+2); ChOut(0, ^ );
                 IntOut(0, N+6); ChOut(0, ^ );
                 IntOut(0, N+8); CrLf(0);
                ];
        N:= N+2;
until N >= 1000-8;
]
Output:
5 7 11 13
11 13 17 19
101 103 107 109
191 193 197 199
821 823 827 829