tło
Ostatnim razem policzyliśmy grupy o danym rozmiarze , co jest nietrywialnym problemem.
Tym razem policzymy tylko grupy abelowe , tj. Grupy z operacją przemienną. Formalnie, grupę (G *) jest abelową jeśli x * y = y * x w przypadku wszystkich x, y , w G .
W ten sposób problem staje się o wiele prostszy, więc będziemy je skutecznie liczyć.
Zadanie
Napisz program lub funkcję, która przyjmuje nieujemną liczbę całkowitą n jako dane wejściowe i wypisuje lub zwraca liczbę nieizomorficznych abelowych grup rzędu n .
Jednym ze sposobów obliczania liczby grup - które oznaczymy przez A (n) - jest przestrzeganie następujących zasad:
A (0) = 0
Jeśli p jest liczbą pierwszą, A (p k ) jest równe liczbie całkowitych partycji k . ( porównaj OEIS A000041 )
Jeśli n = mk i m oraz k są pierwszymi, A (n) = A (m) A (k) .
Możesz użyć tej lub innej metody obliczania A (n) .
Przypadki testowe
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
(pochodzi z OEIS A000688 )
Dodatkowe zasady
Biorąc pod uwagę wystarczająco dużo czasu, pamięci RAM i rozmiaru rejestru, który może pomieścić dane wejściowe, kod powinien działać (teoretycznie) dla dowolnie dużych liczb całkowitych.
Twój kod musi działać dla wszystkich liczb całkowitych między 0 a 2 63 - 1 i wykończenia w niecałe 10 minut na moim komputerze (Intel i7-3770, 16 GiB RAM, Fedora 21).
Przed przesłaniem odpowiedzi upewnij się, że czas poświęcony został na trzy ostatnie przypadki testowe.
Wbudowane, które trywializują to zadanie, takie jak Mathematica
FiniteAbelianGroupCount
, nie są dozwolone.Wbudowane, które zwracają lub liczą całkowite partycje liczby lub partycje listy są niedozwolone.
Obowiązują standardowe zasady gry w golfa .
źródło
Odpowiedzi:
CJam (
3938 bajtów)Demo online
Jest to zgodne z sugerowaną linią znalezienia pierwszej faktoryzacji (
mF
), a następnie obliczenia podziału każdej mocy i wzięcia ich iloczynu.Istnieją dwa specjalne przypadki
mF
: czynniki uwzględniają0
jako0^1
i1
jako1^1
. Ta ostatnia nie wymaga specjalnego traktowania: istnieje jedna grupa abelowa wielkości 1 i jedna partycja 1. Jednak zero wymaga specjalnego przypadku.Liczenie partycji wykorzystuje powtarzalność dla
A008284(n, k)
liczby partycjin
nak
części. W OEIS jest podany jakoale myślę, że bardziej przydatne jest myślenie o kwocie od
1
domin(k, n-k)
.Sekcja
źródło
CJam,
50494743 bajtówWykorzystuje wbudowaną
mF
faktoryzację CJam i zapamiętany port tej funkcji numeru partycji w języku Python:lub bez golfa:
Podobnie jak odpowiedź @ RetoKoradi, ten ostatni przypadek zajmuje około 17 sekund interpreterowi offline, ponieważ tyle czasu zajmuje CJam na obliczenie liczby. Dlatego zostawiłem to poza tym zestawem testów online .
Pełne wyjaśnienie
źródło
Mathematica,
969488 bajtówNie jestem zbyt biegły w matematyce, ale pomyślałem, że spróbuję. Dzięki @ MartinBüttner za -6 bajtów.
Używa to formuły funkcji generującej dla partycji całkowitych.
źródło
CJam, 58 bajtów
Wypróbuj online
Ostatni przykładowy test trwa wiecznie (lub przynajmniej dłużej, niż chciałem czekać) w tłumaczu online, ale kończy się za 17 sekund z wersją offline CJam na moim laptopie. Wszystkie inne przykłady testów są niemal natychmiastowe.
Używa to
mF
operatora CJam , który daje pierwszą faktoryzację z wykładnikami. Wynik jest wtedy iloczynem partycji dla każdego wykładnika.Główną częścią kodu jest obliczanie liczby partycji. Zaimplementowałem algorytm rekurencyjny na stronie wikipedii , używając
j
operatora obsługującego rekurencję z zapamiętywaniem.Wyjaśnienie:
źródło