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!


ist 13 ein Prime Twin?
LiefdeWen

@LiefdeWen Ja, weil es zu dem Paar gehört (11, 13)
daniero

Antworten:



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.

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 .


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




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


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)


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.


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


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

16 Bytes mit3>0#.@p:0 2 _2&+
Meilen

@miles nett. sehr geschickte Verwendung von Base 2 zur Verarbeitung der Ergebnisse.
Jonah



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


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

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;}

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

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.


Hmm ... Ich fühle mich wie [U+2U-2]könnte viel kürzer sein, aber ich kann nicht herausfinden, wie ...
ETHproductions
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.