Rakamın silinmesinden sonra hala en büyük prime'ı bulun


19

En fazla /math/33094/deleting-any-digit-yields-a-prime-is-there-a-name-for-this şu soru sorulur. Basamaklarından birini sildikten sonra asal olarak kalan kaç tane prim var? Örneğin 719Alacağınız gibi bir asal olduğunu 71, 19ve 79. Bu soru çözülmemiş olsa da güzel bir kodlama zorluğu yarattığını düşündüm.

Görev. Bulabileceğiniz en büyük prime'ı, rakamlarından herhangi birini sildikten sonra asal olarak bırakın. Kodu bulan kodu da sağlamanız gerekir.

Puan. Verdiğiniz asalın değeri.

Ücretsiz oldukları sürece istediğiniz programlama dilini ve kitaplıklarını kullanabilirsiniz.

İşe başlamak 99444901133, bağlantılı sayfada verilen en büyük şeydir .

Zaman sınırı. İlk doğru cevaptan bir hafta sonra verilen cevaptan tam olarak bir hafta sonra verilen en büyük doğru cevabı kabul edeceğim 99444901133.

Şimdiye kadar puanlar.

Python (primo)

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

J (randomra) (Bu cevap, 21 Şubat 2013'te bir haftalık zamanlayıcıyı başlattı.)

222223333333

9901444133(9 tanesinin silinmesi) asal ( 7 x 1414492019) değildir . Önceki örneğiniz doğruydu.
primo

@primo Teşekkürler, düzeltildi. Bu garip bir tipimdi.
motl7

1
En büyük olanı varsa - analizin belirttiği gibi, bulduğunuzu düşündüğünüzde bir kanıt hakkında nasıl gidebileceğinizi merak ediyorum.
gnibbler

1
Diğer üsler ne olacak? Baz 2'de 11 (2r1011), 11 baz 3'te (3r102), taban 4'te (4r1000000013) 262151, baz 5'te 17 (5r32), taban 7'de 37 (7r52), 47'den daha yüksek bir şey bulamadım. baz 9'da (9r52).
aka.nice

Yanıtlar:


17

274 basamak

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

Bu, bulmak için yaklaşık 20 saat CPU süresi ve kanıtlamak için yaklaşık 2 dakika sürdü. Buna karşılık, 84 haneli çözüm yaklaşık 3 dakika içinde bulunabilir.

84 basamak

444444444444444444444444444444444444444444444444441111111113333333333333333333333333

77777777999999999999999777777777 (32 hane)
66666666666666622222222222222333 (32 hane)
6477777777777777777777777 (27 hane)
44444441333333333333 (20 hane)
9999966777777777 (18 hane)
1677 (15 hane) 1677

Önceliği onaylamak istiyorsanız bu aracı tavsiye ederim: D. Alpern'in ECM Uygulaması

Ayrıca, büyük değerler bulma olasılığı en yüksek olan yaklaşım gibi bir repdigit yaklaşımı kullanmak. Aşağıdaki komut dosyası, 2, 3, 5 ve şimdi 11 c / o PeterTaylor'ın katları ile sonuçlanacak çoğu sayı veya kesimi algoritmik olarak atlar (katkısı verimliliği yaklaşık% 50 arttırmıştır).

from my_math import is_prime

sets = [
 (set('147'), set('0147369'), set('1379')),
 (set('369'), set('147'), set('1379')),
 (set('369'), set('0369'), set('17')),
 (set('258'), set('0258369'), set('39')),
 (set('369'), set('258'), set('39'))]

div2or5 = set('024568')

for n in range(3, 100):
 for sa, sb, sc in sets:
  for a in sa:
   for b in sb-set([a]):
    bm1 = int(b in div2or5)
    for c in sc-set([b]):
     if int(a+b+c)%11 == 0: continue
     for na in xrange(1, n-1, 1+(n&1)):
      eb = n - na
      for nb in xrange(1, eb-bm1, 1+(~eb&1)):
       nc = eb - nb
       if not is_prime(long(a*(na-1) + b*nb + c*nc)):
        continue
       if not is_prime(long(a*na + b*(nb-1) + c*nc)):
        continue
       if not is_prime(long(a*na + b*nb + c*(nc-1))):
        continue
       if not is_prime(long(a*na + b*nb + c*nc)):
        continue
       print a*na + b*nb + c*nc

my_math.pyburada bulabilirsiniz: http://codepad.org/KtXsydxK
Alternatif olarak, GMPY Projectgmpy.is_prime fonksiyonunu da kullanabilirsiniz.

Profil oluşturma sonucunda bazı küçük hız iyileştirmeleri. Dört adayın en uzun ilişkin asallık onay sonuna taşındı xrangecümledeki rangeve longcümledeki intyayınları yazın. intdeğerlendirilen ifade a long.


Bölünebilirlik Kuralları

N , a , b ve c tekrarlanan rakamlar olan a ... ab ... bc ... c formunun postitif bir tamsayısı olsun .

2 ile 5 ile
- bölünme önlemek için 2 ve 5 , C grubu olmayabilir [0, 2, 4, 5, 6, 8] . Ek olarak, b bu kümenin bir üyesiyse, c'nin uzunluğu 2'den az olamaz.

3'e göre
- N = 1 (mod 3) ise , N [1, 4, 7] 'nin herhangi birini içermeyebilir , çünkü bunlardan herhangi birinin kaldırılması önemsiz bir şekilde 3'ün katıyla sonuçlanacaktır . Aynı şekilde N = 2 (mod 3) ve [2, 5, 8] için . Bu uygulama, bunun biraz zayıflamış bir formunu kullanır: N , [1, 4, 7] 'den birini içeriyorsa, [2, 5, 8]' den herhangi birini içermeyebilir veya tam tersi de olabilir. Ayrıca, N sadece [0, 3, 6, 9] 'dan ibaret olmayabilir . Bu büyük ölçüde eşdeğer bir ifadedir, ancak a , b ve c gibi bazı önemsiz durumlara izin verir.her biri 3 defadan fazla tekrarlanır .

11 tarafından
- zamanda PeterTaylor uyarılara, N formdadır aabbcc ... xxyyzz , bu basamak kez eşit sayıda tekrarlanan tek oluşur olduğu, bu tarafından trivially bölünemeyen 11 : a0b0c ... x0y0z . Bu gözlem, arama alanının yarısını ortadan kaldırır. Eğer K tek uzunlukta, daha sonra uzunluğa sahiptir , bir , b ve c her iyi (% 75 arama alanı azalması) ve tek olmalıdır, ve eğer , N , sonra da uzunluğun sadece bir tanesidir bir , b ya da c bile olabilir uzunluğunda (% 25 arama alanı azaltma).
- Konjektif: Eğer abc bir katı olan 11 , örneğin, 407 , daha sonra tüm tek tekrarlar bir , b ve c de katları olacak , 11 . Bu, 11 bölünme ile yukarıdaki bölünebilirliğin kapsamı dışında kalmaktadır ; aslında, açıkça izin verilenler arasında sadece tek tekrarlar vardır. Bunun için bir kanıtım yok, ancak sistematik testler karşı bir örnek bulamadı. Karşılaştırma: 444077777 , 44444000777 , 44444440000077777777777 , vb. Herkes bu varsayımı kanıtlamaktan ya da reddetmekten çekinmeyin. aditsu o zamandan beri bunun doğru olduğunu gösterdi.


Diğer formlar

2 tekrarlanan rakam seti Randomra'nın izlediği
formun sayıları , a ... ab ... b , çok daha nadir görülür. 10 1700'den daha azı , en büyüğü 12 basamak uzunluğunda sadece 7 çözüm var .

4 tekrarlanan rakam kümesi
Bu formun sayıları, ... ab ... bc ... cd ... d , aradığımdan daha yoğun dağılmış gibi görünüyor. En az 69 çözümler vardır , 10 , 100 tekrar basamak 32 kullanılarak 3 kümelerine kıyasla,. Arasında olanlar, 10 11 ve 10 , 100 , aşağıdaki gibidir:

190000007777
700000011119
955666663333
47444444441111
66666622222399
280000000033333
1111333333334999
1111333333377779
1199999999900111
3355555666999999
2222233333000099
55555922222222233333
444444440004449999999
3366666633333333377777
3333333333999888883333
4441111113333333333311111
2222222293333333333333999999
999999999339999999977777777777
22222226666666222222222299999999
333333333333333333339944444444444999999999
559999999999933333333333339999999999999999
3333333333333333333111111111111666666666611111
11111111333330000000000000111111111111111111111
777777777770000000000000000000033333339999999999999999999999999
3333333333333333333333333333333333333333333333336666666977777777777777
666666666666666666611111113333337777777777777777777777777777777777777777
3333333333333333333888889999999999999999999999999999999999999999999999999933333333

Bunun neden böyle olması gerektiğine dair basit bir sezgisel tartışma var. Her dijital uzunluk için, beklenen çözüm sayısının en yüksek olacağı bir dizi tekrarlanan set (yani 3 tekrarlanan set veya 4 tekrarlanan set, vb.) Vardır. Geçiş, oran olarak alınan ek olası çözümlerin sayısı, kontrol edilecek ek sayının asal olma olasılığından ağır bastığında gerçekleşir. Kontrol etme olanaklarının üstel doğası ve asal sayı dağılımının logaritmik doğası göz önüne alındığında, bu nispeten hızlı bir şekilde gerçekleşir.

Örneğin, 300 basamaklı bir çözüm bulmak isteseydik, 4 tekrarlı basamağın kontrol edilmesi, 3 setten daha fazla bir çözüm üretme olasılığının daha yüksek olacağını ve 5 setin yine de daha muhtemel olacağını söyledi. Ancak, elimdeki bilgisayar gücü ile, 4 setle 100 basamaktan çok daha büyük bir çözüm bulmak, 5 veya 6 olsun, kapasitemin dışında olacaktır.


3
Formun herhangi bir çözümü, d^x e^y f^z11 ile bölünebilirliği önlemek için dizi uzunluklarının en az ikisinin garip olmasını gerektirir. 11'in is_primekatlarını açıkça dikkate almaya değmeyecek kadar hızlı bir şekilde reddedip reddedemeyeceğimi bilmiyorum .
Peter Taylor

Önümde gmp kaynağı yok, ancak büyük olasılıkla küçük asallar üzerinde deneme bölünmesiyle başlıyor. Yine de, (na&1)+(nb&1)+(nc&1) > 1daha hızlı olması gerektiği kadar basit. Bir dakika, bu tam dalları kısa devre yapabilir! Eğer nahatta ve nb + ncgarip, o zaman bir [nb, nc]zorunluluk mutlaka bile olabilir ve sadece bir sonraki atlayabilirsiniz na.
primo

Gmpy.is_prime () kullanıyorsanız dikkatli olun. Belirli bir noktanın ötesinde olasılıktır, bu yüzden a'nın geri döndüğünü kontrol etmeniz gerekir 2. 1anlamına gelir sadece büyük bir olasılıkla
gnibbler

4
11 ile bölünebilirlik için doğrudan ve kesin bir test, tüm basamakları eşit konumlara eklemek ve tüm basamakları tek konumlarda çıkarmak (veya tam tersi) ve sonucun 11'in katları olup olmadığını kontrol etmektir. doğrudan çıkartıldığında), 2+ özdeş basamağın tüm sekanslarını 0 veya 1 basamağa azaltabilirsiniz (sekans uzunluğunu% 2 alarak). 44444440000077777777777 böylece 407'ye düşer; 4 + 7-0 = 11. 444444444444444444444444444444444444444444444444441111111113333333333333333333333333 13'e
düşüyor

1
"sağlam"! = kanıtlanmış. Fark, bazıları için önemsizdir, diğerleri için çok önemlidir. Mathematica'daki PrimeQ, bir BPSW varyantı artı baz 3 ile ekstra bir MR'dır, bu yüzden elbette sadece birkaç milisaniye sürecektir. Pari / GP, 5 yıllık bir bilgisayarda APR-CL kullanarak 274 basamaklı sayıyı 3 saniye içinde kanıtlar ve tek çekirdekli açık kaynaklı ECPP yaklaşık 2 saniye sürer. Java için daha uzun sürmesi sürpriz değil, ama önemli değil. Ben tüm Perl çeviri yapmak tüm 4 BPSW, sonra hepsi ucuz testleri geçti 4 tüm bir kanıt vardı.
DanaJ

5

222223333333 (12 basamaklı)

Burada sadece 100 basamağa kadar aa..aabb..bb biçiminde arama yaptım. Sadece diğer isabetler 23 37 53 73113 311'dir.

J kodu (temizlendi) (üzgünüm, açıklama yok):

a=.>,{,~<>:i.100
b=.>,{,~<i.10
num=.".@(1&":)@#~
p=.(*/"1@:((1&p:)@num) (]-"1(0,=@i.@#)))"1 1
]res=./:~~.,b (p#num)"1 1/ a

Bu formun 1560 basamağa (ve saymaya) kadar kapsamlı bir araştırması, bu 12 haneli çözümden daha büyük bir şey ortaya çıkarmaz.
primo

2

Edit: Birisi zaten burada yaptığımdan daha waaay derin bir analiz yaptı.

Bir çözüm değil, n basamaklı çözümlerin sayısı hakkında kabaca bir tahmin.

Tahmini çözüm sayısı

J kodu oluşturuluyor

   ops=: 'title ','Estimated number of solutions by digits',';xcaption ','digits',';ycaption ','log10 #'
   ops plot 10^.((%^.)%(2&(%~)@^.@(%&10))^(10&^.))(10&^(2+i.100))

Teşekkürler. Y ekseni biraz kafa karıştırıcı. Gerçekten kabaca 86 basamaklı tahmini çözüm sayısı olarak 10 ^ -100 demek istiyor musunuz?
motl7

Evet. Eğer sınırlı sayıda çözüm varsa, buna inanılır. Mevcut verilere dayanarak bu tahmin biraz kapalıdır, çünkü tekrarlayan rakamlar daha az basamaklı sayılar arasında korelasyon yaratır.
randomra

1
Birisi zaten 1'den daha fazla waaay daha derin bir analiz yaptı
randomra

Y ekseni, çözüm olan x basamaklı sayıların oranı mıdır? Bu çözümlerin sayısına 10 ^ (# basamak) bölünür? 4, 11
vb.Gibi

1

Javascript (Kaba Kuvvet)

Henüz daha yüksek bir sayı bulamadı

http://jsfiddle.net/79FDr/4/

Bir bigint kütüphanesi olmadan, javascript tamsayılarla sınırlıdır <= 2^53.

Javascript olduğundan, tarayıcı, kullanıcı arayüzünün güncellenmesi için yürütme iş parçacığını serbest bırakmazsak şikayet edecek, sonuç olarak, algoritmanın kullanıcı arayüzündeki ilerlemesinde nerede olduğunu izlemeye karar verdim.

function isPrime(n){
    return n==2||(n>1&&n%2!=0&&(function(){
        for(var i=3,max=Math.sqrt(n);i<=max;i+=2)if(n%i==0)return false;
        return true;
    })());
};

var o=$("#o"), m=Math.pow(2,53),S=$("#s");

(function loop(n){
    var s = n.toString(),t,p=true,i=l=s.length,h={};
    if(isPrime(n)){
        while(--i){
            t=s.substring(0,i-1) + s.substring(i,l); // cut out a digit
            if(!h[t]){   // keep a hash of numbers tested so we don't end up testing 
                h[t]=1;  // the same number multiple times
                if(!isPrime(+t)){p=false;break;}
            }
        }
        if(p)
            o.append($("<span>"+n+"</span>"));
    }
    S.text(n);
    if(n+2 < m)setTimeout(function(){
        loop(n+2);
    },1);
})(99444901133);

@Schmiddty js için büyük int kütüphaneleri var ama bu kaba kuvvet yöntemi mahkum görünüyor.
motl7

1
@ motl7 Kabul etti, bütün gece çalışmaya devam etti ve cevap bulunamadı.
Shmiddty

1

Sorunun analizine bir bağlantı gönderildi, ancak birkaç şeyin eksik olduğunu düşündüm. 1 veya daha fazla aynı basamağın k dizisinden oluşan m basamak sayısına bakalım. Basamakları {0, 3, 6, 9}, {1, 4, 7} ve {2, 5, 8} gruplarına ayırırsak, bir çözüm hem ikinci hem de üçüncü gruptan rakam içeremez. ve bu gruplardan birinden 3n + 2 hane içermelidir. K dizilerinden en az ikisinin tek bir rakam içermesi gerekir. {1, 4, 7} rakamlarından en düşük rakam yalnızca 1 ve 7 olabilir. {2, 5, 8} 'in hiçbiri en düşük basamak olamaz. Bu nedenle, en düşük basamak için dört (1, 3, 7, 9) veya iki (3, 9) seçenek vardır,

Kaç aday var? En az 1 basamaklı k dizilerine bölünmüş m basamaklarımız var. Bu dizilerin uzunluklarını (m - 1.5k + 2) ^ (k - 1) / (k - 1) seçmenin (k - 1) üzerinde (m - k + 1) yolu vardır. En düşük basamak için toplam altı olmak üzere 2 veya 4 seçenek vardır. En yüksek basamak için 36/7 seçenek dışında, diğer basamaklar için altı seçenek vardır; toplam (6/7) * 6 ^ k'dir. Bir dizinin uzunluğunun çift mi yoksa tek mi olduğunu seçmenin 2 ^ k yolu vardır; bunlardan k + 1'i hariç tutulmuştur, çünkü bunlardan hiçbiri veya sadece biri tuhaf değildir; seçenek sayısını (1 - (k + 1) / 2 ^ k) ile çarparız; bu k = 2 olduğunda 1/4, k = 3 olduğunda 1/2, k = 4 vb. olduğunda 11. {1, 4, 7} veya {2, 5, 8} kümesindeki rakamların sayısı 3n + 2 olmalıdır, bu nedenle seçenek sayısı 3'e bölünür.

Tüm bu rakamlarla çarpıldığında, aday sayısı

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (6/7) * 6^k * (1 - (k + 1) / 2^k) / 3

veya

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k)

Adayın kendisi ve bir rakam çıkartılarak oluşturulan k sayılarının tümü asal olmalıdır. N çevresinde rastgele bir tamsayının asal olma olasılığı yaklaşık 1 / ln'dir. Rasgele m basamaklı bir sayı olasılığı yaklaşık 1 / (mln 10) 'dur. Ancak, buradaki sayılar rastgele değildir. Hepsi 2, 3 veya 5 ile bölünemez olarak seçilmiştir. 30 ardışık tamsayıdan 8'i 2, 3 veya 5 ile bölünemez. Bu nedenle, asal olma olasılığı (30/8) / (mn 10) veya yaklaşık 1.6286 / m'dir.

Beklenen çözüm sayısı yaklaşık

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k) * (1.6286 / m)^(k + 1)

veya büyük m için

(1 - (1.5k - 2) / m)^(k - 1) / (k - 1)! * 0.465 * 9.772^k * (1 - (k + 1) / 2^k) / m^2

K = 2, 3, 4, ... için aşağıdakileri elde ederiz:

k = 2: 11.1 * (1 - 1/m) / m^2
k = 3: 108 * (1 - 2.5/m)^2 / m^2 
k = 4: 486 * (1 - 4/m)^3 / m^2


k = 10: 10,065 * (1 - 13/m)^9 / m^2

K = 10'dan itibaren sayı tekrar küçülür.


5
PPCG'ye Hoşgeldiniz! Bu mükemmel bir analizdir; ancak, soruya meşru yanıtlar olmak için cevaplar arıyoruz. Başka bir deyişle, kod. Ne yazık ki, bu, yorum yorumlarına bırakılan yalnızca yorum yazıları için yapımızda yetersiz alan bırakıyor. Ancak, bu kadar kapsamlı bir çabanın rüşvet yığınımıza düştüğünü görmekten nefret ediyorum, bu nedenle, postanıza meydan okuma gereksinimlerini karşılamak için tasarlanmış bir bilgisayar programı eklerseniz, tutmanın daha muhtemel olacağını ima etmek isterim. etrafında.
Jonathan Van Matre

1
Ayrıca, kardeş sitelerimize göz atmanızı şiddetle tavsiye ederim: math.stackexchange.com ve mathoverflow.net
Jonathan Van Matre
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.