Contexte
La dernière fois, nous avons compté des groupes d'une taille donnée , ce qui n'est pas un problème trivial.
Cette fois, nous ne compterons que les groupes abéliens , c'est-à-dire les groupes avec une opération commutative. Formellement, un groupe (G, *) est abélien si x * y = y * x pour tous pour x, y dans G .
Le problème devient beaucoup plus simple de cette façon, nous allons donc les compter efficacement.
Tâche
Écrivez un programme ou une fonction qui accepte un entier non négatif n en entrée et imprime ou renvoie le nombre de groupes abéliens non isomorphes d'ordre n .
Une façon de calculer le nombre de groupes - que nous désignerons par A (n) - est d'observer ce qui suit:
A (0) = 0
Si p est un nombre premier, A (p k ) est égal au nombre de partitions entières de k . (cf. OEIS A000041 )
Si n = mk , et m et k sont co-premiers, A (n) = A (m) A (k) .
Vous pouvez utiliser cette méthode ou toute autre méthode de calcul de A (n) .
Cas de 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
(extrait de OEIS A000688 )
Règles supplémentaires
Avec suffisamment de temps, de RAM et une taille de registre pouvant contenir l'entrée, votre code devrait fonctionner (en théorie) pour des entiers arbitrairement grands.
Votre code doit fonctionner pour tous les entiers compris entre 0 et 2 63 - 1 et se terminer en moins de 10 minutes sur ma machine (Intel i7-3770, 16 Go de RAM, Fedora 21).
Veuillez vous assurer de chronométrer votre code pour les trois derniers cas de test avant de soumettre votre réponse.
Les éléments intégrés qui banalisent cette tâche, comme Mathematica
FiniteAbelianGroupCount
, ne sont pas autorisés.Les fonctions intégrées qui renvoient ou comptent les partitions entières d'un nombre ou les partitions d'une liste ne sont pas autorisées.
Les règles de code-golf standard s'appliquent.