Kadang-kadang, ketika menulis sebuah program, Anda perlu menggunakan bilangan prima karena alasan tertentu (misalnya kriptografi). Saya berasumsi bahwa kadang-kadang, Anda perlu menggunakan nomor komposit juga. Terkadang, setidaknya di sini di PPCG, program Anda harus dapat menangani perubahan yang sewenang-wenang. Dan dalam keadaan yang dibuat dengan mudah untuk membuat pertanyaan PPCG yang menarik, mungkin bahkan angka yang Anda gunakan harus tahan terhadap korupsi ...
Definisi
Bilangan komposit adalah bilangan bulat ≥ 4 yang bukan bilangan prima, yaitu bilangan bulat yang lebih besar dari 1. Bilangan komposit tahan bitflip didefinisikan sebagai berikut: bilangan bulat positif komposit, yang jika Anda menulisnya dalam biner dalam jumlah bit minimum yang mungkin, Anda dapat mengubah satu atau dua bit dari angka tersebut, dan jumlahnya masih berupa gabungan.
Contoh
Sebagai contoh, perhatikan angka 84. Dalam biner, itu 1010100
. Berikut adalah semua angka yang berbeda tidak lebih dari 2 bit dari itu:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
Kolom pertama adalah angka dalam biner; kolom kedua adalah angka dalam desimal. Seperti yang ditunjukkan kolom ketiga, semua angka ini adalah gabungan. Dengan demikian, 84 adalah nomor komposit tahan-bitflip.
Tugas
Anda harus menulis salah satu dari tiga program atau fungsi berikut, yang mana yang paling masuk akal untuk bahasa Anda:
- Suatu program atau fungsi yang mengambil bilangan bulat n negatif sebagai input, dan mengeluarkan bilangan komposit n bitflip-tahan pertama.
- Sebuah program atau fungsi yang mengambil bilangan bulat positif n sebagai input, dan output semua nomor komposit bitflip tahan kurang dari n (atau jika Anda suka, kurang dari atau sama dengan n , yaitu Anda dapat memilih apakah n termasuk dalam output jika bitflip -tahan).
- Program atau fungsi yang tidak mengambil input, dan mengeluarkan semua nomor komposit yang tahan-bitflip. (Ini harus menggunakan mekanisme output yang mampu menghasilkan output saat program masih berjalan, seperti mencetak ke stdout, daftar malas, atau generator; Anda tidak bisa hanya menghitung seluruh daftar dan kemudian mencetaknya.)
Uji kasus
Berikut adalah beberapa angka komposit tahan-bitflip pertama:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Klarifikasi
- Hanya angka yang Anda hasilkan yang harus tahan terhadap bitflips. Ini bukan tugas membuat program yang tahan terhadap bitflips; gunakan angka apa pun dalam program itu sendiri yang Anda sukai.
- Angka yang Anda hasilkan tidak harus tahan terhadap bitflip di "nol terkemuka"; bayangkan bahwa jumlahnya akan disimpan dalam jumlah bit minimum yang mungkin, dan hanya bit-bit itu yang harus kebal terhadap flipping. Namun, 1 bit awal pada angka yang Anda hasilkan harus kebal terhadap bitflips.
- Gunakan algoritma apa pun yang Anda suka yang menghasilkan hasil yang tepat; Anda tidak ditandai dengan efisiensi di sini.
- Jika Anda dapat membuktikan bahwa ada banyak angka komposit tahan-bitflip, maka a) pembatasan format output dicabut, dan b) pengodean daftar akan diizinkan (walaupun mungkin lebih bertele-tele daripada hanya menghitungnya). Aturan ini sebagian besar hanya untuk kelengkapan; Saya tidak berharap itu relevan.
Kondisi kemenangan
Ini kode-golf , jadi seperti biasa, lebih pendek lebih baik. Juga seperti biasa, panjang program akan diukur dalam byte.
n
jikan
tahan bitflip? (yaitu membuatnya "kurang dari atau sama dengan n"?)