Descrizione
Scrivi una funzione f(m, G)
che accetta come argomenti una mappatura m
e un insieme / elenco di interi distinti, non negativi G
.
m
dovrebbe mappare coppie di numeri interi in G
nuovi numeri interi in G
. ( G
, m
) è garantito per formare un gruppo abeliano finito , ma qualsiasi elemento di G
può essere l'identità.
C'è un teorema importante che dice:
f
deve restituire un elenco di poteri primi [p1, ... pn]
in ordine crescente tale che
Esempi
f((a, b) → (a+b) mod 4, [0, 1, 2, 3])
dovrebbe tornare[4]
, poiché i parametri descrivono il gruppo Z 4 .f((a, b) → a xor b, [0, 1, 2, 3])
dovrebbe tornare[2, 2]
, poiché i parametri descrivono un gruppo isomorfo su Z 2 × Z 2 .f((a, b) → a, [9])
dovrebbe tornare[]
, poiché i parametri descrivono il gruppo banale; cioè, il prodotto di zero gruppi ciclici.Definire
m
come segue:(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) * 9
Quindi
f(m, [0, 1, ..., 80])
dovrebbe tornare[3, 3, 9]
, poiché questo gruppo è isomorfo su Z 3 × Z 3 × Z 9
Regole
m
può essere una funzione (o un puntatore a una funzione)Int × Int → Int
o un dizionario che si associaG × G
a nuovi elementi diG
.f
può prendere i suoi parametri nell'ordine opposto, cioè puoi anche implementaref(G, m)
.L'implementazione dovrebbe teoricamente funzionare per input arbitrariamente grandi, ma non deve essere effettivamente efficiente.
Non ci sono limiti all'uso di built-in di alcun tipo.
Si applicano le regole standard del code-golf . Vince il codice più breve in byte.
Classifica
Affinché il tuo punteggio appaia sul tabellone, dovrebbe essere in questo formato:
# Language, Bytes
for a in G: for b in G: d[(a, b)] = m(a, b)
).
AABC
, trattandoli come triple (A, B, C)
, con modulo di aggiunta a coppie (9, 3, 3)
.
m
è consentito essere un dizionario, potresti fornire anche i casi di test come dizionari?