Python, 89 86 85 byte
f=lambda n,k=0:126^sum(1>>n%i<<7*(n/i%i<1)for i in range(2,n))and f(n+k,k%2*2+~k)or n
Algoritma ini adalah O (menakutkan) untuk memulai dan rekursi tidak benar-benar membantu, tetapi bekerja dengan baik selama n cukup dekat dengan angka 7DP.
Terima kasih kepada @xnor karena bermain golf 3 byte!
Uji di repl.it .
Bagaimana itu bekerja
Python tidak memiliki fitur bawaan atau faktorisasi, tetapi kita dapat mengidentifikasi angka 7DP dengan jumlah dan sifat pembagi mereka.
Dengan prinsip penggandaan, jumlah pembagi bilangan bulat dapat dihitung sebagai produk dari eksponen yang bertambah dari faktorisasi utamanya. Dengan demikian, σ 0 (n) ( fungsi pembagi ) adalah 2 m setiap kali n adalah nomor mDP.
σ 0 (n) = 128 dengan demikian merupakan kondisi yang diperlukan, tetapi itu tidak cukup; misalnya, σ 0 (2 127 ) = 128 , tetapi 2 127 jelas bukan angka 7DP. Namun, jika σ 0 (n) = 128 dan tidak ada kuadrat sempurna yang membagi n secara merata, maka n adalah angka 7DP.
Untuk input n , algoritma terdiri dalam memeriksa bilangan bulat n , n - 1 , n + 1 , n - 2 , n + 2 , dll. Dan mengembalikan yang pertama yaitu angka 7DP.
Ketika f dipanggil dengan argumen n , hal berikut terjadi:
Kode
126^sum(1>>n%i<<7*(n/i%i<1)for i in range(2,n))
tes jika n adalah tidak sejumlah 7DP sebagai berikut.
Untuk semua bilangan bulat i sedemikian sehingga 1 <i <n , 1>>n%i<<7*(n/i%i<1)
akan dievaluasi.
Jika n habis dibagi i tapi tidak dengan saya 2 , 1>>n%i
hasil 1 dan (n/i%i<1)
hasil 0 , mengakibatkan
1 · 2 7 · 0 = 1 .
Jika n dapat dibagi dengan i 2 , 1>>n%i
dan (n/i%i<1)
keduanya menghasilkan 1 , menghasilkan 1 · 2 7 · 1 = 128 .
Jika n tidak tidak habis dibagi oleh i , 1>>n%i
menghasilkan 0 , menghasilkan 0 · 2 7 · x = 0 .
Jumlah bilangan bulat yang dihasilkan akan 2 m - 2 jika n adalah nomor MDP (yang 2 m pembagi, tidak termasuk 1 dan n ) dan lebih besar jumlahnya dari 127 jika n memiliki faktor persegi yang sempurna. Dengan demikian, jumlahnya akan menjadi 126 jika dan hanya jika n adalah angka 7DP.
Untuk angka 7DP, jumlahnya adalah 126 , jadi XORing dengan 126 menghasilkan 0 , yang salah. Dengan demikian, bagian atau lambda dieksekusi dan f mengembalikan nilai saat ini dari n .
Jika n bukan angka 7DP, XOR akan mengembalikan nilai kebenaran yang tidak nol. Dengan demikian, bagian dan lambda dieksekusi.
f(n+k,k%2*2+~k)
panggilan rekursif f dengan nilai n yang diperbarui (potensi nomor 7DP berikutnya) dan k (perbedaan antara kandidat baru dan yang berikutnya).
Jika k adalah bilangan bulat genap, non-negatif, k%2*2
menghasilkan 0 dan ~k
menghasilkan - (k + 1) . Jumlah dari kedua hasil adalah - (k + 1) , yang merupakan bilangan bulat ganjil, negatif yang 1 lebih besar dalam nilai absolut daripada k .
Jika k adalah bilangan bulat ganjil, negatif, k%2*2
hasilkan 2 dan ~k
hasilkan - (k + 1) . Jumlah kedua hasil adalah 2 - (k + 1) = - (k - 1) , yang merupakan bilangan bulat genap, non-negatif yang 1 unit lebih besar dalam nilai absolut daripada k .
Ini berarti bahwa k mengambil nilai 0, -1, 2, -3, 4, ⋯ .
Ketika ditambahkan secara kumulatif ke n 0 (nilai awal n ), bilangan bulat yang dihasilkan adalah
- n 0 + 0
- ( n 0 + 0) - 1 = n 0 - 1
- ( n 0 - 1) + 2 = n 0 + 1
- ( n 0 + 1) - 3 = n 0 - 2
- ( n 0 - 2) + 4 = n 0 + 2
- dll.
memastikan jumlah 7DP pertama kita jumpai adalah sebagai dekat dengan n 0 mungkin.
k
secara langsungf(n+k,k%2*2+~k)
, dimulai dengank=0
.Brachylog ,
444016 byteDicoret 44 masih teratur 44; (
Contoh:
Mungkinkah bahasa ini tidak selalu payah? Saya mengalahkan Jelly dan MATL!
Kasing uji dengan
5
adalah yang terpanjang dan membutuhkan sekitar 10 detik pada mesin saya.Ini akan menjadi 12 byte jika
$p
tidak disadap (kita tidak perlu>0,.
bagian itu)Penjelasan
Brachylog menggunakan pemrograman logika kendala secara default untuk semua aritmatika integer. Apalagi pelabelan built-in
=
berfungsi pada domain yang mungkin tidak terbatas.Itu berturut-turut menyatukan variabel tanpa kendala (yaitu dalam
(-inf, inf)
) seperti:0, 1, -1, 2, -2, 3, …
.Oleh karena itu, kita bisa mendapatkan nomor 7DP terdekat dengan mencari nomor pertama yang
I
disatukan(-inf, inf)
(menggunakan pengulangan otomatis), yangInput + I
merupakan angka 7DP.sumber
$p
. Secara teori saya tidak perlu>0,
, tetapi implementasi saya buggy: PInput+1, Input-1, Input+2, Input-2, Input+3, ...
itu : karena itu 7DP pertama yang ditemukan dengan metode itu akan menjadi yang terdekat.>0,.
tidak diperlukan)Jelly, 17 byte
Bekerja secara teori, tetapi membutuhkan waktu bertahun-tahun untuk menyelesaikannya.
Berikut adalah versi yang benar-benar berfungsi untuk input yang diberikan, tetapi secara teoritis gagal untuk input besar:
Coba di sini. Ini menghasilkan semua bilangan prima hingga 50, kemudian menemukan semua 7-kombinasi bilangan prima dalam daftar itu, dan kemudian semua produk mereka. Akhirnya, ia hanya menemukan elemen terdekat dari daftar itu dengan argumen yang diberikan.
Tentu saja, setelah 7DP kami mengandung bilangan prima lebih tinggi dari 50, ini akan gagal. Versi teoritis menghasilkan semua bilangan prima hingga 256n untuk input n , tetapi sebaliknya berfungsi dengan cara yang sama.
Bukti
Biarkan
p(x)
menunjukkan prima berikutnya setelahx
. Batas atas (sangat longgar) untuk produk 7DP terdekat dengan x adalah:Jadi kita hanya perlu memeriksa bilangan prima dalam [2 ... p (p (p (p (p (p (p (x))))))))))] . Postulat Bertrand mengatakan bahwa p (x) ≤ 2x , jadi cukup untuk memeriksa semua bilangan prima hingga 128x .
sumber
×⁹ÆRœc7P€µạ³ỤḢị
atau×⁹ÆRœc7P€µạ³NMị
(mencetak array semua solusi) menghemat beberapa byte. Juga,×⁹
dapat diubah+⁴
untuk meningkatkan efisiensi.MATL ,
2117161413 byteTerima kasih kepada Dennis untuk saran yang menghapus 4 byte, dan yang lain menyimpan 1 byte lebih!
Ini berfungsi secara teori, tetapi kehabisan memori untuk input di atas
6
(kompiler online).Versi yang lebih efisien menggunakan 21 byte , dan menghitung semua kasus uji dalam waktu sekitar satu detik:
Cobalah online!
Penjelasan
Versi hemat memori
Ambil input N =
860782
sebagai contoh. Itu sudah cukup untuk mempertimbangkan bilangan prima hingga M =29
, yang merupakan perdana pertama yang dikalikan dengan2*3*5*7*11*13
melebihi N . Dalam contoh ini2*3*5*7*11*13*29 = 870870
,. Perdana berikutnya adalah31
. Setiap produk yang melibatkan yang prima atau lebih besar akan setidaknya2*3*5*7*11*13*31 = 930930
, dan itu dijamin tidak menjadi solusi, karena melebihi870870
yang melebihi N .M dihitung sebagai bilangan prima pertama lebih besar dari
max(N/(2*3*5*7*11*13), 16)
. Themax
Fungsi digunakan untuk memastikan bahwa setidaknya17
diambil. Untuk menyimpan beberapa byte, kode tersebut diganti2*3*5*7*11*13 = 30030
dengan30000
, dan berfungsi sebagaimax
tambahan. Perubahan ini valid karena memberi nilai lebih besar.Versi tidak efisien memori
Untuk lebih mengurangi jumlah byte, divisi dapat dihapus; sebenarnya, itu sudah cukup untuk dikalikan dengan
17
(terima kasih, @ Dennis). Ini memastikan bahwa prime berikutnya dimasukkan (oleh postulat Bertrand ) dan bahwa hasilnya setidaknya17
. Ini bekerja secara teori, tetapi kehabisan memori untuk input yang lebih besar dari sekitar6
.Di dalam kode, bagian
diganti oleh
sumber
Pyke, 32 byte
Coba di sini!
Perhatikan ini tidak berfungsi online - itu habis. Versi ini hanya memeriksa 2 bilangan prima yang berbeda dan harus bekerja lebih cepat. Ketika ada 2 angka dengan jarak yang sama jauh dari target, ia memilih yang lebih rendah.
Ini melewati semua angka sampai menemukan yang lebih besar dari input dan 7DP. Untuk setiap nomor, itu menghilangkannya jika bukan 7DP. Ia kemudian memiliki daftar 7DP hingga input dengan yang lebih besar. Itu kemudian mengambil salah satu yang paling dekat dengan input.
sumber
Julia, 59 byte
Ini sangat tidak efisien, tetapi berfungsi untuk kasus uji pertama dalam praktik dan untuk teori lainnya.
Dengan biaya 5 byte lebih - untuk total 64 byte - efisiensi dapat ditingkatkan secara dramatis.
Cobalah online!
Latar Belakang
Seperti disebutkan dalam jawaban @ LuisMendo , himpunan bilangan prima yang harus kita pertimbangkan untuk angka 7DP terdekat cukup kecil. Cukup untuk set yang berisi angka 7DP yang lebih besar dari input n , yang akan benar jika dan hanya jika itu berisi p utama ≥ 17 sehingga 30300p = 2 · 3 · 5 · 7 · 11 · 13 · p ≥ n .
In Pada interval yang mengandung setidaknya satu bilangan prima membuktikan bahwa interval [x, 1,5x) berisi setidaknya satu bilangan prima setiap kali x ≥ 8 . Sejak 30030/16384 ≈ 1,83 , itu berarti harus ada p prima dalam (n / 30030, n / 16384) setiap kali n> 8 · 30300 = 242400 .
Akhirnya, ketika n <510510 , p = 17 sudah cukup jelas, jadi kita hanya perlu mempertimbangkan bilangan prima hingga n / 16384 + 17 .
Dengan biaya efisiensi, kita dapat mempertimbangkan bilangan prima hingga 17n sebagai gantinya. Ini bekerja ketika n = 1 dan jauh lebih besar dari n / 16384 + 17 untuk nilai n yang lebih besar .
Bagaimana itu bekerja
17n|>primes
dann>>14+17|>primes
(bithift sama dengan membaginya dengan 2 14 = 16384 ) menghitung rentang prima yang disebutkan dalam paragraf sebelumnya. Kemudian,combinations(...,7)
hitung semua array dari tujuh bilangan prima yang berbeda dalam rentang itu, dan pemetaanprod
atas mereka yang menghitung produk mereka, yaitu, angka 7DP dari mana kita akan memilih jawabannya.Selanjutnya,
-n
kurangi n prom setiap 7DP angka, lalu urutkansort(...,by=abs)
perbedaan dengan nilai absolutnya. Akhirnya, kami memilih perbedaan pertama dengan[]
dan menghitung angka 7DP yang sesuai dengan menambahkan n dengan+n
.sumber
Pyth, 30 byte
Cobalah online!
Suite uji.
(5 terlalu lama untuk dijalankan)
Penjelasan
sumber
Mathematica
136 8075 byteIni adalah pendekatan langsung, bekerja keluar dari
n
.n
adalah produk prime 7-berbeda jika jumlah faktor prima adalah 7 (PrimeNu@#==7
) dan tidak satu pun dari faktor-faktor ini muncul lebih dari sekali (SquareFreeQ@#&
).Kiriman saya sebelumnya (136 bytes) menemukan produk 7-berbeda-prime pertama di atas
n
dan, jika ada, produk 7-berbeda-prime pertama di bawah inin
. Itu kemudian hanya menentukan mana yang lebih dekatn
. Jika produknya sama, maka keduanya akan dikembalikan.Versi saat ini memeriksa n-1, n + 1, n-2, n + 2 ... hingga mencapai produk 7-berbeda-prime pertama. Versi yang lebih efisien ini mengadopsi pendekatan yang diambil Dennis.
Kemajuan kunci digunakan
⌊k/2](-1)^k⌋
untuk mengembalikan seri, 0, 1, -1, 2, -2 ... Nol digunakan untuk memeriksa apakahn
itu sendiri adalah produk 7-berbeda-prima. Karena alasan ini,Floor
(yaitu,⌊...⌋
) digunakan sebagai gantiCeiling
.510510
870870
1438710
sumber
05AB1E , 10 byte
Cobalah online!
Mencoba semua kombinasi 7 dari 10 prima input pertama **. Kehabisan memori untuk input yang lebih besar dari 1.
Versi 14 byte yang jauh lebih efisien:
Cobalah online!
Menggunakan bilangan prima pertama (input / 100000 + 7).
sumber