Dengan bilangan bulat non-negatif N
, hasilkan bilangan bulat positif terkecil terkecil yang merupakan pseudoprime kuat untuk semua N
basis utama pertama .
Ini adalah urutan OEIS A014233 .
Kasus Uji (satu-diindeks)
1 2047
2 1373653
3 25326001
4 3215031751
5 2152302898747
6 3474749660383
7 341550071728321
8 341550071728321
9 3825123056546413051
10 3825123056546413051
11 3825123056546413051
12 318665857834031151167461
13 3317044064679887385961981
Kasus uji untuk N > 13
tidak tersedia karena nilai-nilai tersebut belum ditemukan. Jika Anda berhasil menemukan istilah berikutnya dalam urutan, pastikan untuk mengirimkannya ke OEIS!
Aturan
- Anda dapat memilih untuk mengambil
N
sebagai indeks-nol atau nilai satu-indeks. - Ini dapat diterima untuk solusi Anda untuk hanya bekerja untuk nilai-nilai yang dapat diwakili dalam rentang bilangan bahasa Anda (hingga hingga
N = 12
bilangan bulat 64-bit yang tidak ditandatangani), tetapi solusi Anda harus secara teoritis bekerja untuk input apa pun dengan asumsi bahwa bahasa Anda mendukung bilangan bulat panjang sewenang-wenang.
Latar Belakang
Setiap bahkan bilangan bulat positif x
dapat ditulis dalam bentuk x = d*2^s
di mana d
aneh. d
dan s
dapat dihitung dengan membagi berulang kali n
dengan 2 sampai hasil bagi tidak lagi habis dibagi 2. d
adalah hasil bagi akhir, dan s
merupakan jumlah kali 2 membagi n
.
Jika bilangan bulat positif n
adalah bilangan prima, maka teorema kecil Fermat menyatakan:
Dalam bidang terbatas apa pun Z/pZ
(di mana p
bilangan prima), satu-satunya akar kuadrat 1
adalah 1
dan -1
(atau, ekuivalen, 1
dan p-1
).
Kita dapat menggunakan tiga fakta ini untuk membuktikan bahwa salah satu dari dua pernyataan berikut harus benar untuk prime n
(di mana d*2^s = n-1
dan r
merupakan bilangan bulat [0, s)
):
The Miller-Rabin tes primality beroperasi dengan menguji Contrapositive klaim atas: jika ada basis a
sehingga kedua kondisi di atas adalah palsu, maka n
tidak prima. Pangkalan a
itu disebut saksi .
Sekarang, menguji setiap pangkalan di [1, n)
akan sangat mahal dalam waktu perhitungan untuk besar n
. Ada varian probabilistik dari uji Miller-Rabin yang hanya menguji beberapa pangkalan yang dipilih secara acak di bidang terbatas. Namun, ditemukan bahwa pengujian hanya a
basa prima yang cukup, dan dengan demikian pengujian dapat dilakukan secara efisien dan deterministik. Faktanya, tidak semua basis utama perlu diuji - hanya sejumlah tertentu yang diperlukan, dan angka tersebut tergantung pada ukuran nilai yang diuji untuk primality.
Jika jumlah basa prima yang diuji tidak mencukupi, pengujian ini dapat menghasilkan hasil positif palsu - bilangan bulat komposit ganjil di mana pengujian gagal membuktikan kesesuaiannya. Khususnya, jika suatu pangkalan a
gagal untuk membuktikan kekompakan dari suatu bilangan komposit ganjil, angka itu disebut pseudoprime kuat untuk basis a
. Tantangan ini adalah tentang menemukan bilangan komposit ganjil yang memiliki psuedoprimes yang kuat untuk semua pangkalan kurang dari atau sama dengan N
bilangan prima th (yang setara dengan mengatakan bahwa mereka adalah pseudoprim yang kuat untuk semua basis prima kurang dari atau sama dengan N
bilangan prima th) .
Jawaban:
C,
349295277267255 byteMengambil input berbasis 1 pada stdin, misalnya:
Ini tentu saja tidak akan menemukan nilai-nilai baru dalam urutan dalam waktu dekat, tetapi itu menyelesaikan pekerjaan. UPDATE: sekarang lebih lambat!
a^(d*2^r) == (a^d)^(2^r)
)__int128
, yang lebih pendek daripadaunsigned long long
saat bekerja dengan angka yang lebih besar! Juga pada mesin little-endian, printf dengan%llu
masih berfungsi dengan baik.Kurang ditambang
(Sudah kedaluwarsa) Kerusakan
Seperti disebutkan, ini menggunakan input berbasis 1.
Tetapi untuk n = 0 menghasilkan 9, yang mengikuti urutan terkait https://oeis.org/A006945 .Tidak lagi; sekarang tergantung pada 0.Harus bekerja untuk semua n (setidaknya sampai output mencapai 2 ^ 64) tetapi sangat lambat. Saya telah memverifikasi ini pada n = 0, n = 1 dan (setelah banyak menunggu), n = 2.
sumber
Python 2,
633465435292282275256247 byteDiindeks 0
Mengubah dari fungsi ke program menghemat beberapa byte entah bagaimana ...
Jika Python 2 memberi saya cara yang lebih pendek untuk melakukan hal yang sama, saya akan menggunakan Python 2. Division secara default integer, jadi cara yang lebih mudah untuk membagi dengan 2, dan
print
tidak perlu tanda kurung.Cobalah online!
Python terkenal lambat dibandingkan dengan bahasa lain.
Menentukan tes pembagian percobaan untuk kebenaran absolut, kemudian berulang kali menerapkan uji Miller-Rabin sampai pseudoprime ditemukan.
Cobalah online!
EDIT : Akhirnya pegolf jawabannya
EDIT : Digunakan
min
untuk uji keutamaan divisi percobaan dan mengubahnya menjadi alambda
. Kurang efisien, tetapi lebih pendek. Juga tidak bisa menahan diri dan menggunakan beberapa operator bitwise (tidak ada perbedaan panjang). Secara teori seharusnya bekerja (sedikit) lebih cepat.EDIT : Terima kasih @Dave. Editor saya mengendalikan saya. Saya pikir saya menggunakan tab tetapi itu dikonversi menjadi 4 spasi sebagai gantinya. Juga melewati hampir setiap tip Python tunggal dan menerapkannya.
EDIT : Beralih ke pengindeksan 0, memungkinkan saya untuk menyimpan beberapa byte dengan menghasilkan bilangan prima. Juga memikirkan kembali beberapa perbandingan
EDIT : Menggunakan variabel untuk menyimpan hasil tes, bukan
for/else
pernyataan.EDIT : Memindahkan bagian
lambda
dalam fungsi untuk menghilangkan kebutuhan akan suatu parameter.EDIT : Dikonversi ke program untuk menyimpan byte
EDIT : Python 2 menyelamatkan saya byte! Saya juga tidak perlu mengkonversi input
int
sumber
a^(d*2^r) mod n
!Perl + Math :: Prime :: Util, 81 + 27 = 108 byte
Jalankan dengan
-lpMMath::Prime::Util=:all
(penalti 27-byte, aduh).Penjelasan
Bukan hanya Mathematica yang memiliki builtin untuk dasarnya apa saja. Perl memiliki CPAN, salah satu repositori perpustakaan besar pertama, dan yang memiliki banyak koleksi solusi siap pakai untuk tugas-tugas seperti ini. Sayangnya, mereka tidak diimpor (atau bahkan diinstal) secara default, artinya itu pada dasarnya tidak pernah merupakan pilihan yang baik untuk menggunakannya dalam kode-golf , tetapi ketika salah satu dari mereka kebetulan cocok dengan masalah dengan sempurna ...
Kami berjalan melalui bilangan bulat berturut-turut sampai kita menemukan satu yang tidak prima, dan belum semu yang kuat untuk semua basis bilangan bulat dari 2 ke n th prima. Opsi baris perintah mengimpor pustaka yang berisi builtin dalam pertanyaan, dan juga menetapkan input implisit (untuk baris-pada-waktu;
Math::Prime::Util
memiliki pustaka bignum builtin sendiri yang tidak suka baris baru dalam bilangan bulatnya). Ini menggunakan trik Perl standar untuk menggunakan$\
(pemisah jalur keluaran) sebagai variabel untuk mengurangi parsing yang canggung dan memungkinkan keluaran dihasilkan secara implisit.Perhatikan bahwa kita perlu menggunakan di
is_provable_prime
sini untuk meminta ujian prima deterministik, bukan probabilistik. (Terutama mengingat bahwa tes prime probabilistik kemungkinan menggunakan Miller-Rabin di tempat pertama, yang kami tidak bisa berharap untuk memberikan hasil yang dapat diandalkan dalam kasus ini!)Perl + Math :: Prime :: Util, 71 + 17 = 88 byte, bekerja sama dengan @Dada
Jalankan dengan
-lpMntheory=:all
(penalti 17 byte).Ini menggunakan beberapa trik golf Perl yang saya juga tidak tahu (ternyata Math :: Prime :: Util memiliki singkatan!), Tahu tentang tetapi tidak berpikir untuk menggunakan (
}{
untuk output$\
secara implisit sekali, daripada"$_$\"
secara implisit setiap baris) , atau tahu tentang tetapi entah bagaimana berhasil menyalahgunakan (menghapus tanda kurung dari panggilan fungsi). Terima kasih kepada @Dada karena menunjukkan ini kepada saya. Selain itu, itu identik.sumber
ntheory
bukanMath::Prime::Util
. Juga,}{
bukannya;$_=""
harus baik-baik saja. Dan Anda dapat menghilangkan spasi setelah1
dan tanda kurung beberapa panggilan fungsi. Juga,&
berfungsi sebagai ganti&&
. Itu seharusnya menghasilkan 88 byte:perl -Mntheory=:all -lpe '1until!is_provable_prime(++$\)&is_strong_pseudoprime$\,2..nth_prime$_}{'
}{
. (Anehnya, aku ingat soal kurung, tapi sudah lama sejak aku bermain golf di Perl dan tidak bisa mengingat aturan untuk meninggalkannya.) Tapi aku tidak tahu tentangntheory
singkatannya sama sekali.