sfondo
L'ultima volta, abbiamo contato gruppi di una determinata dimensione , il che è un problema non banale.
Questa volta, conteremo solo i gruppi abeliani , cioè i gruppi con un'operazione commutativa. Formalmente, un gruppo (G, *) è abeliano se x * y = y * x per per tutti x, y in G .
Il problema diventa molto più semplice in questo modo, quindi li conteremo in modo efficiente.
Compito
Scrivi un programma o una funzione che accetta un numero intero non negativo n come input e stampa o restituisce il numero di gruppi abeliani non isomorfi dell'ordine n .
Un modo per calcolare il numero di gruppi - che indicheremo con A (n) - è osservando quanto segue:
A (0) = 0
Se p è un numero primo, A (p k ) è uguale al numero di partizioni intere di k . (cfr. OEIS A000041 )
Se n = mk e m e k sono co-primi, A (n) = A (m) A (k) .
È possibile utilizzare questo o qualsiasi altro metodo di calcolo di A (n) .
Casi test
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
(tratto da OEIS A000688 )
Regole aggiuntive
Dato abbastanza tempo, RAM e una dimensione del registro che può contenere l'input, il tuo codice dovrebbe funzionare (in teoria) per interi arbitrariamente grandi.
Il codice deve funzionare per tutti i numeri interi compresi tra 0 e 2 63 - 1 e terminare in meno di 10 minuti sulla mia macchina (Intel i7-3770, 16 GiB RAM, Fedora 21).
Prima di inviare la risposta, assicurati di impostare il tempo per il codice per gli ultimi tre casi di test.
Gli incorporamenti che banalizzano questo compito, come quello di Mathematica
FiniteAbelianGroupCount
, non sono ammessi.Non sono consentiti incorporati che restituiscono o contano le partizioni intere di un numero o le partizioni di un elenco.
Si applicano le regole standard del code-golf .