Dengan semiprime N , temukan bilangan bulat positif terkecil m sehingga representasi biner dari salah satu dari dua faktor N dapat ditemukan dalam representasi biner N * m .
Contoh
Mari kita pertimbangkan semiprime N = 9799 .
Kami mencoba berbagai nilai m , mulai dari 1:
m | N * m | N * m in binary
---+--------+------------------
1 | 9799 | 10011001000111
2 | 19598 | 100110010001110
3 | 29397 | 111001011010101
4 | 39196 | 1001100100011100
5 | 48995 | 1011111101100011
6 | 58794 | 1110010110101010
7 | 68593 | 10000101111110001
8 | 78392 | 10011001000111000
9 | 88191 | 10101100001111111
10 | 97990 | 10111111011000110
11 | 107789 | 11010010100001101
Kami berhenti di sini karena representasi biner dari produk terakhir berisi 101001
yang merupakan representasi biner dari 41 , salah satu dari dua faktor 9799 (yang lain adalah 239 ).
Jadi jawabannya adalah 11 .
Aturan dan catatan
- Mencoba bahkan nilai-nilai m adalah sia-sia. Mereka ditunjukkan dalam contoh di atas demi kelengkapan.
- Program Anda harus mendukung N apa pun yang N * m berada dalam kemampuan komputasi bahasa Anda.
- Anda diperbolehkan untuk pd N terlebih dahulu daripada mencoba setiap substring yang mungkin dari representasi biner dari N * m untuk melihat jika ternyata menjadi faktor N .
- Sebagaimana dibuktikan oleh MitchellSpector , m selalu ada.
- Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang. Celah standar dilarang.
Uji kasus
Kolom pertama adalah input. Kolom kedua adalah output yang diharapkan.
N | m | N * m | N * m in binary | Factor
-----------+------+---------------+----------------------------------------------+-------
9 | 3 | 27 | [11]011 | 3
15 | 1 | 15 | [11]11 | 3
49 | 5 | 245 | [111]10101 | 7
91 | 1 | 91 | 10[1101]1 | 13
961 | 17 | 16337 | [11111]111010001 | 31
1829 | 5 | 9145 | 1000[111011]1001 | 59
9799 | 11 | 107789 | 1[101001]0100001101 | 41
19951 | 41 | 817991 | 1[1000111]101101000111 | 71
120797 | 27 | 3261519 | 11000[1110001]0001001111 | 113
1720861 | 121 | 208224181 | 11000110100[100111111101]10101 | 2557
444309323 | 743 | 330121826989 | 100110011011100110010[1101010010101011]01 | 54443
840000701 | 4515 | 3792603165015 | 11011100110000[1000110000111011]000101010111 | 35899
1468255967 | 55 | 80754078185 | 1001011001101010100010[1110001111]01001 | 911
Jawaban:
Pyth, 13 byte
Demonstrasi
Penjelasan:
sumber
05AB1E ,
181615 byte-2 byte terima kasih kepada Riley!
-1 byte terima kasih kepada Emigna!
Penjelasan:
Cobalah online!
sumber
¹Ñ¦¨båO
harus bekerja alih-alih memeriksa setiap substring.¼
dan¾
denganN
.JavaScript (ES6),
969580 byteFungsi yang mengembalikan fungsi rekursif yang menggunakan fungsi rekursif yang menggunakan fungsi rekursif. Saya benar-benar mulai bertanya-tanya apakah
.toString(2)
rute akan lebih pendek ...Tetapkan ke variabel mis.
f=n=>...
Dan panggil dengan sepasang parens ekstraf(9)()
,. Jika itu tidak diizinkan ( pos meta berada di + 6 / -2), Anda dapat menggunakan versi 83 byte ini dengan doa standar:Kedua versi berfungsi untuk semua kecuali tiga kasus uji terakhir. Anda dapat mencoba kasus uji ini juga dengan mengubah
x>>1
ke(x-x%2)/2
.sumber
Utilitas Bash + Unix,
8584 byteCobalah online!
Saya akan tunjukkan juga bahwa m selalu ada untuk semiprime n. Inilah alasannya:
Tulis n = pq, di mana p dan q adalah prima dan p <= q.
Biarkan b jumlah digit dalam representasi biner dari n-1. Kemudian, untuk setiap k antara 0 dan n-1 inklusif, p * (2 ^ b) + k dalam biner terdiri dari representasi biner dari p diikuti oleh b bit tambahan yang mewakili k.
Jadi angka p * (2 ^ b) + k untuk 0 <= k <= n-1, ketika ditulis dalam biner, semua dimulai dengan representasi biner dari p. Tetapi ini adalah n angka berurutan, jadi salah satunya harus merupakan kelipatan dari n.
Ini mengikuti bahwa kita memiliki beberapa mn dari n yang representasi binernya dimulai dengan representasi biner dari p.
Berdasarkan ini, seseorang dapat datang dengan batas atas untuk m dari 2 sqrt (n). (Seseorang mungkin bisa mendapatkan batas atas yang lebih ketat dari ini.)
sumber
Haskell, 161 byte
Pemeriksaan langsung. Faktor pertama, kemudian cari linear mulai dari 1 dan ambil nilai minimum untuk kedua faktor.
Butuh beberapa detik untuk testcase terakhir (
1468255967
),ghci
lapor(15.34 secs, 18,610,214,160 bytes)
di laptop saya.sumber
Mathematica, 83 byte
sumber
Brachylog (2), 14 byte
Cobalah online!
Ada lebih dari satu cara untuk menulis ini dalam 14 byte di Brachylog, jadi saya mencari yang paling efisien. Seperti yang umum untuk pengiriman Brachylog, ini adalah pengiriman fungsi; inputnya adalah semiprime, outputnya adalah pengali.
Penjelasan
Urutan evaluasi Prolog dan Brachylog diatur oleh kendala pertama yang tidak dapat langsung disimpulkan dari input. Dalam program ini, itu adalah kendala pada hasil perkalian, sehingga penerjemah akan bertujuan untuk menjaga operan perkalian sedekat mungkin dengan 0. Kami tahu salah satu operan, dan yang lainnya adalah output, jadi kami menemukan output terkecil yang kami bisa, yang persis apa yang kami inginkan.
sumber
PowerShell , 136 byte
Cobalah online!
Sangat panjang karena cara kerja konversi-ke-biner di PowerShell. : - /
Mengambil input
$n
, loop melalui2
ke$n-1
dan tarikan keluar faktor!($n%$_)
. Mengirimkannya ke dalam loop|%{...}
danconvert
s masing-masing ke2
string biner (basis ). Menyimpan string biner itu ke dalam$a
.Lalu kita memasuki
for(){...}
loop tak terbatas . Setiap iterasi, kami menambah++$m
, mengalikannya dengan$n
, danconvert
itu ke string biner, disimpan ke dalam$b
. Kemudian,if
string itu adalah regex-like
semua string$a
, kita output$m
danexit
.sumber
Perl 6 , 66 byte
Berbasis Regex.
Super lambat, karena kasar memaksa faktor n lagi di setiap posisi pertandingan regex dari setiap nomor yang dicoba.
Menghitung faktor hanya sekali, meningkatkan kinerja tetapi membuatnya 72 byte:
sumber