Hitung urutan bilangan bulat yang berasal dari faktor prima

10

Buat fungsi, ekspresi, atau program yang melakukan hal berikut:

  1. Ambil faktor prima dari angka berapa pun dan jumlahkan. Misalnya, faktor utama 28 adalah 2 2 7, dijumlahkan menjadi 11.
  2. Lipat gandakan hasilnya dengan jumlah faktor prima untuk angka yang diberikan. Misalnya, 28 memiliki 3 faktor utama yang berjumlah 11. 11 * 3 adalah 33.
  3. Ulangi proses ini secara rekursif, simpan daftar yang dihasilkan (yang dimulai dengan nomor asli), hingga Anda mencapai nomor yang sudah termasuk dalam daftar. Berhenti tanpa menambahkan nomor akhir itu, sehingga daftar tidak mengandung duplikat. Progres untuk 28 adalah 28 33, karena 33 menghasilkan 28 lagi.
  4. Hitung elemen dalam daftar yang dihasilkan. Dalam kasus 28, jawabannya adalah 2.

Berikut ini hasilnya 0<n<=10, sehingga Anda dapat memeriksa algoritme Anda.

2 1 1 10 1 11 1 9 5 10

(Seperti yang ditunjukkan oleh balpha, jawabannya higley(1)adalah 2, dari daftar 1 0. Saya awalnya punya 1, karena bug dalam algoritma asli saya yang ditulis dalam J.)

Karena saya seorang SOB yang sombong dan belum menemukan ini di OEIS , sebut saja ini "Higley Sequence," setidaknya selama durasi golf code ini. Sebagai bonus tambahan, temukan dua yang pertama nmemiliki yang terendah di higley(n)mana ntidak prima dan n>1. (Saya pikir hanya ada dua, tapi saya tidak bisa membuktikannya.)

Ini adalah kode standar golf, jadi seperti biasa, penekanan tombol paling sedikit menang, tetapi saya meminta Anda untuk memperbaiki jawaban yang cerdas dalam bahasa lain, bahkan jika itu bertele-tele.

Gregory Higley
sumber
4
Kenapa begitu highley(1) == 1? Seseorang tidak memiliki faktor prima, jadi daftar yang dihasilkan di 4) adalah [1, 0], jadi highley(1) == 2seperti yang saya lihat.
balpha
Bisakah kita mengasumsikan bahwa jumlah input dan nilai antara tidak akan lebih besar dari 2 ^ 31-1 (yaitu cocok dengan integer 32-bit yang ditandatangani)?
Peter Taylor
@ Peter Taylor Sure.
Gregory Higley
Jika ada yang merasa terbantu, urutan OEIS yang secara samar terkait dan dapat memberikan inspirasi adalah A001414, A001222, dan A002217.
Peter Taylor
1
karena Anda belum berkomentar, saya menganggap Anda belum memperhatikan: Saya membuktikan bahwa hanya ada dua fixpoint non-prime dan menambahkannya sebagai lampiran pada posting saya.
Peter Taylor

Jawaban:

6

J, 47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

Mungkin ini akan jauh lebih pendek tanpa menggunakan ^:_, tetapi otak saya sudah cukup digoreng.

Sunting: (47-> 45) Hari kupon ganda.

