Habe ich einen Prime Twin?

23

Eine Ganzzahl ist genau dann eine Primzahl, wenn sie positiv ist und genau zwei unterschiedliche Teiler hat: 1 und sich selbst. Ein Twin-Prim-Paar besteht aus zwei Elementen: pund p±2, die beide Primzahlen sind.

Sie erhalten eine positive Ganzzahl als Eingabe. Ihre Aufgabe ist es, eine Wahrheit / Falschheit zurückzugeben, abhängig davon, ob die angegebene Ganzzahl zu einem Zwillingspaar gehört, und zwar gemäß den Standardregeln für (die Werte müssen konsistent sein).

Testfälle

  • Wahrheit (Twin Primes): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Falsy (nicht Twin Primes): 2, 15, 20, 23, 37, 47, 97, 120, 566

Das ist , also gewinnt der kürzeste Code in Bytes!

Taylor Scott
quelle
ist 13 ein Prime Twin?
LiefdeWen
@LiefdeWen Ja, weil es zu dem Paar gehört (11, 13)
daniero

Antworten:

18

Brachylog , 9 8 Bytes

ṗ∧4√;?+ṗ

Probieren Sie es online!

Erläuterung

ṗ           Input is prime
 ∧          And
  4√        A number whose square is 4 (i.e. -2 or 2)
    ;?+     That number + the Input…
       ṗ    …is prime
Tödlich
quelle
2
Schlagen Jelly und Binden 05AB1E, schön
Stephen
3
Clevere Verwendung! +1
Erik der Outgolfer
11

Gelee , 10 9 Bytes

%6+_2_ÆP⁺

Probieren Sie es online!

Hintergrund

Mit Ausnahme von (3, 5) haben alle Twin-Prim-Paare die Form (6k - 1, 6k + 1) .

