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.
highley(1) == 1? Seseorang tidak memiliki faktor prima, jadi daftar yang dihasilkan di 4) adalah[1, 0], jadihighley(1) == 2seperti yang saya lihat.