Asal bir ikizim var mı?


23

Bir tamsayı olduğu asal 1 ve kendisini: pozitif ve tam olarak 2 farklı bölenler vardır ve ancak eğer. İkiz bir asal çift iki elementten oluşur: pve p±2ikisi de asaldır.

Girdi olarak pozitif bir tamsayı verilecektir. Göreviniz, verilen tamsayı standart kurallarına uyarak (değerlerin tutarlı olması gerekir) ikizin çiftine ait olup olmamasına bağlı olarak bir haksızlık / yanlışlık döndürmektir .

Test Kılıfları

  • Truthy (İkiz Asallar): 3, 5, 7, 11, 13, 17, 19, 29, 31, 41, 43

  • Sahte (İkiz Asal değil): 2, 15, 20, 23, 37, 47, 97, 120, 566

Bu , yani bayttaki en kısa kod kazanır!


13 birinci sınıf bir ikiz mi?
LiefdeWen

@LiefdeWen Evet, çünkü bu çift (11, 13)
daniero

Yanıtlar:



11

Jöle , 10 9 bayt

%6+_2_ÆP⁺

Çevrimiçi deneyin!

Arka fon

(3, 5) hariç , tüm ikiz asal çiftler formdadır (6k - 1, 6k + 1) .

Yana + (6K - 1)% 6 - - (1 6K) 3 = 6 k - 3 = 6k + - 1 + 5 1 ve
(1 + 6k) + (6k + 1)% 6-3 = 6k + 1 + 1 - 3 = 6k - 1 , n> 3 girildiğinde , n ve n + n% 6 - 3 değerinin ikisinin de asal olup olmadığını kontrol etmek yeterlidir .

Bu formül n = 3 için de işe yarıyor , 3 + 3% 6 - 3 = 3 asal ve 3 ikiz bir asal.

Nasıl çalışır

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

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

Çevrimiçi deneyin!

Arka fon

Tüm tamsayılar, k : 6k - 3 , 6k - 2 , 6k - 1 , 6k , 6k + 1 , 6k + 2 tamsayılı olan aşağıdaki formlardan birini alır .

Yana 6K - 2 , 6K ve 6k + 2 tüm çift ve yana olan 3 - 6k bölünemeyen 3 dışındaki tüm asal, 2 ve 3 biçiminde olmalıdır 6k - 1 ya da 6k + 1 . İkiz asal çiftin farkı, (3, 5) hariç , 2 olduğundan , tüm ikiz asal çiftler (6k - 1, 6k + 1) formundadır .

N 6k ± 1 formunda olsun .

  • Eğer , n = 6K -1 , o , n + n% 6-3 = 6k - 1 + (6k - 1)% 6-3 = 6k + - Mayıs 01-03 = 6k + 1 .

  • Eğer , n = 6 k + 1 , daha sonra n + n% 6-3 = 6k + 1 + (6k + 1)% 6-3 = 6k + Ocak 01-03 = 6k - 1 .

Böylece, eğer n ikiz asal çifti ve bir parçasıdır n ≠ 3 , 's ikiz olacak n + n% 6-3 .

Nasıl çalışır

Python'un yerleşik bir birincillik testi yoktur. Tek bir sayıyı ilkellik için test etmenin kısa yolları olsa da, bunu iki sayı için yapmak uzun olacaktır. Bunun yerine bölenlerle çalışacağız.

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

sayımları kaç tamsayı k aralığında [2, 4n) bölmek (n + n% 6-3) n- eşit, yani, bir bölenler sayısını sayan n + n% 6 (3 -) n- aralıkta [2 , 4n) . Bu sayımın sadece 2 olması ve n'nin ikiz asal çiftin bir parçası olması durumunda olduğunu iddia ediyoruz .

  • Eğer , n = 3 (ikiz birincil), (n + n% 6-3), n = 3 (3 + 3-3) = 9 iki bölenler (vardır 3 ve 9 olarak) [2, 12) .

  • Eğer n> 3 , daha önce görüldüğü gibi, ikiz asal m: = n + n% 6-3 olan ikiz olduğunu. Bu durumda, mn'nin tam dört böleni vardır: 1, m, n, mn .

    Yana n> 3 , elimizdeki m> 4 , bu 4n <mn ve tam iki bölenler ( m, ve n, aralık içine) düşme [2, 4n) .

  • Eğer , n = 1 , daha sonra (n + n% 6-3) D = + 1-3 Ocak = -1 hiçbir bölenler sahiptir [2, 4) .

  • Eğer n = 2 ise , (n + n% 6 - 3) n = 2 (2 + 2 - 3) = 2 , [2, 8) ' de bir bölen (kendisi ) içerir .

  • Eğer , n = 4 , daha sonra , (n + n% 6-3), n = 4 (4 + 4-3) = 20 , dört bölenler (sahiptir 2 , 4 , 5 , ve 10 de) [2, 16) .

  • Eğer , n> 4 bile, bir 2 , N / 2 , ve n, her bölme , n ve bu nedenle N - (3, n + n% 6) . N> 4'ten beri n / 2> 2 sahibiz , bu yüzden [2, 4n) ' de en az üç bölen var .

  • Eğer , n = 9 , daha sonra (n + n% 6-3), n = 9 (9 + 3-3) = 81 , üç bölenler (vardır 3 , 9 ve 21 de) [2, 36) .

  • Eğer n> 9 bir katıdır 3 , daha sonra 3 , n / 3 , ve n, her bölme , n , bu nedenle, ve n, - (% 3, 6 n + n) . N> 9'dan beri n / 3> 3 sahibiz , bu yüzden [2, 4n) ' de en az üç bölen var .

  • Son olarak, eğer n = 6k ± 1> 4 ikiz asal değilse, n veya m: = n + n% 6 - 3 bileşik olmalıdır ve bu nedenle d> 1 uygun bir böleni kabul etmelidir .

    Ya da bu yana , n = m + 2 ya da m = n + 2 ve n, m> 4 , tam sayı d , m , ve n, olan ayrı bir bölenleri mn . Bundan başka, m <n + 3 <4n yana n> 1 , bu mn en az üç bölenler sahiptir [2, 4n) .