Da (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 und
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , bei einer Eingabe von n> 3 ist es ausreichend zu prüfen, ob n und n + n% 6 - 3 beide Primzahlen sind.

Diese Formel geschieht für die Arbeit n = 3 als auch, wie 3 + 3% 6 - 3 = 3 Primzahl ist und 3 ist ein Doppel prime.

Wie es funktioniert

%6+_2_ÆP⁺  Main link. Argument: n

%6         Compute n%6.
  +        Add n to the result.
   _2      Subtract 2.
     _ÆP   Subtract 1 if n is prime, 0 if not.
           If n is not a prime, since (n + n%6 - 2) is always even, this can only
           yield a prime if (n + n%6 - 2 = 2), which happens only when n = 2.
        ⁺  Call ÆP again, testing the result for primality.
Dennis
quelle
7

Python 3 , 53 Bytes

lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2

Probieren Sie es online!

Hintergrund

Alle Ganzzahlen haben eine der folgenden Formen mit der Ganzzahl k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Da 6k - 2 , 6k und 6k + 2 alle gerade sind und 6k - 3 durch 3 teilbar ist , müssen alle Primzahlen außer 2 und 3 die Form 6k - 1 oder 6k + 1 haben . Da die Differenz eines Twin-Prim-Paares mit Ausnahme von (3, 5) 2 beträgt , haben alle Twin-Prim-Paare die Form (6k - 1, 6k + 1) .

Sei n von der Form 6k ± 1 .

  • Wenn n = 6 k & supmin; ¹ , dann ist n + n% 6-3 = 6 k & supmin ; ¹ + (6 k & supmin; ¹)% 6-3 = 6 k & supmin ; ¹ + 5-3 = 6 k & supmin ; ¹ .

  • Wenn n = 6k + 1 , dann ist n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

So , wenn n Teil eines Primzahlzwillingspaar und ist n ≠ 3 , es Zwilling wird n + n% 6 - 3 .

Wie es funktioniert

In Python ist kein Primalitätstest integriert. Es gibt zwar kurze Wege, um eine einzelne Zahl auf ihre Ursprünglichkeit zu prüfen, aber dies für zwei Zahlen zu tun, wäre langwierig. Wir werden stattdessen mit Divisoren arbeiten.

sum((n+n%6-3)*n%k<1for k in range(2,4*n))

zählt, wie viele ganze Zahlen k im Intervall [2, 4n) (n + n% 6 - 3) n gleichmäßig teilen , dh, es zählt die Anzahl der Teiler von (n + n% 6 - 3) n im Intervall [2 4n) . Wir behaupten , dass diese Anzahl ist 2 , wenn und nur wenn n Teil eines Primzahlzwillingspaares ist.

  • Wenn n = 3 (ein Doppelprimus) ist, hat (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 zwei Teiler ( 3 und 9 ) in [2, 12) .

  • Wenn n> 3 ein Doppelprimus ist, wie zuvor gesehen, ist m: = n + n% 6 - 3 sein Zwilling. In diesem Fall hat mn genau vier Teiler: 1, m, n, mn .

    Da n> 3 ist , haben wir m> 4 , also fallen 4n <mn und genau zwei Teiler ( m und n ) in das Intervall [2, 4n) .

  • Wenn n = 1 , dann hat (n + n% 6 - 3) n = 1 + 1 - 3 = -1 keine Teiler in [2, 4) .

  • Wenn n = 2 , dann hat (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 einen Teiler (selbst) in [2, 8) .

  • Wenn n = 4 , dann hat (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 vier Teiler ( 2 , 4 , 5 und 10 ) in [2, 16) .

  • Wenn n> 4 gerade ist, teilen 2 , n / 2 und n alle n und daher (n + n% 6 - 3) n . Wir haben n / 2> 2 seit n> 4 , also gibt es mindestens drei Teiler in [2, 4n) .

  • Wenn n = 9 , dann hat (n + n% 6-3) n = 9 (9 + 3-3) = 81 drei Teiler ( 3 , 9 und 21 ) in [2, 36) .

  • Wenn n> 9 ein Vielfaches von 3 ist , teilen 3 , n / 3 und n alle n und daher (n + n% 6 - 3) n . Wir haben n / 3> 3 seit n> 9 , also gibt es mindestens drei Teiler in [2, 4n) .

  • Wenn schließlich n = 6k ± 1> 4 kein Doppelprimus ist, muss entweder n oder m: = n + n% 6 - 3 zusammengesetzt sein und daher einen geeigneten Divisor d> 1 zulassen .

    Da entweder n = m + 2 oder m = n + 2 und n, m> 4 , die ganzen Zahlen d , m und n sind unterschiedliche Divisoren mn . Ist m <n + 3 <4n, da n> 1 , so hat mn in [2, 4n) mindestens drei Teiler .

Dennis
quelle
Wow. Solch ein kurzer Code und doch so viele Sonderfälle müssen richtig behandelt werden. Aus irgendeinem Grund sagst du Python 3? Soweit ich das
beurteilen
Ja, dies funktioniert auch in Python 2. Die 3 ist Teil des automatisch generierten SE-Posts von TIO.
Dennis
5

05AB1E , 10 9 Bytes

1 Byte dank Datboi gespeichert

ÌIÍ‚pZIp*

Probieren Sie es online! oder als Test Suite

Erläuterung

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply
Emigna
quelle
1
Verwenden Sie ÌIÍ‚statt 40SÍ+für -1 Byte
Datboi
3

Mathematica, 33 Bytes

(P=PrimeQ;P@#&&(P[#+2]||P[#-2]))&

Probieren Sie es online!

J42161217
quelle
3

MATL , 11 Bytes

HOht_v+ZpAa

Ausgang ist 0oder 1.

Probieren Sie es online!

Erläuterung

H    % Push 2
O    % Push 0
h    % Concatenate horizontally: gives [2 0]
t_   % Push a negated copy: [-2 0]
v    % Concatenate vertically: [2 0; -2 0]
+    % Add to implicit input
Zp   % Isprime
A    % All: true for columns that only contain nonzeros
a    % Any: true if there is at least a nonzero. Implicit display
Luis Mendo
quelle
3

Pyth , 14 12 11 Bytes

&P_QP-3+%Q6

Test Suite.


3 Bytes mit der Formel in der Antwort von @Dennis gespeichert. 1 Byte dank @Dennis gespeichert.


Pyth , 14 Byte * Anfangslösung

&|P_ttQP_hhQP_

Test Suite.

Mr. Xcoder
quelle
2

Retina , 45 44 Bytes

.*
$*
11(1+)
$1¶$&¶11$&
m`^(11+)\1+$

1<`1¶1

Gibt 1 zurück, wenn der Eingang ein Doppelprimus ist, andernfalls 0

Probieren Sie es online!

Erläuterung

.*              
$*

In Unary konvertieren

11(1+)          
$1¶$&¶11$&

Setzen Sie n-2, n und n + 2 in ihre eigenen Zeilen

m`^(11+)\1+$   

(Neue Zeile am Ende) Entfernen Sie alle Verbundwerkstoffe, die größer als 1 sind

1<`1¶1          

Überprüfe, ob es zwei aufeinanderfolgende Primzahlen gibt (oder 1,3, weil 3 eine Doppelprimzahl ist)

PunPun1000
quelle
2

Perl 6 , 24 Bytes

?(*+(0&(-2|2))).is-prime

Probieren Sie es online!

*ist das Argument für diese anonyme Funktion. 0 & (-2 | 2)ist die Kreuzung, die aus den Zahlen 0UND entweder -2ODER besteht 2. Das Hinzufügen *zu dieser Kreuzung erzeugt die Kreuzung der Zahl *UND einer der Zahlen * - 2ODER * + 2. Der Aufruf der is-primeMethode an dieser Junction gibt einen Wahrheitswert zurück, wenn *prime AND * - 2OR * + 2ist. Schließlich wird die ?wahrheitsgemäße Verknüpfung auf einen Booleschen Wert reduziert, wodurch die Bedingung für konsistente Rückgabewerte erfüllt wird.

Sean
quelle
2

JavaScript, 91 Bytes , 81 Bytes dank Jared Smith

p=n=>{for(i=2;i<n;)if(n%i++==0)return !!0;return n>1},t=n=>p(n)&&(p(n+2)||p(n-2))

Erläuterung

pgibt an, ob die angegebene Zahl neine Primzahl ist oder nicht, und ttestet die angegebene Zahl nund n±2.

Beispiel

Serge K.
quelle
Sie brauchen nicht var, die Klammern um die nin der Funktionsdefinition usw.
Jared Smith
Ich denke, Sie können Ihr Snippet bearbeiten, um den Wert von nneben dem Wert von t(n)für mehr Klarheit anzuzeigen (z. B. 7: true)
Taylor Scott
1
Vielen Dank an Sie beide
Serge K.
1

J, 23 Bytes

1&p:*.0<+/@(1 p:_2 2+])

Probieren Sie es online!

Wie?

1&p:                               is the arg a prime?
    *.                             boolean and
                                   one of +2 or -2 also a prime
                     (1 p:_2 2+])  length 2 list of booleans indicating if -2 and +2 are primes
               @                   pipe the result into...
      0<+/                         is the sum of the elements greater than 0
                                   ie, at least one true
Jona
quelle
16 Bytes mit3>0#.@p:0 2 _2&+
Meilen
@miles nett. sehr geschickte Verwendung von Base 2 zur Verarbeitung der Ergebnisse.
Jonah
1

Ruby, 38 + 6 = 44 Bytes

Benötigt Optionen -rprime.

->n{n.prime?&[n-2,n+2].any?(&:prime?)}

Probieren Sie es online!

daniero
quelle
1
Sie können ein Byte speichern verwenden &statt&&
Piccolo
1

JavaScript (ES6), 54 Byte

a=x=>f(x)&(f(x+2)|f(x-2));f=(n,x=n)=>n%--x?f(n,x):x==1

Austin
quelle
1

Excel VBA, 102 100 Bytes

Keine eingebauten Primalitätsfunktionen für VBA :(

Code

Anonyme VBE- Direktfensterfunktion , die Eingaben von der Zelle übernimmt [A1]und entweder 1(wahr) oder 0(falsch) an das VBE- Direktfenster ausgibt

a=[A1]:?p(a)*(p(a-2)Or p(a+2))

Hilfsfunktion

Function p(n)
p=n>2
For i=2To n-1
p=IIf(n Mod i,p,0)
Next
End Function

Alternativ 122 Bytes

Code

Auf rekursiven Primalitätsprüfungsfunktionen basierende Lösung

a=[A1]:?-1=Not(p(a,a-1)Or(p(a-2,a-3)*p(a+2,a+1)))

Hilfsfunktion

Function p(n,m)
If m>1Then p=p(n,m-1)+(n Mod m=0)Else p=n<=0
End Function
Taylor Scott
quelle
0

PHP, 85 Bytes 24 Bytes dank Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}
jahly
quelle
Dies kann erheblich verbessert werden, indem die Namen beider Funktionen auf jeweils 1 Zeichen ab
geändert
2
Benötigt PHP das functionSchlüsselwort nicht mehr?
Titus
0

Python 2 , 75 Bytes

lambda x:p(x)*(p(x-2)|p(x+2))
p=lambda z:(z>1)*all(z%i for i in range(2,z))

Probieren Sie es online!

officialaimm
quelle
0

Japt , 13 Bytes

j ©[U+2U-2]dj

Gibt zurück trueund gibt falsean, ob die Zahl Teil eines Primzahl-Zwillingspaares ist.

Probieren Sie es online!

Erläuterung

Implizit: U= Ganzzahl eingeben

j ©

Überprüfen Sie, ob die Eingabe prime ( j), AND ( ©) ist ...

[U+2U-2]dj

[U+2, U-2]Überprüfen Sie mithilfe des Arrays , ob Elemente dgemäß der Primalitätsfunktion ( j) true ( ) sind .

Implizite Ausgabe des booleschen Ergebnisses von is input prime AND is any ±2 neighbor prime.

Justin Mariner
quelle
Hmm ... Ich fühle mich wie [U+2U-2]könnte viel kürzer sein, aber ich kann nicht herausfinden, wie ...
ETHproductions