Czy mam najlepszego bliźniaka?


23

Liczba całkowita jest liczbą pierwszą wtedy i tylko wtedy, gdy jest dodatnia i ma dokładnie 2 różne dzielniki: 1 i siebie. Podwójna liczba pierwsza składa się z dwóch elementów: pi p±2oba są pierwszymi.

Jako dane wejściowe otrzymasz dodatnią liczbę całkowitą. Twoim zadaniem jest zwrócenie wartości prawda / fałsz w zależności od tego, czy dana liczba całkowita należy do pary podwójnej, zgodnie ze standardowym regułami (wartości muszą być spójne).

Przypadki testowe

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

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

To jest , więc wygrywa najkrótszy kod w bajtach!


czy 13 jest najlepszym bliźniakiem?
LiefdeWen

@LiefdeWen Tak, ponieważ należy do pary (11, 13)
daniero

Odpowiedzi:



11

Galaretka , 10 9 bajtów

%6+_2_ÆP⁺

Wypróbuj online!

tło

Z wyjątkiem (3, 5) wszystkie podwójne pary pierwsze mają postać (6k - 1, 6k + 1) .

Ponieważ (6k - 1) + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 i
(6k + 1) + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6K - 1 , ponieważ wejście n> 3 , jest wystarczająca, aby sprawdzić, czy n i n + n% 6 - 3 są liczbą pierwszą.

Wzór ten stanie się pracę dla n = 3 , a także, jak 3 + 3% 6 - 3 = 3 jest pierwsza i 3 jest głównym pojedyncze.

Jak to działa

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

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

Wypróbuj online!

tło

Wszystkie liczby całkowite przyjmują jedną z następujących postaci, z liczbą całkowitą k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 .

Od 6k - 2 , 6k i 6k + 2 są parzyste, a ponieważ 6k - 3 można podzielić przez 3 , wszystkie liczby pierwsze oprócz 2 i 3 muszą mieć postać 6k - 1 lub 6k + 1 . Ponieważ różnica pary podwójnej liczby pierwszej wynosi 2 , z wyjątkiem (3, 5) , wszystkie pary liczb pierwszych mają postać (6k - 1, 6k + 1) .

Niech n będzie mieć postać 6k ± 1 .

  • Jeśli n = 6k -1 , to n + n% 6 - 3 = 6k - 1 + (6k - 1)% 6 - 3 = 6k - 1 + 5 - 3 = 6k + 1 .

  • Jeśli n = 6k + 1 , to n + n% 6 - 3 = 6k + 1 + (6k + 1)% 6 - 3 = 6k + 1 + 1 - 3 = 6k - 1 .

Zatem jeśli n jest częścią podwójnej pary pierwszej, a n ≠ 3 , to jego bliźniak będzie wynosił n + n% 6-3 .

Jak to działa

Python nie ma wbudowanego testu pierwszeństwa. Chociaż istnieją krótkie sposoby na sprawdzenie pojedynczej liczby pod kątem pierwszeństwa, zrobienie tego dla dwóch liczb byłoby długotrwałe. Zamiast tego będziemy pracować z dzielnikami.

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

