Temukan prime terbesar yang masih merupakan prime setelah penghapusan digit

19

Di /math/33094/deleting-any-digit-yields-a-prime-is-there-a-name-for-ini- pertanyaan ini diajukan. Berapa banyak bilangan prima yang tetap prima setelah Anda menghapus salah satu digitnya? Misalnya 719prima seperti yang Anda dapatkan 71, 19dan 79. Sementara pertanyaan ini belum terselesaikan saya pikir itu membuat tantangan pengkodean yang bagus.

Tugas. Berikan prime terbesar yang dapat Anda temukan yang tetap prime setelah Anda menghapus salah satu dari digit-nya. Anda juga harus memberikan kode yang menemukannya.

Skor. Nilai prime yang Anda berikan.

Anda dapat menggunakan bahasa pemrograman apa saja dan perpustakaan yang Anda suka asalkan gratis.

Untuk memulai, 99444901133adalah yang terbesar diberikan pada halaman yang ditautkan.

Batas waktu. Saya akan menerima jawaban benar terbesar yang diberikan tepat satu minggu setelah jawaban benar pertama lebih besar dari 99444901133yang diberikan dalam jawaban.

Skor sejauh ini.

Python (primo)

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

J (randomra) (Jawaban ini memulai timer satu minggu pada 21 Februari 2013)

222223333333
motl7
sumber
9901444133(penghapusan satu 9) bukan prime ( 7 x 1414492019). Contoh Anda sebelumnya benar.
primo
@ primo Terima kasih, sudah diperbaiki. Itu salah ketik saya.
motl7
1
Jika ada yang terbesar - seperti yang ditunjukkan oleh analisis, saya ingin tahu bagaimana Anda bisa membuktikan ketika Anda berpikir Anda telah menemukannya.
gnibbler
1
Bagaimana dengan pangkalan lain? Di base 2, saya tidak dapat menemukan yang lebih tinggi dari 11 (2r1011), 11 juga di base 3 (3r102), 262151 di base 4 (4r1000000013), 17 di base 5 (5r32), 37 di base 7 (7r52), 47 di basis 9 (9r52).
alias. Bagus

Jawaban:

17

274 angka

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

Ini membutuhkan sekitar 20 jam waktu CPU untuk menemukannya, dan sekitar 2 menit per prime untuk membuktikannya. Sebaliknya, solusi 84 digit dapat ditemukan dalam waktu sekitar 3 menit.

84 digit

444444444444444444444444444444444444444444444444441111111113333333333333333333333333

77777777999999999999999777777777 (32 digit)
66666666666666622222222222222333 (32 digit)
647777777777777777777777777 (27 digit)
44444441333333333333 (20 digit)
999996677777777777 (18 digit)
167777777777777 (15 digit)

Saya merekomendasikan alat ini jika Anda ingin mengkonfirmasi keaslian: D. Applet ECM Alpern

Juga menggunakan pendekatan repdigit, yang tampaknya merupakan pendekatan yang paling mungkin untuk menemukan nilai besar. Skrip berikut secara algoritmik melompati sebagian besar angka atau pemotongan yang akan menghasilkan kelipatan 2, 3, 5 dan sekarang 11 c / o PeterTaylor (kontribusinya meningkatkan efisiensi sekitar 50%).

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.pydapat ditemukan di sini: http://codepad.org/KtXsydxK
Atau, Anda juga dapat menggunakan gmpy.is_primefungsi: Proyek GMPY

Beberapa peningkatan kecepatan kecil sebagai akibat dari profil. Pemeriksaan primality untuk kandidat terpanjang dari empat kandidat telah dipindahkan ke akhir, xrangemenggantikan range, danlong mengganti intpemain tipe. inttampaknya memiliki overhead yang tidak perlu jika ekspresi yang dievaluasi menghasilkan a long.


Aturan dapat dibagi

Biarkan N menjadi bilangan bulat positif dari bentuk a ... ab ... bc ... c , di mana a , b dan c adalah digit berulang.

Dengan 2 dan 5
- Untuk menghindari keterbagian 2 dan 5 , c mungkin tidak ada dalam set [0, 2, 4, 5, 6, 8] . Selain itu, jika b adalah anggota dari set ini, panjang c mungkin tidak kurang dari 2.

