Antecedentes
La última vez, contamos grupos de un tamaño determinado , lo cual es un problema no trivial.
Esta vez, solo contaremos grupos abelianos , es decir, grupos con una operación conmutativa. Formalmente, un grupo (G, *) es abeliano si x * y = y * x para para todo x, y en G .
El problema se vuelve mucho más simple de esta manera, por lo que vamos a contarlos de manera eficiente.
Tarea
Escriba un programa o función que acepte un número entero no negativo n como entrada e imprima o devuelva el número de grupos abelianos no isomórficos de orden n .
Una forma de calcular el número de grupos, que denotaremos con A (n) , es observando lo siguiente:
A (0) = 0
Si p es primo, A (p k ) es igual al número de particiones enteras de k . (cfr. OEIS A000041 )
Si n = mk , y m y k son co-primos, A (n) = A (m) A (k) .
Puede usar este o cualquier otro método para calcular A (n) .
Casos de prueba
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
(tomado de OEIS A000688 )
Reglas adicionales
Dado el tiempo suficiente, RAM y un tamaño de registro que puede contener la entrada, su código debería funcionar (en teoría) para enteros arbitrariamente grandes.
El código debe funcionar para todos los números enteros entre 0 y 2 63 - 1 y el acabado en menos de 10 minutos en mi máquina (Intel i7-3770, 16 GiB de RAM, Fedora 21).
Asegúrese de cronometrar su código para los últimos tres casos de prueba antes de enviar su respuesta.
FiniteAbelianGroupCount
No se permiten las funciones integradas que trivializan esta tarea, como las de Mathematica .No se permiten los elementos integrados que devuelven o cuentan las particiones enteras de un número o las particiones de una lista.
Se aplican reglas estándar de código de golf .