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 .
fuente
Respuestas:
CJam (
3938 bytes)Demostración en línea
Esto sigue la línea sugerida de encontrar una factorización prima (
mF
) y luego calcular las particiones de cada potencia y tomar su producto.Hay dos casos especiales para
mF
: factoriza0
como0^1
y1
como1^1
. Este último no requiere un tratamiento especial: hay un grupo abeliano de tamaño 1 y una partición de 1. Sin embargo, cero requiere un caso especial.El recuento de particiones usa una recurrencia para
A008284(n, k)
el número de particionesn
enk
partes. En OEIS se da comopero creo que es más útil pensar que la suma va de
1
amin(k, n-k)
.Disección
fuente
CJam,
50494743 bytesUtiliza la
mF
factorización integrada de CJam y un puerto memorizado de esta función de número de partición de Python:o sin golf:
Al igual que la respuesta de @ RetoKoradi, el último caso tarda unos 17 segundos en el intérprete fuera de línea porque eso es lo que le toma a CJam factorizar el número. Por lo tanto, lo he dejado fuera de este conjunto de pruebas en línea .
Explicación completa
fuente
Mathematica,
969488 bytesNo soy tan competente con Mathematica, pero pensé en intentarlo. Gracias a @ MartinBüttner por -6 bytes.
Esto usa la fórmula de la función generadora para particiones enteras.
fuente
CJam, 58 bytes
Pruébalo en línea
El último ejemplo de prueba lleva una eternidad (o al menos más de lo que estaba dispuesto a esperar) en el intérprete en línea, pero termina en 17 segundos con la versión fuera de línea de CJam en mi computadora portátil. Todos los demás ejemplos de prueba son casi instantáneos.
Esto usa el CJam
mF
operador , que proporciona la factorización prima con exponentes. El resultado es entonces el producto de los recuentos de partición para cada exponente.La parte principal del código es calcular los recuentos de particiones. Implementé el algoritmo recursivo en la página de wikipedia , utilizando el
j
operador que admite la recursividad con la memorización.Explicación:
fuente