Vay. Böyle kısa bir kod ve bir çok özel durumun doğru bir şekilde ele alınması gerekiyor. Python 3 dedin mi? Söyleyebileceğim kadarıyla Python 2'de de çalışıyor.
kasperd

Evet, Python 2'de de aynı şekilde çalışacaktır. 3 , TIO’dan otomatik olarak oluşturulan SE mesajının bir parçasıdır.
Dennis,




3

MATL , 11 bayt

HOht_v+ZpAa

Çıktı 0veya 1.

Çevrimiçi deneyin!

açıklama

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 bayt

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

1<`1¶1

Girdi bir ikiz asal ise 1, aksi halde 0 döndürür.

Çevrimiçi deneyin!

açıklama

.*              
$*

Unary'e Dönüştür

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

N-2, n ve n + 2'yi kendi satırlarına yerleştirin

m`^(11+)\1+$   

(Sondaki newline) 1'den büyük olan tüm kompozitleri kaldır

1<`1¶1          

Ardışık iki primer olup olmadığını kontrol edin (veya 1,3, bir ikiz asal olduğundan 1.3)


2

Perl 6 , 24 bayt

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

Çevrimiçi deneyin!

*Bu isimsiz fonksiyonun argümanıdır. 0 & (-2 | 2)kavşak rakamdan oluşan edilir 0VE ya -2VEYA 2. *Bu kavşağa eklemek , *VE sayısının ya da * - 2VEYA sayısının birleşimini oluşturur * + 2. is-primeBu kavşaktaki yöntemi çağırmak *, asal ise VE ya * - 2VEYA asal ise bir alaycı değer döndürür * + 2. Son olarak, ?rutubetli kavşağı bir boolean değere daraltır ve tutarlı getiri değerleri koşulunu sağlar.


2

JavaScript, 91 bayt , 81 bayt Jared Smith sayesinde

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

açıklama

pVerilen sayı Hava söyler nasal olup olmadığını ve ttestler numarası verilir nve n±2.

Örnek


Fonksiyon tanımında, vb. varEtrafındaki parantezlere ihtiyacınız yok n.
Jared Smith

nParçacığınızı, t(n)artan netlik değerinin yanında göstermek için düzenleyebileceğinizi düşünüyorum (Örn. 7: true)
Taylor Scott

1
İkinize de teşekkürler
Serge K.

1

J, 23 bayt

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

Çevrimiçi deneyin!

Nasıl?

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 bayt ile3>0#.@p:0 2 _2&+
mil

@miles güzel. sonuçları işlemek için taban 2'nin çok akıllıca kullanılması.
Jonah



1

JavaScript (ES6), 54 bayt

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 Bayt

VBA için ilkel yapı yok :(

kod

Hücreden girdi alan [A1]ve 1(truthy) veya 0(falsy) VBE Immediate penceresine çıkaran anonim VBE acil pencere işlevi

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

Yardımcı İşlev

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

Alternatif olarak, 122 Bayt

kod

Özyinelemeli öncelik kontrolü fonksiyon tabanlı çözüm

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

Yardımcı İşlev

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

0

PHP, Mayube sayesinde 85 bayt 24 bayt

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

Bu, her iki fonksiyonun adlarını her biri 1 karakter (örneğin ave b) olarak değiştirerek önemli ölçüde golf oynayabilir
Skidsdev

2
PHP'nin functionartık anahtar kelimeye ihtiyacı yok mu?
Titus


0

Japt , 13 bayt

j ©[U+2U-2]dj

Döndürür trueve falsesayının asal bir ikiz çiftin bir parçası olup olmadığını gösterir.

Çevrimiçi deneyin!

açıklama

Kapalı: U= tamsayı girişi

j ©

Girişin asal ( j), AND ( ©) olup olmadığını kontrol edin

[U+2U-2]dj

Diziyi kullanarak, ilke işlevine ( ) göre [U+2, U-2]herhangi bir öğenin doğru ( d) olup olmadığını kontrol edin j.

Boolean sonucunun örtük çıktısı is input prime AND is any ±2 neighbor prime.


Hmm ... Daha [U+2U-2]kısa olabileceğimi hissediyorum , ama nasıl olduğunu
çözemiyorum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.