Latar Belakang
Terakhir kali, kami menghitung kelompok dengan ukuran tertentu , yang merupakan masalah non-sepele.
Kali ini, kami hanya akan menghitung grup Abelian , yaitu grup dengan operasi komutatif. Secara formal, kelompok (G, *) adalah Abelian jika x * y = y * x untuk semua x, y di G .
Masalahnya menjadi lebih sederhana dengan cara ini, jadi kita akan menghitungnya secara efisien.
Tugas
Tulis program atau fungsi yang menerima bilangan bulat non-negatif n sebagai input dan mencetak atau mengembalikan jumlah kelompok Abelian non-isomorfik orde n .
Salah satu cara menghitung jumlah grup - yang akan kami tunjukkan dengan A (n) - adalah dengan mengamati yang berikut:
A (0) = 0
Jika p adalah bilangan prima, A (p k ) sama dengan jumlah partisi integer k . ( cfr . OEIS A000041 )
Jika n = mk , dan m dan k adalah co-prime, A (n) = A (m) A (k) .
Anda dapat menggunakan ini atau metode penghitungan A (n) lainnya .
Uji kasus
Input Output
0 0
1 1
2 1
3 1
4 2
5 1
6 1
7 1
8 3
9 2
10 1
11 1
12 2
13 1
14 1
15 1
16 5
17 1
18 2
19 1
20 2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2
(diambil dari OEIS A000688 )
Aturan tambahan
Diberi cukup waktu, RAM dan ukuran register yang dapat menampung input, kode Anda harus bekerja (secara teori) untuk bilangan bulat besar yang sewenang-wenang.
Kode Anda harus bekerja untuk semua bilangan bulat antara 0 dan 2 63 - 1 dan selesai di bawah 10 menit pada komputer saya (Intel i7-3770, 16 GiB RAM, Fedora 21).
Pastikan Anda menghitung waktu kode Anda untuk tiga kasus pengujian terakhir sebelum mengirimkan jawaban Anda.
Built-in yang meremehkan tugas ini, seperti Mathematica
FiniteAbelianGroupCount
, tidak diperbolehkan.Built-in yang mengembalikan atau menghitung partisi integer angka atau partisi daftar tidak diperbolehkan.
Aturan standar kode-golf berlaku.