Cunningham zincirlerini saymak


14

Asal sayılar her zaman insanları büyülemiştir. 2300 yıl önce Öklid "Elemanları" na yazdı

Asal sayı, sadece bir birim tarafından ölçülen sayıdır.

yani bir asal sadece 1(veya kendi başına) bölünebilir .

İnsanlar her zaman asal sayılar arasındaki ilişkileri aradılar ve bazı ilginç ("ilginç" gibi) şeyler buldular.

Örneğin bir Sophie Germain asal bir asal polan 2*p+1da asal olduğunu.

Bir kasa asal bir asal polan (p-1)/2tam bir Sophie Germain başbakan geriye durumdur ki, Başbakan da.

Bunlar bu meydan okumada aradığımız şeyle ilgilidir.

Birinci tip bir Cunningham zinciri , sonuncusu hariç her elementin Sophie Germain prime ve ilk hariç her elementin güvenli bir başlangıç ​​olduğu bir dizi asal dizidir . Bu zincirdeki eleman sayısına uzunluk denir .

Bu, bir asal ile başlayıp phesapladığımız anlamına gelir q=2*p+1. Eğer qasal ise , uzunluk 2 tip I bir Cunnigham zincirimiz var . Sonra bir 2*q+1sonraki üretilen sayı kompozit olana kadar test ederiz .

Tip II Cunningham zincirleri hemen hemen aynı prensibe göre inşa edilir, tek fark 2*p-1her aşamada kontrol etmemizdir.

Cunningham zincirlerinin uzunluğu 1 olabilir , yani ne 2 * p + 1 ne de 2 * p-1 asal değildir. Bunlarla ilgilenmiyoruz .

Cunningham zincirlerinden bazı örnekler

2uzunluk 5 tip I zincirini başlatır .

2, 5, 11, 23, 47

Bir sonraki inşa edilen sayı 95asal olmayan sayıdır .
Bu aynı zamanda o, söyler 5, 11, 23ve 47tip herhangi bir zinciri başlamaz I o -Önceki unsurları olurdu, çünkü.

2ayrıca uzunluk 3 tip II bir zincir başlatır .

2, 3, 5

Sırada 9, asal olmayan olurdu .

11Tip II'yi deneyelim ( daha önce tip I'den hariç tuttuk).
Peki, bir 21sonraki olurdu, bu asal değil, bu yüzden bu meydan okumada saymadığımız "zincir" için 1 uzunluğa sahip olurduk.

Meydan okuma

nGiriş olarak bir sayı verildiğinde , en az 2 uzunluğunda tip I veya II tip n. Cunningham zincirinin başlangıç ​​numarasını yazıp / döndüren , ardından bir boşluk ve ardından başladığı zincir türünü ( I veya II ), ardından bir kolon ve bunu takiben bu tip zincirin uzunluğu gelir. Bir asal her iki zincir türünü (tip I ve tip II) başlatırsa , önce tip I zinciri sayılır.

Misal: 2 I:5

Unutmayın, bu ndaha önce başlatılmış herhangi bir tür zincirinin bir parçası olabilir, bu durumda bu tür bir zincirin başlangıç ​​sayısı olarak düşünülmemelidir .

Bunun nasıl başladığına bakalım

İle başlıyoruz 2. Hiç de ilk başbakan olduğundan daha düşük bir başbakanla başlayan hiçbir zincir olmadığından emin olabiliriz 2.
Bir zincir türünde bir sonraki sayı olurdu 2*2+1 == 5. 5asal, bu yüzden zaten en az 2 uzunluğunda bir zincirimiz var.
Bunu ilk zincir olarak sayıyoruz. Tip II ne olacak? Sonraki sayı olurdu 2*2-1 == 3. 3asal olduğundan, tip II için de en az 2 uzunluğunda bir zincir.
Bunu ikinci zincir olarak sayıyoruz. Ve işimiz bitti 2.