Dengan 3
- Jika N = 1 (mod 3) , maka N mungkin tidak mengandung salah satu [1, 4, 7] , karena menghapus salah satu dari ini akan menghasilkan kelipatan 3 . Demikian juga untuk N = 2 (mod 3) dan [2, 5, 8] . Implementasi ini menggunakan bentuk yang sedikit melemah ini: jika N berisi salah satu [1, 4, 7] , itu mungkin tidak mengandung [2, 5, 8] , dan sebaliknya. Selain itu, N tidak boleh hanya terdiri dari [0, 3, 6, 9] . Ini sebagian besar merupakan pernyataan yang setara, tetapi memang memungkinkan untuk beberapa kasus sepele, misalnya a , b , dan cmasing-masing diulang 3 kali.

By 11
- Seperti yang dicatat PeterTaylor , jika N adalah dari bentuk aabbcc ... xxyyzz , itu hanya terdiri dari digit yang diulang beberapa kali, itu secara sepele dapat dibagi menjadi 11 : a0b0c ... x0y0z . Pengamatan ini menghilangkan setengah dari ruang pencarian. Jika N adalah panjang ganjil, maka panjang a , b dan c semuanya harus ganjil juga (pengurangan ruang pencarian 75%), dan jika N adalah panjang genap, maka hanya satu dari a , b atau c yang mungkin lebih panjangnya (25% pengurangan ruang pencarian).
- Dugaan: jika abc merupakan kelipatan dari 11 , misalnya 407 , maka semua pengulangan ganjil dari a , b dan c juga akan menjadi kelipatan dari 11 . Ini jatuh dari ruang lingkup keterbagian di atas oleh 11 aturan; pada kenyataannya, hanya pengulangan ganjil di antara mereka yang diizinkan secara eksplisit. Saya tidak punya bukti untuk ini, tetapi pengujian sistematis tidak dapat menemukan contoh tandingan. Bandingkan: 444077777 , 44444000777 , 44444440000077777777777 , dll. Siapa pun dapat merasa bebas untuk membuktikan atau membantah dugaan ini. Aditsu sejak itu menunjukkan ini benar.


Bentuk lainnya

2 set angka yang berulang
Jumlah bentuk yang dikejar randomra , a ... a ... b , tampaknya jauh lebih langka. Hanya ada 7 solusi yang kurang dari 10 1700 , yang terbesar adalah 12 digit.

4 set digit berulang
Nomor dari formulir ini, a ... ab ... bc ... cd ... d , tampaknya lebih padat daripada yang saya cari. Ada 69 solusi kurang dari 10 100 , dibandingkan dengan 32 menggunakan 3 set digit berulang. Antara 10 11 dan 10 100 adalah sebagai berikut:

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

Ada argumen heuristik sederhana mengapa ini harus terjadi. Untuk setiap panjang digital, ada sejumlah set berulang (yaitu 3 set berulang, atau 4 set berulang, dll.) Di mana jumlah solusi yang diharapkan akan menjadi yang tertinggi. Transisi terjadi ketika jumlah solusi tambahan yang mungkin, diambil sebagai rasio, melebihi probabilitas bahwa jumlah tambahan yang akan diperiksa adalah prima. Mengingat sifat eksponensial dari kemungkinan untuk memeriksa, dan sifat logaritmik dari distribusi bilangan prima, ini terjadi relatif cepat.

Jika, misalnya, kami ingin menemukan solusi 300 digit, memeriksa 4 set digit berulang akan jauh lebih mungkin menghasilkan solusi daripada 3 set, dan 5 set akan lebih mungkin lagi. Namun, dengan kekuatan komputasi yang saya miliki, menemukan solusi yang jauh lebih besar dari 100 digit dengan 4 set akan berada di luar kapasitas saya, apalagi 5 atau 6.