Pemakaian:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10
Jesse Millikan
sumber
Wow! Solusi AJ yang lebih pendek dari solusi GolfScript. Yang pertama saya lihat. (Saya penggemar berat J.)
Gregory Higley
3
Anda dapat mempersingkat ini dengan menggunakan algoritma yang sedikit berbeda:, #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)yaitu 38 karakter.
Gregory Higley
Wow, saya mencoba mencari tahu bagaimana melakukannya dengan q: tetapi mencoba mengolahnya menjadi solusi 2 p: saya jadi saya tidak mengerti. Jelas dalam retrospeksi.
Jesse Millikan
Fakta bahwa Anda dapat melihat ledakan karakter itu dan mengatakannya " jelas dalam retrospeksi " hanya mengejutkan pikiran saya. Suatu hari saya harus memeriksa Golfscript atau J.
Casey
@Casey saya merasakan hal yang sama pada satu waktu, tetapi semakin banyak Anda belajar dan menggunakan, semakin banyak "melompat keluar pada Anda," meskipun saya masih melihat hal-hal yang harus saya selesaikan. Satu hal yang bermanfaat untuk diketahui tentang J adalah jika Anda menambahkan. atau: setelah simbol, itu menciptakan simbol baru, misalnya, {, {., dan {:semua hal yang berbeda berarti, tapi {-(misalnya) jelas merupakan suatu urutan dua hal, {dan -.
Gregory Higley
5

Golfscript, 68 67 62 61 karakter

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

Ini adalah ekspresi: ia mengambil nstack dan meninggalkan hasilnya di stack. Untuk mengubahnya menjadi program yang mengambil ndari stdin dan mencetak hasilnya ke stdout, ganti [dengan yang pertama~

Inti dari itu adalah [.2@{1$1$%{)}{\1$/1$}if}*;;](28 karakter) yang mengambil nomor teratas pada stack dan (dengan algoritma yang sangat tidak efisien) menghasilkan daftar faktor prima. Setara dengan kode-gaya C:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

Yang 0+sebelumnya {+}*adalah menangani kasus khusus n==1, karena Golfscript tidak suka melipat operasi biner di atas daftar kosong.

Salah satu fixpoint non-prime adalah 27; Saya menemukan ini tanpa menggunakan program dengan mempertimbangkan pemetaan (p a -> a 2 p), yang merupakan fixpoint jika a == p (a-1) / 2 , dan mencoba kecil a. ( a==1Memberikan fixpointedness bilangan prima).

Pencarian dengan program menghasilkan fixpoint kedua: 30 = (2 + 3 + 5) * 3


Lampiran: bukti bahwa hanya ada dua fixpoint non-prime

Notasi: sopfr(x)adalah jumlah dari faktor utama x, dengan pengulangan (A001414). Omega(x)adalah jumlah faktor utama x(A001222). Jadi fungsi penerus Higley adalahh(x) = sopfr(x) Omega(x)

Misalkan kita memiliki fixpoint N = h(N)yang merupakan produk n=Omega(N)bilangan prima.

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

Teori bilangan dasar: nterbagi menjadi p_0 ... p_{n-1}, sehingga w=Omega(n)bilangan prima adalah faktor utama n. Wlog kita akan menganggap mereka yang terakhir w. Jadi kita bisa membagi kedua sisi dengan ndan mendapatkan

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

atau

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

Mengingat bahwa semua bilangan prima p_0untuk p_{n-w-1}lebih besar dari 1, meningkatkan salah satu dari mereka meningkatkan LHS lebih dari RHS. Jadi untuk yang diberikan n, kita dapat menghitung semua solusi kandidat.

Secara khusus, tidak ada solusi jika LHS lebih besar dari pengaturan RHS semua bilangan prima "bebas" menjadi 2. Yaitu tidak ada solusi jika

2^{n-w} > 2 (n-w) + sopfr(n)

Karena sopfr(n) <= n(dengan persamaan hanya untuk n = 4 atau n prime), kita dapat membuat pernyataan yang lebih lemah bahwa tidak ada fixpoint jika

2^{n-w} > 3 n - 2 w

Memegang wtetap kita dapat memilih nilai nmemuaskan yang berbeda w=Omega(n). Tersebut terkecil nadalah 2^w. Perhatikan bahwa jika 2^{n-w}setidaknya 3 (yaitu jika n-w>1, yang benar jika n>2) maka peningkatan nsambil memegang wkonstan akan meningkatkan LHS lebih dari RHS. Perhatikan juga bahwa untuk w>2dan mengambil kemungkinan sekecil mungkin n, ketimpangan terpenuhi, dan tidak ada titik perbaikan.

Itu meninggalkan kita dengan tiga kasus: w = 0dan n = 1; w = 1dan nprima; atau w = 2dan nsemi-prime.

Kasing w = 0. n = 1, begitu Njuga prime.

Kasing w = 1. Jika n = 2itu N = 2pdan kami membutuhkan p = p + 2, yang tidak memiliki solusi. Jika n = 3kemudian kita punya pq = p + q + 3dan dua solusi, (p=2, q=5)dan (p=3, q=3). Jika n = 5demikian 2^4 > 3 * 5 - 2 * 1, maka tidak ada solusi lebih lanjut dengan w = 1.

Kasing w = 2. Jika n = 4itu N = 4pqdan kami membutuhkan pq = p + q + 4. Ini memiliki solusi integer p=2, q=6, tetapi tidak ada solusi utama. Jika n = 6demikian 2^4 > 3 * 6 - 2 * 2, maka tidak ada solusi lebih lanjut dengan w = 2.

Semua kasing habis, sehingga satu-satunya fixpoint non-prime adalah 27 dan 30.

Peter Taylor
sumber
1
Menemukan dua fixpoints yang sama menggunakan pensil-dan-kertas: 27 dan 30. Saya setuju dengan OP, sepertinya itu hanya dua.
mellamokb
1
Pertanyaan menarik berikutnya mungkin. Apakah ada banyak higley (x) = 2? Bagaimana ada cara untuk menghasilkan higley sewenang-wenang (x), seperti higley (x) = 100?
mellamokb
Sangat bagus! Saya seorang lelaki J tetapi mungkin harus belajar GolfScript.
Gregory Higley
@ellamokb Saya pikir ada sejumlah pertanyaan menarik dengan urutan ini. Misalnya, jika kita mempertimbangkan urutan angka yang dihasilkan untuk masing-masing nsebelum dihitung, apakah ada non-prima nsetelah 49 yang urutannya tidak berakhir dalam 28?
Gregory Higley
2
Pertanyaan lain yang menarik untuk ditanyakan adalah apakah ada fungsi sederhana nyang terikat di higley(n)atas. (Itu akan memungkinkan penyederhanaan loop - cukup iterate f(n)times dan kemudian buang duplikat).
Peter Taylor
4

Ruby, 92 karakter

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

Solusi ini mengasumsikan higley (1) sebenarnya 2, bukan 1 (lihat komentar balpha di atas):

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]
Ventero
sumber
2

Oktaf - 109 karakter

l=[input('')];while size_equal(unique(l),l);n=factor(l(1));l=[sum(n)*length(n) l];endwhile;disp(length(l)-1);
Juan
sumber