Bir sonraki asal 3. Burada, daha düşük bir başlangıcın başladığı bir zincirde olup olmadığını kontrol etmeliyiz.
Tip I: 'yi kontrol edin (3-1)/2 == 1. 1asal değil, bu nedenle 3, I tipi bir zincir için bir başlangıç ​​noktası olabilir
. Sonraki olurdu 3*2+1 == 7. 7asal olduğu için, en az 2 numaralı tip I zincirine sahibiz. Bunu üçüncü zincir olarak sayıyoruz.
Şimdi 3, tip II zincirinde daha düşük bir başlangıcın başlayıp başlamadığını kontrol ediyoruz . (3+1)/2 == 2. 2asal olduğundan, 3 tip II zincir için bir başlangıç ​​numarası olarak kabul edilemez . Yani bu sayılmaz, 3bu zincirde bir sonraki sayı olsa bile ,5, asal. (Elbette bunu zaten biliyorduk ve elbette bu kontrollerin nasıl yapılacağını kendi yönteminizi düşünebilir ve düşünmelisiniz.)

Ve için kontrol nedenle 5, 7, 11biz, en azından uzunluğunun 2 ninci Cunningham zinciri bulana kadar ve bu sayım ile.

O zaman (veya belki bir süre önce ;)) bulduğumuz zincirin tam uzunluğunu belirlememiz ve sonucu daha önce belirtilen formatta yazdırmamız gerekir.

Bu arada: testlerimde 2, her iki tip zinciri de daha büyük bir şekilde başlatan bir şey bulamadım 1.

Giriş / Çıkış örnekleri

Giriş

1

Çıktı

2 I:5


Giriş

10

Çıktı

79 II:3


Giriş

99

Çıktı

2129 I:2


Girişler için çıkışlar 1..20

2 I: 5
II: 3
3 I: 2
7 II: 2
19 II: 3
29 I: 2
31 II: 2
41 I: 3
53 I: 2
79 II: 3
89 I: 6
97 II: 2
113 I: 2
131 I: 2
139 II: 2
173 I: 2
191 I: 2
199 II: 2
211 II: 2
229 II: 2

İlk 5000 çıktının bir listesini burada bulabilirsiniz .

Bu kod golf. Çıktıda keyfi boşluklara izin verilir, ancak tür ve sayılar örneklerde görüldüğü gibi tek bir boşluk ve iki nokta ile ayrılmalıdır. Herhangi boşlukları kullanarak özellikle Web'den sonuçları edilir alma izin verilmez değil izin verdi.

İyi şanslar :)


3
Sanal alanda söz unuttum: çok kolay olduğunu kanıtlamak için 2ve 3sadece Asal sayılar pher ikisi için 2p-1ve 2p+1asal, bu yüzden 2hangi yalnızca asal başlar iki tür önemsiz olmayan Cunningham zincirlerini.
Peter Taylor

Tamam. Yardımınız için teşekkürler:)
Cabbie407

3
(Cevaptan dönüştürülmüş yorum.) 1'den büyük çift zincir uzunluğundan başka asal yoktur . İşte elemenin kanıtı. 2
pbeentje

Bunu tekrar bu detayda belirttiğiniz için teşekkürler. Sadece bunu belirtmek mi istediniz yoksa bu yüzden zorluğu bir şekilde değiştirmem gerektiğini mi düşünüyorsunuz?
Cabbie407

Sadece bir açıklama. Her durumda meydan okumayı değiştirdiğini düşünmüyorum, sadece golf için potansiyel olarak yararlı: bir zincir bulunduğunda, diğerinin kontrol edilmesine gerek yok.
pbeentje

Yanıtlar:


2

Javascript, 236208 bayt

28 bayt kaydedildi:

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

Aşağıdaki işlevlerde 9 bayt kaydedildi p: İşlev, doğrudan işlevdeki deyimle değiştirildi .p=(n,i=n)=>n%--i?p(n,i):i==1
teval(...)f


Önceki çözüm:

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

Misal: f(6)

Çıktı: 29 I:2

Açıklama
3 işlev kullanıyorum

1 p : n'nin asal olup olmadığını bilmek için : p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t : 1 veya -1 olacak m parametresine bağlı olarak Cunningham zincirinin I veya II tipi n ile başlayan uzunluğunu bilmek : t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f : zincirleri sayar ( döngü için ) ve sonucu gösterir

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

loop için : her sayı için Cunningham zinciri (gerekirse I sonra II)

  • sayı asal
  • selefi asal değil
  • halef asal
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.