primo
sumber
3
Solusi apa pun dari formulir ini d^x e^y f^zmemerlukan setidaknya dua panjang urutan menjadi aneh untuk menghindari keterbelahan oleh 11. Saya tidak tahu apakah is_primeakan menolak kelipatan 11 dengan cukup cepat untuk membuat ini tidak layak secara eksplisit memperhitungkan.
Peter Taylor
Saya tidak memiliki sumber gmp di depan saya, tetapi sangat mungkin dimulai dengan pembagian percobaan atas bilangan prima kecil. Namun, (na&1)+(nb&1)+(nc&1) > 1cukup sederhana sehingga harus lebih cepat. Tunggu sebentar, ini bisa cabang pendek penuh curcuit! Jika nagenap, dan nb + ncganjil, maka salah satunya [nb, nc]harus genap, dan Anda bisa langsung beralih ke yang berikutnya na.
primo
Hati-hati jika Anda menggunakan gmpy.is_prime (). Di luar titik tertentu itu probabilistik, jadi Anda perlu memeriksa itu mengembalikan a 2. 1berarti itu hanya mungkin perdana
gnibbler
4
Tes langsung dan tepat untuk dapat dibagi oleh 11 adalah menambahkan semua digit pada posisi genap dan mengurangi semua digit pada posisi ganjil (atau sebaliknya) dan memeriksa apakah hasilnya kelipatan 11. Sebagai konsekuensi wajar (tetapi juga bisa menjadi deduced langsung), Anda dapat mengurangi semua urutan 2+ digit identik menjadi 0 atau 1 digit (dengan mengambil panjang urutan% 2). 44444440000077777777777 dengan demikian berkurang menjadi 407; 4 + 7-0 = 11. 444444444444444444444444444444444444444444444444441111111113333333333333333333333333 berkurang menjadi 13.
aditsu
1
"robust"! = terbukti. Perbedaannya tidak penting bagi sebagian orang, penting bagi orang lain. PrimeQ di Mathematica adalah varian BPSW plus MR tambahan dengan basis 3, jadi tentu saja itu hanya akan memakan waktu beberapa milidetik. Pari / GP membuktikan angka 274 digit menggunakan APR-CL dalam waktu sekitar 3 detik pada komputer berusia 5 tahun, dan ECPP open-source single-core memakan waktu sekitar 2 detik. Tidak mengherankan jika dibutuhkan waktu lebih lama untuk Jawa, tetapi ini bukan masalah besar. Saya memiliki terjemahan Perl saya tentang BPSW di semua 4, maka bukti pada semua 4 hanya jika mereka semua lulus tes murah.
DanaJ
5

222223333333 (12 digit)

Di sini saya hanya mencari format aa..aabb..bb hingga 100 digit. Hanya hit lainnya adalah 23 37 53 73 113 311.

Kode J (dibersihkan) (maaf, tidak ada penjelasan):

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
randomra
sumber
Pencarian lengkap formulir ini hingga 1560 digit (dan terus bertambah) mengungkapkan tidak ada yang lebih besar dari solusi 12 digit ini.
Primo
2

Sunting: Seseorang sudah melakukan analisis lebih dalam daripada yang saya lakukan di sini.

Bukan solusi tetapi perkiraan kasar pada jumlah solusi n-digit.

Diperkirakan sejumlah solusi

Menghasilkan kode J

   ops=: 'title ','Estimated number of solutions by digits',';xcaption ','digits',';ycaption ','log10 #'
   ops plot 10^.((%^.)%(2&(%~)@^.@(%&10))^(10&^.))(10&^(2+i.100))
randomra
sumber
Terima kasih. Sumbu y agak membingungkan. Apakah Anda benar-benar berarti 10 ^ -100 sebagai perkiraan jumlah solusi dengan sekitar 86 digit?
motl7
Iya. Jika ada sejumlah solusi yang terbatas itu bisa dipercaya. Meskipun berdasarkan pada data yang ada , estimasi ini agak kurang baik karena angka berulang membuat korelasi antara angka dengan satu digit lebih sedikit.
randomra
1
Seseorang sudah melakukan analisis yang lebih dalam dari saya
random
Apakah sumbu y proporsi angka dengan x digit yang merupakan solusi? Itu adalah jumlah solusi yang dibagi 10 ^ (# digit)? Tidak dapat berupa angka yang terlihat seperti 4, 11 dll. Dan log yang hampir selalu di atas 1.
motl7
1

Javascript (Brute Force)

Belum menemukan angka yang lebih tinggi

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

Tanpa perpustakaan bigint, javascript terbatas pada bilangan bulat <= 2^53.

Karena itu Javascript, browser akan mengeluh jika kita tidak merilis utas eksekusi untuk UI untuk memperbarui, sebagai hasilnya, saya memutuskan untuk melacak di mana algoritma sedang dalam perkembangannya di UI.

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);
Shmiddty
sumber
@ Schchiddty Ada pustaka int besar untuk js tetapi metode brute force ini tampaknya hancur.
motl7
1
@ motl7 Setuju, biarkan beroperasi sepanjang malam, dan tidak ada jawaban yang ditemukan.
Shmiddty
1

