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 .
fonte
Respostas:
CJam (
3938 bytes)Demonstração online
Isso segue a linha sugerida para encontrar uma fatoração principal (
mF
) e, em seguida, calcular as partições de cada potência e obter seu produto.Existem dois casos especiais para
mF
: fatores0
como0^1
e1
como1^1
. O último não requer tratamento especial: há um grupo abeliano de tamanho 1 e uma partição de 1. No entanto, zero requer um caso especial.A contagem de partições usa uma recorrência para
A008284(n, k)
o número de partiçõesn
emk
partes. No OEIS é dado comomas acho que é mais útil pensar na soma como variando de
1
atémin(k, n-k)
.Dissecação
fonte
CJam,
50494743 bytesUsa a
mF
fatoração incorporada do CJam e uma porta memorizada dessa função de número de partição Python:ou ungolfed:
Como a resposta de @ RetoKoradi, o último caso leva cerca de 17 segundos no intérprete offline, porque é esse tempo que o CJam leva para fatorar o número. Por isso, deixei de fora desta suíte de testes on - line .
Explicação completa
fonte
Mathematica,
969488 bytesEu não sou tão proficiente com o Mathematica, mas pensei em tentar. Obrigado a @ MartinBüttner por -6 bytes.
Isso usa a fórmula da função geradora para partições inteiras.
fonte
CJam, 58 bytes
Experimente online
O último exemplo de teste leva uma eternidade (ou pelo menos mais do que eu estava disposto a esperar) no intérprete online, mas termina em 17 segundos com a versão offline do CJam no meu laptop. Todos os outros exemplos de teste são praticamente instantâneos.
Isso usa o CJam
mF
operador , que fornece a fatoração principal com expoentes. O resultado é então o produto da partição conta para cada expoente.A parte principal do código é calcular a contagem de partições. Eu implementei o algoritmo recursivo na página da Wikipedia , usando o
j
operador que suporta recursão com memorização.Explicação:
fonte