Untuk mengatasi masalah ini saya pertama kali mengamati itu
Di mana adalah jumlah pembagi (tidak harus prima) dari . Jika adalah bilangan bulat terkecil sehingga , maka
Sekarang kita harus memilih sedemikian rupa sehingga minimal. Pilihan untuk sepele - mereka hanya bilangan prima dalam urutan menaik.
Namun, pemikiran pertama saya untuk memilih salah. Saya pikir Anda bisa memfaktorkan , mengurutkan faktor dalam urutan menurun dan mengurangi 1. Sebagian besar waktu ini berfungsi dengan baik, misalnya bilangan bulat terkecil dengan pembagi adalah:
Tetapi ini tidak benar untuk :
Sedangkan jawaban yang benar adalah:
Jadi jelas kadang-kadang kita perlu menggabungkan faktor. Dalam hal ini karena . Tapi saya tidak benar-benar melihat strategi penggabungan yang bersih dan langsung. Sebagai contoh, orang mungkin berpikir kita harus selalu bergabung dengan kekuatan, tetapi ini tidak benar: 2
Saya tidak dapat langsung memikirkan contoh, tetapi insting saya mengatakan bahwa beberapa pendekatan rakus dapat gagal jika mereka menggabungkan kekuatan yang salah terlebih dahulu.
Apakah ada strategi optimal sederhana untuk menggabungkan kekuatan-kekuatan ini untuk mendapatkan jawaban yang benar?
Tambahan. Algoritma serakah yang memeriksa setiap kemungkinan penggabungan dan melakukan yang terbaik berdasarkan penggabungan-penggabungan, gagal pada . Rangkaian penggabungan satu-per-satu adalah:
Namun solusi optimalnya adalah:
sumber
Jawaban:
Inilah solusinya, berdasarkan komentar saya di atas. Saya tidak mengklaim ini optimal.
Idenya adalah untuk mempertimbangkan , yang kami definisikan sebagai "bilangan bulat positif terkecil dengan tepat pembagi dan faktor prima yang berbeda". Kami melakukan pengamatan mudah:n mT(n,m) n m
Dan kami juga memiliki pengulangan:
Akhirnya, jumlah yang Anda cari adalah
Untuk itu, berikut adalah beberapa kode Python, yang setuju dengan semua angka yang Anda berikan di atas. Perhatikan bahwa ia bekerja dengan logaritma untuk menjaga angka lebih kecil: sehingga bilangan bulat yang sebenarnya Anda cari adalah
round(2**smallest(n))
.sumber
powerset
for factor_list in powerset(factors)
ke sesuatu yang menghasilkan masing-masing pembagi yang berbedan
tepat sekali. Dengan begitu, untuk, katakanlah, , ketika Anda mempertimbangkan solusi yang mengandung persis bilangan prima pertama sebagai faktor utama yang berbeda, Anda hanya akan melakukan pekerjaan non-rekursif daripada , yang eksponensial dalam . 2 k O ( k 2 ) O ( ( 2 kmultiplicative_partitions(24)
, yang menghasilkan (antara lain) partisi[4, 3, 2]
dan[6, 2, 2]
, yang (setelah membalik urutan untuk memberikan faktor prima terkecil eksponen tertinggi) sesuai dengan solusi dan , masing-masing. Algoritma Steve D tidak akan pernah mempertimbangkan solusi yang terakhir, karena telah menentukan bahwa subsolution . 2 5 3 1 5 1 2 3 3 2 = 72 < 2 5 3 1 = 96Calon yang memungkinkan untuk "bilangan bulat terkecil dengan n pembagi" adalah bilangan bulat dari formulir mana ≥ b ≥ c ... dan (a + 1) (b +1) (c + 1) ... = n.2Sebuah⋅ 3b⋅ 5c. . .
Jadi, Anda perlu menemukan semua cara untuk mengekspresikan n sebagai produk bilangan bulat ≥ 2 dalam urutan non-naik, dan menghitung dan memeriksa kandidat yang sesuai. Misalnya, ketika n = 16, 16 = 8 · 2 = 4 · 4 = 4 · 2 · 2 = 2 · 2 · 2 · 2, jadi kemungkinannya adalah , , , , dan yang terkecil adalah .27⋅ 3 23⋅ 33 23⋅ 3 ⋅ 5 2 ⋅ 3 ⋅ 5 ⋅ 7 23⋅ 3 ⋅ 5 = 120
Jika n adalah produk dari dua bilangan prima p · q, p ≥ q, satu-satunya kandidat adalah dan , dan yang terakhir selalu lebih kecil .2p q- 1 2p - 1⋅ 3q- 1
Anda dapat mengetahui beberapa kondisi ketika mungkin ada faktor misalnya, dengan memeriksa apakah untuk beberapa prime x yang bukan merupakan faktor. Dalam contoh n = 16, ada faktor karena .2a b - 1 2a b - 1> 2a - 1⋅ xb - 1 23 23< 2 ⋅ 7
sumber