Tautan ke analisis masalah telah diposting, tetapi saya pikir ada beberapa hal yang hilang. Mari kita lihat jumlah digit m, yang terdiri dari urutan k dari 1 atau lebih digit identik. Terlihat bahwa jika kita membagi digit ke dalam grup {0, 3, 6, 9}, {1, 4, 7}, dan {2, 5, 8}, solusi tidak dapat mengandung digit dari grup kedua dan ketiga , dan harus mengandung 3n + 2 digit dari salah satu grup ini. Setidaknya dua dari sekuens k harus memiliki jumlah digit ganjil. Dari digit {1, 4, 7} hanya 1 dan 7 yang bisa menjadi digit terendah. Tak satu pun dari {2, 5, 8} yang bisa menjadi digit terendah. Jadi ada empat (1, 3, 7, 9) atau dua (3, 9) pilihan untuk digit terendah,

Ada berapa kandidat? Kami memiliki m digit yang dipisah dalam urutan k minimal 1 digit. Ada (m - k + 1) lebih dari (k - 1) cara untuk memilih panjang urutan ini, yaitu sekitar (m - 1.5k + 2) ^ (k - 1) / (k - 1) !. Ada 2 atau 4 pilihan untuk digit terendah, total enam. Ada enam pilihan untuk digit lainnya, kecuali 36/7 pilihan untuk digit tertinggi; totalnya adalah (6/7) * 6 ^ k. Ada 2 ^ k cara untuk memilih apakah panjang urutannya genap atau ganjil; k +1 dari ini dikecualikan karena tidak ada atau hanya satu yang aneh; kita mengalikan jumlah pilihan dengan (1 - (k + 1) / 2 ^ k), yaitu 1/4 ketika k = 2, 1/2 ketika k = 3, 11/16 ketika k = 4 dll. Angka digit dari himpunan {1, 4, 7} atau {2, 5, 8} harus 3n + 2, sehingga jumlah pilihan dibagi 3.

Mengalikan semua angka ini, jumlah kandidat adalah

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

atau

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

Kandidat itu sendiri dan nomor k yang dibuat dengan menghapus digit harus semuanya bilangan prima. Probabilitas bilangan bulat acak di sekitar N adalah prima adalah sekitar 1 / ln N. Probabilitas untuk angka m acak adalah sekitar 1 / (m ln 10). Namun, angka-angka di sini tidak acak. Mereka semua telah dipilih untuk tidak dapat dibagi oleh 2, 3, atau 5. 8 dari 30 bilangan bulat berturut-turut tidak dapat dibagi dengan 2, 3, atau 5. Oleh karena itu, probabilitas untuk menjadi yang utama adalah (30/8) / (m ln 10) atau sekitar 1,6286 / m.

Jumlah solusi yang diharapkan adalah sekitar

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

atau untuk m besar tentang

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

Untuk k = 2, 3, 4, ... kami mendapatkan yang berikut:

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

Dari k = 10 dan seterusnya, angkanya semakin kecil lagi.

gnasher729
sumber
5
Selamat datang di PPCG! Ini adalah analisis yang sangat baik; namun, kami mencari jawaban sebagai tanggapan sah terhadap pertanyaan itu. Dengan kata lain, kode. Sayangnya, itu meninggalkan sedikit ruang dalam struktur kami untuk posting komentar saja, yang diturunkan ke komentar posting. Namun, saya akan benci melihat upaya menyeluruh seperti itu diturunkan ke tumpukan lumpur kami, jadi saya ingin mengisyaratkan bahwa jika Anda menambahkan program komputer yang dirancang untuk menjawab persyaratan tantangan pada posting Anda, itu akan lebih mungkin untuk disimpan sekitar.
Jonathan Van Matre
1
Juga, saya sangat menyarankan Anda memeriksa situs saudara kami: math.stackexchange.com dan mathoverflow.net
Jonathan Van Matre