La description
Écrivez une fonction f(m, G)qui accepte comme arguments un mappage met un ensemble / liste d'entiers distincts et non négatifs G.
mdoit mapper des paires d'entiers dans Gde nouveaux entiers dans G. ( G, m) est garanti pour former un groupe abélien fini , mais tout élément de Gpeut être l'identité.
Il existe un théorème important qui dit:
fdoit renvoyer une liste des principaux pouvoirs [p1, ... pn]dans l'ordre croissant de telle sorte que
Exemples
f((a, b) → (a+b) mod 4, [0, 1, 2, 3])devrait revenir[4], car les paramètres décrivent le groupe Z 4 .f((a, b) → a xor b, [0, 1, 2, 3])devrait revenir[2, 2], car les paramètres décrivent un groupe isomorphe à Z 2 × Z 2 .f((a, b) → a, [9])devrait revenir[], car les paramètres décrivent le groupe trivial; c'est-à-dire le produit de groupes cycliques nuls.Définissez
mcomme suit:(a, b) → (a mod 3 + b mod 3) mod 3 + ((floor(a / 3) + floor(b / 3)) mod 3) * 3 + ((floor(a / 9) + floor(b / 9)) mod 9) * 9Puis
f(m, [0, 1, ..., 80])devrait revenir[3, 3, 9], car ce groupe est isomorphe à Z 3 × Z 3 × Z 9
Règles
mpeut être soit une fonction (ou un pointeur de fonction vers une fonction)Int × Int → Int, soit un dictionnaire mappant des pairesG × Gvers de nouveaux éléments deG.fpeut prendre ses paramètres dans l'ordre inverse, c'est-à-dire que vous pouvez également l'implémenterf(G, m).Votre implémentation devrait théoriquement fonctionner pour des entrées arbitrairement grandes, mais n'a pas besoin d'être réellement efficace.
Il n'y a aucune limitation à l'utilisation de modules intégrés de quelque nature que ce soit.
Les règles de code-golf standard s'appliquent. Le code le plus court en octets gagne.
Classement
Pour que votre score apparaisse sur le tableau, il doit être dans ce format:
# Language, Bytes
for a in G: for b in G: d[(a, b)] = m(a, b)).
AABC, les traitant comme des triplets (A, B, C), avec un module d'addition par paire (9, 3, 3).
mest autorisé à être un dictionnaire, pourriez-vous également fournir les cas de test sous forme de dictionnaires?