pengantar
Pertimbangkan urutan bilangan bulat f yang didefinisikan sebagai berikut:
- f (2) = 2
- Jika n adalah prime yang aneh, maka f (n) = (f (n-1) + f (n + 1)) / 2
- Jika n = p · q adalah komposit, maka f (n) = f (p) · f (q)
Tidak terlalu sulit untuk melihat bahwa f (n) = n untuk setiap n ≥ 2 , dan dengan demikian menghitung f tidak akan menjadi tantangan yang sangat menarik. Mari kita memutar definisi: membagi dua case pertama dan menggandakan case kedua. Kami mendapatkan urutan baru g yang didefinisikan sebagai berikut:
- g (2) = 1
- Jika n adalah prime yang aneh, maka g (n) = g (n-1) + g (n + 1)
- Jika n = p · q adalah komposit, maka g (n) = g (p) · g (q)
Tugas
Tugas Anda adalah mengambil integer n ≥ 2 sebagai input, dan menghasilkan g (n) sebagai output. Anda tidak perlu khawatir tentang integer overflow, tetapi Anda harus dapat menghitung g (1025) = 81 dengan benar, dan algoritme Anda seharusnya bekerja secara teoritis untuk input besar yang sewenang-wenang.
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang.
Contoh
Saya mengklaim di atas bahwa g (1025) = 81 , jadi mari kita hitung dengan tangan. Faktorisasi utama 1025 memberi
1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)
Karena 41 adalah prima, kita dapatkan
g(41) = g(40) + g(42)
Selanjutnya, kami menghitung faktorisasi utama 40 dan 42 :
40 = 2*2*2*5 => g(40) = g(2)*g(2)*g(2)*g(5) = g(5)
42 = 2*3*7 => g(42) = g(2)*g(3)*g(7) = g(3)*g(7)
Untuk bilangan prima kecil ini kita dapatkan
g(3) = g(2) + g(4) = 1 + 1 = 2
g(5) = g(4) + g(6) = 1 + 2 = 3
g(7) = g(6) + g(8) = 2 + 1 = 3
Ini artinya
g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9
dan
g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81
Uji kasus
Berikut adalah nilai g hingga 50 .
2 -> 1
3 -> 2
4 -> 1
5 -> 3
6 -> 2
7 -> 3
8 -> 1
9 -> 4
10 -> 3
11 -> 5
12 -> 2
13 -> 5
14 -> 3
15 -> 6
16 -> 1
17 -> 5
18 -> 4
19 -> 7
20 -> 3
21 -> 6
22 -> 5
23 -> 7
24 -> 2
25 -> 9
26 -> 5
27 -> 8
28 -> 3
29 -> 9
30 -> 6
31 -> 7
32 -> 1
33 -> 10
34 -> 5
35 -> 9
36 -> 4
37 -> 11
38 -> 7
39 -> 10
40 -> 3
41 -> 9
42 -> 6
43 -> 11
44 -> 5
45 -> 12
46 -> 7
47 -> 9
48 -> 2
49 -> 9
50 -> 9
sumber
15, 21, 25, 29, 33, 41
, dan banyak lagi, tapi saya tidak dapat menemukan pola nyata mengapa.)a(2*n) = a(n)
, dana(2*n+1) = a(n) + a(n+1)
berlaku jika2*n+1
prime. Untuk banyak bilangan ganjil lainnya, barangkali urutan-urutannya setuju secara kebetulan.Jawaban:
Haskell, 69 byte
Contoh penggunaan:
(#2) 1025
->81
Parameter
a
dihitung sampai membelahx
atau mencapaix
(yaitux
prima). Ini menjadi salah satu byte pendek untuk menguji untuka > x
dan menambahkan kondisi lebih lanjut (a < x
) untuk uji modulus bukan pengujian untuka == x
, karena mantan mengikata
untukx+1
, yang membantu dalam panggilan rekursif. Membandingkan:sumber
Jelly , 18 byte
Cobalah online!
Ini pada dasarnya hanya terjemahan langsung dari spesifikasi. (Setelah memikirkannya sedikit, saya menduga bahwa jika ada rumus tertutup untuk menemukan urutan, itu akan lebih banyak byte daripada pendekatan langsung.)
Penjelasan
Kami memiliki dua fungsi yang saling rekursif. Inilah fungsi pembantu (yang menghitung g (n) untuk prime n ):
Dan inilah program utamanya, yang menghitung g (n) untuk setiap n :
Jelas, jika kita memanggil program utama pada bilangan prima, semuanya adalah no-op kecuali
Ç
, sehingga mengembalikan g (n) dalam kasus ini. Sisa program menangani perilaku untuk komposit n .sumber
JavaScript (ES6), 59 byte
Uji
Tampilkan cuplikan kode
sumber
Python 2,
8569 bytesumber
Jelly , 13 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Clojure, 126 byte
Yay! Hampir dua kali lipat jawaban Python!
Tidak disatukan dan penjelasan:
sumber
(.indexOf (for [...] ...) x)
!(t 1025)
, mungkinif
itu dimaksudkan:when
? Tapi kemudiannth
dari lemparan daftar kosongIndexOutOfBoundsException
.Mathematica, 83 byte
Fungsi rekursif tanpa nama dari satu argumen integer positif, mengembalikan integer. Tidak terlalu pendek, pada akhirnya.
Tr[#0/@({#-1,#+1}/2)]
(dalam kasus di mana input adalah prima) memanggil fungsi pada kedua anggota pasangan yang dipesan{(#-1)/2,(#+1)/2}
dan menambahkan hasilnya; ini bagus karena fungsi memiliki nilai yang sama pada(#-1)/2
dan#-1
, misalnya. Demikian pula,1##&@@#0/@Divisors@#~Part~{2,-2}
memanggil fungsi pada pembagi terkecil kedua#
dan pembagi complememtary (pembagi pembesar kedua) dan mengalikan jawaban bersama-sama.sumber
#0
di jawaban ini .Clojure, 120 byte
Penggunaan
:when
untuk mendapatkan pembagin
,F
adalahnil
jika pembagi tersebut tidak ditemukan (n
prima).sumber
Python 2 , 62 byte
Cobalah online!
sumber