fundo
Na última vez, contamos grupos de um determinado tamanho , o que é um problema não trivial.
Desta vez, contaremos apenas grupos abelianos , ou seja, grupos com uma operação comutativa. Formalmente, um grupo (G, ∗) é abeliano se x ∗ y = y ∗ x para todos para x, y em L .
O problema se torna muito mais simples dessa maneira, então vamos contá-los de forma eficiente.
Tarefa
Escreva um programa ou função que aceite um número inteiro não negativo n como entrada e imprima ou retorne o número de grupos abelianos não isomórficos da ordem n .
Uma maneira de calcular o número de grupos - que iremos denotar por A (n) - é observando o seguinte:
A (0) = 0
Se p é um primo, A (p k ) é igual ao número de partições inteiras de k . (cfr. OEIS A000041 )
Se n = mk e m e k são co-primos, A (n) = A (m) A (k) .
Você pode usar este ou qualquer outro método de cálculo de A (n) .
Casos de teste
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
(extraído de OEIS A000688 )
Regras adicionais
Com tempo suficiente, RAM e um tamanho de registro que pode conter a entrada, seu código deve funcionar (em teoria) para números inteiros arbitrariamente grandes.
Seu código deve funcionar para todos os números inteiros entre 0 e 2 63 - 1 e terminar em menos de 10 minutos na minha máquina (Intel i7-3770, 16 GiB de RAM, Fedora 21).
Verifique seu código dos três últimos casos de teste antes de enviar sua resposta.
Built-ins que trivializam essa tarefa, como o Mathematica
FiniteAbelianGroupCount
, não são permitidos.Built-ins que retornam ou contam as partições inteiras de um número ou as partições de uma lista não são permitidos.
Aplicam-se regras padrão de código de golfe .