zlicza liczbę całkowitą k w interwale [2, 4n) dzieli (n + n% 6 - 3) n równomiernie, tzn. zlicza liczbę dzielników (n + n% 6 - 3) n w przedziale [2 , 4n) . Twierdzimy, że liczba ta wynosi 2 wtedy i tylko wtedy, gdy n jest częścią podwójnej pary pierwszej.

  • Jeśli n = 3 (liczba podwójna), (n + n% 6 - 3) n = 3 (3 + 3 - 3) = 9 ma dwa dzielniki ( 3 i 9 ) w [2, 12) .

  • Jeśli n> 3 jest podwójną liczbą pierwszą, jak widać wcześniej, m: = n + n% 6 - 3 jest jej bliźniakiem. W tym przypadku mn ma dokładnie cztery dzielniki: 1, m, n, mn .

    Od n> 3 mamy m> 4 , więc 4n <mn i dokładnie dwa dzielniki ( m i n ) mieszczą się w przedziale [2, 4n) .

  • Jeśli n = 1 , to (n + n% 6 - 3) n = 1 + 1 - 3 = -1 nie ma dzielników w [2, 4) .

  • Jeśli n = 2 , to (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 ma jeden dzielnik (sam) w [2, 8) .

  • Jeśli n = 4 , to (n + n% 6 - 3) n = 4 (4 + 4 - 3) = 20 ma cztery dzielniki ( 2 , 4 , 5 i 10 ) w [2, 16) .

  • Jeżeli n> 4 jest parzyste, 2 , n / 2 , a n wszystkie dzielą n, a zatem (n + n% 6-3) n . Mamy n / 2> 2 od n> 4 , więc są co najmniej trzy dzielniki w [2, 4n) .

  • Jeśli n = 9 , to (n + n% 6 - 3) n = 9 (9 + 3 - 3) = 81 ma trzy dzielniki ( 3 , 9 i 21 ) w [2, 36) .

  • Jeśli n> 9 jest wielokrotnością 3 , to 3 , n / 3 , a n wszystkie dzielą n, a zatem (n + n% 6-3) n . Mamy n / 3> 3 od n> 9 , więc są co najmniej trzy dzielniki w [2, 4n) .

  • Wreszcie, jeśli n = 6k ± 1> 4 nie jest liczbą podwójną, n lub m: = n + n% 6-3 musi być złożone i dlatego należy przyjąć odpowiedni dzielnik d> 1 .

    Ponieważ albo n = m + 2 lub m = n + 2 i n, m> 4 , liczby całkowite d , m i nodrębnymi dzielnikami mn . Ponadto, m <n + 3 <4n od n> 1 , więc mn ma co najmniej trzy dzielniki w [2, 4n) .


Łał. Taki krótki kod, a jednak tak wiele specjalnych przypadków, które musi poprawnie obsługiwać. Czy jest jakiś powód, dla którego mówisz Python 3? O ile mogę powiedzieć, działa również w Pythonie 2.
kasperd

Tak, to zadziała równie dobrze w Pythonie 2. The 3 jest częścią automatycznie generowanego postu SE z TIO.
Dennis




3

MATL , 11 bajtów

HOht_v+ZpAa

Dane wyjściowe to 0lub 1.

Wypróbuj online!

Wyjaśnienie

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

Siatkówka , 45 44 bajtów

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

1<`1¶1

Zwraca 1, jeśli wejście jest podwójną liczbą pierwszą, w przeciwnym razie 0

Wypróbuj online!

Wyjaśnienie

.*              
$*

Konwertuj na Unary

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

Umieść n-2, n oraz n + 2 na swoich liniach

m`^(11+)\1+$   

(Końcowy znak nowej linii) Usuń wszystkie kompozyty większe niż 1

1<`1¶1          

Sprawdź, czy są dwie kolejne liczby pierwsze (lub 1,3, ponieważ 3 jest liczbą pierwszą)


2

Perl 6 , 24 bajtów

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

Wypróbuj online!

*jest argumentem tej anonimowej funkcji. 0 & (-2 | 2)to skrzyżowanie składające się z liczb 0ORAZ albo z -2LUB 2. Dodanie *do tego skrzyżowania powoduje połączenie numeru *ORAZ jednej z liczb * - 2LUB * + 2. Wywołanie is-primemetody na tym skrzyżowaniu zwraca prawdziwą wartość, jeśli *jest liczbą pierwszą ORAZ albo * - 2OR * + 2jest liczbą pierwszą. Wreszcie, ?zawraca prawdziwe połączenie do wartości boolowskiej, spełniając warunek konsekwentnego zwracania wartości.


2

JavaScript, 91 bajtów , 81 bajtów dzięki Jaredowi Smithowi

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))

Wyjaśnienie

pinformuje, czy podana liczba njest liczbą pierwszą, czy nie, a ttesty podaje liczbę ni n±2.

Przykład


Nie potrzebujesz varnawiasów wokół ndefinicji funkcji itp.
Jared Smith

Myślę, że możesz edytować swój fragment kodu, aby pokazać wartość nobok wartości t(n)zwiększonej przejrzystości (np. 7: true)
Taylor Scott

1
Dziękuję wam obojgu
Serge K.

1

J, 23 bajty

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

Wypróbuj online!

w jaki sposób?

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 bajtów z3>0#.@p:0 2 _2&+
mil

@miles nice. bardzo sprytne wykorzystanie bazy 2 do przetwarzania wyników.
Jonasz



1

JavaScript (ES6), 54 bajty

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 bajtów

Brak wbudowanych funkcji pierwszeństwa dla VBA :(

Kod

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane z komórki [A1]i wysyła 1(prawda) lub 0(fałsz) do okna natychmiastowego VBE

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

Funkcja pomocnika

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

Alternatywnie, 122 bajty

Kod

Rozwiązanie oparte na funkcji sprawdzania pierwotności rekurencyjnej

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

Funkcja pomocnika

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 bajtów 24 bajty dzięki Mayube

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

Można to znacznie pograć w golfa, zmieniając nazwy obu funkcji na 1 znak każda (np. aI b)
Skidsdev

2
Czy PHP nie potrzebuje functionjuż tego słowa kluczowego?
Tytus


0

Japt , 13 bajtów

j ©[U+2U-2]dj

Zwraca truei falseokreśla, czy liczba jest częścią pierwszej pary bliźniaczej.

Wypróbuj online!

Wyjaśnienie

Implicit: U= liczba całkowita wejściowa

j ©

Sprawdź, czy dane wejściowe to prime ( j), AND ( ©) ...

[U+2U-2]dj

Korzystając z tablicy [U+2, U-2], sprawdź, czy jakieś elementy są prawdziwe ( d) zgodnie z funkcją pierwotności (j ).

Wynik niejawny wyniku boolowskiego z is input prime AND is any ±2 neighbor prime.


Hmm ... Wydaje mi się, że [U+2U-2]może być znacznie krótszy, ale nie wiem, jak ...
ETHproductions
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.