Ho un gemello primo?


23

Un intero è primo se e solo se è positivo e ha esattamente 2 divisori distinti: 1 e se stesso. Una coppia di gemelli primi è composta da due elementi: pe p±2, che sono entrambi primi.

Ti verrà dato un numero intero positivo come input. Il tuo compito è quello di restituire una verità / falsità a seconda che il dato intero appartenga a una coppia gemella, seguendo le regole standard (i valori devono essere coerenti).

Casi test

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

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

Questo è , quindi vince il codice più corto in byte!


13 è un gemello primo?
Liefde:

@LiefdeWen Sì, perché appartiene alla coppia (11, 13)
daniero

Risposte:



11

Gelatina , 10 9 byte

%6+_2_ÆP⁺

Provalo online!

sfondo

Con l'eccezione di (3, 5) , tutte le coppie gemelle prime hanno la forma (6k - 1, 6k + 1) .

Poiché (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 e
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 , dato un input n> 3 , è sufficiente verificare se n e n + n% 6 - 3 sono entrambi primi.

Questa formula sembra funzionare per n = 3 , nonché, come 3 + 3% 6 - 3 = 3 è primo e 3 è un numero primo gemello.

Come funziona

%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 byte

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

Provalo online!

sfondo

Tutti i numeri interi assumono una delle seguenti forme, con numero intero k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Poiché 6k - 2 , 6k e 6k + 2 sono tutti pari, e poiché 6k - 3 è divisibile per 3 , tutti i numeri primi tranne 2 e 3 devono essere della forma 6k - 1 o 6k + 1 . Poiché la differenza di una prima coppia gemella è 2 , ad eccezione di (3, 5) , tutte le coppie gemelle prime sono della forma (6k - 1, 6k + 1) .

Sia n nella forma 6k ± 1 .

  • Se n = 6k -1 , allora n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Se n = 6k + 1 , allora n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Pertanto, se n fa parte di una doppia coppia gemella e n ≠ 3 , il suo gemello sarà n + n% 6 - 3 .

Come funziona

Python non ha un test di primalità integrato. Mentre ci sono modi brevi per testare un singolo numero per la primalità, farlo per due numeri sarebbe lungo. Lavoreremo invece con i divisori.

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

conta quanti numeri interi k nell'intervallo [2, 4n) si dividono (n + n% 6 - 3) n in modo uniforme, ovvero conta il numero di divisori di (n + n% 6 - 3) n nell'intervallo [2 , 4n) . Sosteniamo che questo conteggio è 2 se e solo se n fa parte di una doppia coppia gemella.

  • Se n = 3 (un primo gemello), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 ha due divisori ( 3 e 9 ) in [2, 12) .

  • Se n> 3 è un numero primo gemello, come visto prima, m: = n + n% 6 - 3 è il suo gemello. In questo caso, mn ha esattamente quattro divisori: 1, m, n, mn .

    Dato che n> 3 , abbiamo m> 4 , quindi 4n <mn ed esattamente due divisori ( m e n ) rientrano nell'intervallo [2, 4n) .

  • Se n = 1 , allora (n + n% 6 - 3) n = 1 + 1 - 3 = -1 non ha divisori in [2, 4) .

  • Se n = 2 , allora (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 ha un divisore (stesso) in [2, 8) .

  • Se n = 4 , allora (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 ha quattro divisori ( 2 , 4 , 5 e 10 ) in [2, 16) .

  • Se n> 4 è pari, 2 , n / 2 e n tutti dividono n e, quindi, (n + n% 6 - 3) n . Abbiamo n / 2> 2 da n> 4 , quindi ci sono almeno tre divisori in [2, 4n) .

  • Se n = 9 , quindi (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 ha tre divisori ( 3 , 9 e 21 ) in [2, 36) .

  • Se n> 9 è un multiplo di 3 , quindi 3 , n / 3 e n tutti dividono n e, quindi, (n + n% 6 - 3) n . Abbiamo n / 3> 3 da n> 9 , quindi ci sono almeno tre divisori in [2, 4n) .

  • Infine, se n = 6k ± 1> 4 non è un numero primo gemello, n o m: = n + n% 6 - 3 deve essere composto e, quindi, ammettere un divisore appropriato d> 1 .

    Poiché n = m + 2 o m = n + 2 e n, m> 4 , gli interi d , m e n sono divisori distinti di mn . Inoltre, m <n + 3 <4n da n> 1 , quindi mn ha almeno tre divisori in [2, 4n) .


Wow. Tale codice breve e tuttavia così tanti casi speciali che deve gestire correttamente. Qualche motivo per dire Python 3? Per quanto ne so, funziona anche in Python 2.
Kasperd,

Sì, funzionerà altrettanto bene in Python 2. Il 3 fa parte del post SE generato automaticamente da TIO.
Dennis,

5

05AB1E , 10 9 byte

Salvato 1 byte grazie a Datboi

ÌIÍ‚pZIp*

Provalo online! o come una suite di test

Spiegazione

Ì           # push input+2
 IÍ         # push input-2
   ‚        # pair
    p       # isPrime
     Z      # max
      Ip    # push isPrime(input)
        *   # multiply

1
Utilizzare ÌIÍ‚invece di 40SÍ+-1 byte
Datboi



3

MATL , 11 byte

HOht_v+ZpAa

L'output è 0o 1.

Provalo online!

Spiegazione

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 byte

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

1<`1¶1

Restituisce 1 se l'ingresso è un numero primo gemello, 0 altrimenti

Provalo online!

Spiegazione

.*              
$*

Converti in Unario

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

Metti n-2, n e n + 2 sulle loro stesse linee

m`^(11+)\1+$   

(Newline finale) Rimuovi tutti i compositi maggiori di 1

1<`1¶1          

Controlla se ci sono due numeri primi consecutivi (o 1,3 perché 3 è un numero primo gemello)


2

Perl 6 , 24 byte

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

Provalo online!

*è l'argomento di questa funzione anonima. 0 & (-2 | 2)è la giunzione costituita dai numeri 0AND o -2OR 2. L'aggiunta *a questa giunzione produce la giunzione del numero *E uno dei numeri * - 2OR * + 2. Chiamare il is-primemetodo su questa giunzione restituisce un valore di verità se *è primo Eo * - 2OR * + 2sono primi. Infine, ?collassa la vera giunzione con un valore booleano, soddisfacendo la condizione di valori di ritorno coerenti.


2

JavaScript, 91 byte , 81 byte grazie a 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))

Spiegazione

pindica se il numero dato nè primo o no, e tverifica il numero dato ne n±2.

Esempio


Non è necessario var, le parentesi intorno alla nnella definizione della funzione, ecc.
Jared Smith,

Penso che potresti modificare il tuo frammento per mostrare il valore di naccanto al valore di t(n)per maggiore chiarezza (ad es. 7: true)
Taylor Scott

1
Grazie a tutti e due
Serge K.

1

J, 23 byte

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

Provalo online!

Come?

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 byte con3>0#.@p:0 2 _2&+
miglia

@miles nice. uso molto intelligente della base 2 per elaborare i risultati.
Giona


1

Rubino, 38 + 6 = 44 byte

Richiede opzioni -rprime.

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

Provalo online!


1
È possibile salvare un byte utilizzando &invece di&&
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


1

Excel VBA, 102 100 byte

Nessun built-in di primalità per VBA :(

Codice

Funzione di finestra immediata VBE anonima che accetta input dalla cella [A1]e restituisce 1(verità) o 0(falsa) alla finestra immediata di VBE

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

Funzione di aiuto

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

In alternativa, 122 byte

Codice

Soluzione basata sulla funzione di controllo della primalità ricorsiva

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

Funzione di aiuto

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 byte 24 byte grazie a Mayube

e($n){return f($n)&&((f($n-2)||f($n+2)))
f($n){for($i=$n;--$i&&$n%$i;)return $i==1;}

Questo può essere giocato a golf considerevolmente cambiando i nomi di entrambe le funzioni in 1 carattere ciascuno (es. aE b)
Skidsdev

2
PHP non ha più bisogno della functionparola chiave?
Tito


0

Japt , 13 byte

j ©[U+2U-2]dj

ritorna true e falseper se il numero fa parte o meno di una doppia coppia principale.

Provalo online!

Spiegazione

Implicito: U= input intero

j ©

Controlla se l'ingresso è prime ( j), AND ( ©) ...

[U+2U-2]dj

Utilizzando l'array [U+2, U-2], verificare se ci sono elementi true ( d) in base alla funzione primality ( j).

Output implicito del risultato booleano di is input prime AND is any ±2 neighbor prime.


Hmm ... Sento che [U+2U-2]potrebbe essere molto più breve, ma non riesco a capire come ...
ETHproductions,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.