Trova il numero di sottogruppi di un gruppo finito


14

definizioni

Puoi saltare questa parte se conosci già le definizioni di gruppi , gruppi finiti e sottogruppi .

gruppi

Nell'algebra astratta, un gruppo è una tupla (G, ∗) , dove G è un insieme e è una funzione G × G → G tale che vale quanto segue:

  • Chiusura: per tutti x, y in G , x ∗ y è anche in G (implicito dal fatto che è una funzione G × G → G ).

  • Associatività: per tutti x, y, z in G , (x ∗ y) ∗ z = x ∗ (y ∗ z) .

  • Identità: esiste un elemento e in G tale che per tutti x in G , x ∗ e = x = e ∗ x .

  • Inverso: per ogni x in G , esiste un elemento y in G tale che x ∗ y = e = y ∗ x , dove e è l'elemento di identità menzionato nel precedente punto elenco.

Gruppi finiti

Un gruppo finito è un gruppo (G, ∗) in cui G è finito, cioè ha finitamente molti elementi.

sottogruppi

Un sottogruppo (H, ∗) di un gruppo (G, ∗) è tale che H è un sottoinsieme di G (non necessariamente sottoinsieme proprio) e (H, ∗) è anche un gruppo (cioè soddisfa i 4 criteri sopra).

Esempi

Considera il gruppo diedro D 3 (G, ∗) dove G = {1, A, B, C, D, E} e è definito di seguito (una tabella come questa è chiamata tabella di Cayley ):

∗ | 1 ABCDE
- + ----------------------
1 | 1 ABCDE
A | AB 1 DIC
B | B 1 AECD
C | CED 1 BA
D | DCEA 1 B
E | EDCBA 1

In questo gruppo, l'identità è 1 . Inoltre, A e B sono inverse l'una dall'altra, mentre 1 , C , D ed E sono le inversioni di se stessi rispettivamente (l'inverso di 1 è 1 , l'inverso di C è C , l'inverso di D è D e il l'inverso di E è E ).

Ora, possiamo verificare che (H, ∗) dove H = {1, A, B} è un sottogruppo di (G, ∗) . Per la chiusura, consultare la tabella seguente:

∗ | 1 AB
- + ----------
1 | 1 AB
A | AB 1
B | B 1 A

dove tutte le possibili coppie di elementi in H sotto * dare un membro di H .

All'associatività non richiede controllo, poiché gli elementi di H sono elementi di G .

L'identità è 1 . Questo deve essere lo stesso con l'identità del gruppo. Inoltre, l'identità in un gruppo deve essere unica. (Puoi provarlo?)

Per l'inverso, controllare che l'inversa di A è B , che è un membro di H . L'inverso di B è A , che è anche un membro di H . L'inverso di 1 è ancora esso stesso, che non richiede controllo.


Compito

Descrizione

Dato un gruppo finito (G, ∗) , trova il numero dei suoi sottogruppi.

Ingresso

Per un gruppo (G, *) , si riceverà una matrice 2D di dimensioni n × n , dove n è il numero di elementi in G . Supponiamo che l'indice 0sia l'elemento identità. L'array 2D rappresenterà la tabella di moltiplicazione. Ad esempio, per il gruppo sopra, riceverai il seguente array 2D:

[[0, 1, 2, 3, 4, 5],
[1, 2, 0, 4, 5, 3],
[2, 0, 1, 5, 3, 4],
[3, 5, 4, 0, 2, 1],
[4, 3, 5, 1, 0, 2],
[5, 4, 3, 2, 1, 0]]

Ad esempio, puoi vedere 3 ∗ 1 = 5 perché a[3][1] = 5, dov'è ala matrice 2D sopra.

Appunti:

  • È possibile utilizzare un array 2D con 1 indice.
  • La riga e la colonna per l'identità possono essere omesse.
  • Puoi usare altri formati come ritieni opportuno, ma deve essere coerente. (ad esempio, potresti desiderare che l'ultimo indice sia invece identità, ecc.)

Produzione

Un numero positivo che rappresenta il numero di sottogruppi nel gruppo.

Ad esempio, per il gruppo sopra, (H, ∗) è un sottogruppo di (G, ∗) ogni volta che H =

  • {1}
  • {1, A, B}
  • {1, C}
  • {1, D}
  • {1, E}
  • {1, A, B, C, D, E}

Pertanto, ci sono 6 sottogruppi e l'output per questo esempio dovrebbe essere 6.


suggerimenti

Puoi leggere gli articoli a cui ho collegato. Questi articoli contengono teoremi su gruppi e sottogruppi che potrebbero esserti utili.


punteggio

Questo è . Rispondi con il conteggio dei byte più basso vince.


Oh, non era chiaro per me l' e si riferisce specificamente all'elemento identità, non solo a qualsiasi risultato intermedio.
orlp,

@orlp chiarito.
Leaky Nun,

Se hai intenzione di chiamare 0l'elemento identità, allora è confuso che l'operatore sia descritto come moltiplicazione ...
Neil

@Neil eh ... quando le convenzioni si scontrano.
Leaky Nun,

1
Supponevo che gli elementi nell'elenco 2D fossero identici agli indici delle loro righe / colonne, altrimenti come identificheresti quale riga / colonna va con quale?
Ørjan Johansen,

Risposte:


8

Mathematica, 62 48 byte

Count[Subsets@First@#,x_/;Union@@#[[x,x]]==x]-1&

Funzione pura che prevede un array 2D a 1 indice. Counts il numero di Subsetsdella Firstriga dell'array di input chiuso sotto l'operazione di gruppo. Poiché questo includerà l'insieme vuoto, sottraggiamo 1. Si noti che un sottoinsieme non vuoto di un gruppo finito chiuso sotto l'operazione di gruppo è in realtà un sottogruppo (e viceversa, per definizione).

A rigor di termini, non controllo che il sottoinsieme xsia chiuso sotto l'operazione di gruppo, restringo la tabella di moltiplicazione al sottoinsieme xe controllo che contenga esattamente gli elementi di x. Chiaramente ciò implica che xè chiuso rispetto all'operazione di gruppo. Al contrario, qualsiasi sottogruppo xconterrà 1e quindi xsarà un sottoinsieme degli elementi che compaiono nella tabella di moltiplicazione limitata e, poiché xè chiuso sotto l'operazione di gruppo, deve essere uguale x.


4

Haskell , 79 byte

Fondamentalmente un porto del metodo Mathematica di ngenisi. (Tranne che sto usando array con indice 0).

cprende un elenco di liste di se Intrestituisce un numero intero.

c g=sum[1|l<-foldr(\r->([id,(r!!0:)]<*>))[[]]g,and[g!!x!!y`elem`l|x<-l,y<-l]]-1

Provalo online!

Si presume che le Ints siano numerate allo stesso modo delle righe (elenchi esterni) e delle colonne che mostrano la loro moltiplicazione. Pertanto, poiché 0 è l'identità, la prima colonna è uguale agli indici delle righe. Ciò consente di utilizzare le voci della prima colonna per costruire i sottoinsiemi.

Come funziona

  • c è la funzione principale.
  • g è l'array di gruppo come un elenco di elenchi.
  • lè un sottoinsieme degli elementi. L'elenco dei sottoinsiemi è costruito come segue:
    • foldr(\r->([id,(r!!0:)]<*>))[[]]gpiega una funzione sulle righe di g.
    • rè una riga di g, il cui primo (0 °) elemento viene estratto come elemento che può essere incluso ( (r!!0:)) o meno ( id).
    • <*> combina le scelte per questa riga con le seguenti.
  • and[g!!x!!y`elem`l|x<-l,y<-l]verifica per ogni coppia di elementi lse è presente il loro multiplo l.
  • sum[1|...]-1 conta i sottoinsiemi che superano il test, tranne uno, il sottoinsieme vuoto.

3

Gelatina , 17 16 byte

1 byte grazie a ETHproductions ( LR → J)

ị³Z⁸ịFḟ
JŒPÇÐḟL’

JŒPÇÐḟL’  main link. one argument (2D array)
J         [1,2,3,...,length of argument]
 ŒP       power set of ^
    Ðḟ    throw away elements that pass the test...
   Ç      in the helper link
      L   length (number of elements that do not pass)
       ’  decrement (the empty set is still closed under
          multiplication, but it is not a subgroup, as
          the identity element does not exist.)

ị³Z⁸ịFḟ   helper link. one argument (1D indexing array)
ị³        elements at required indices of program input (2D array)
  Z       transpose
   ⁸ị     elements at required indices of ^
     F    flatten
      ḟ   remove elements of ^ that are in the argument given
          if the set is closed under multiplication, this will
          result in an empty set, which is considered falsey.

Provalo online! (1-indicizzati)


Puoi fare Jinvece di LRsalvare un byte :-)
ETHproductions

@ETHproductions Eeeek !!! grazie per averlo individuato.
Leaky Nun,

3

Python 2, 297 215 byte

from itertools import*
T=input()
G=T[0]
print sum(all(T[y][x]in g for x,y in product(g,g))*all(any(T[y][x]==G[0]==T[x][y]for y in g)for x in g)*(G[0]in g)for g in chain(*[combinations(G,n)for n in range(len(G)+1)]))

Provalo online

Questo programma funziona senza il gruppo di esempio ==T[x][y] , ma sono ancora abbastanza sicuro che sia necessario.

Modifica: ora presuppone che l'elemento identità di G sia sempre il primo.


Ungolfed:

from itertools import*
T=input()
G=T[0]
def f(x,y):return T[y][x]                                           # function
def C(g):return all(f(x,y)in g for x,y in product(g,g))             # closure
def E(g):return[all(f(x,y)==y for y in g)for x in g]                # identity

a=E(G)
e=any(a)
e=G[a.index(1)]if e else-1                                          # e in G

def I(G):return all(any(f(x,y)==e==f(y,x)for y in G)for x in G)     # inverse

#print e
#print C(G),any(E(G)),I(G)

#for g in chain(*[combinations(G,n)for n in range(len(G)+1)]):      # print all subgroups
#   if C(g)and I(g)and e in g:print g

print sum(C(g)*I(g)*(e in g)for g in chain(*[combinations(G,n)for n in range(len(G)+1)]))

TIO ungolfed

Gli elementi di gruppo negativi possono essere supportati gratuitamente cambiando -1in ''.


Perché controlli l'identità? L'identità è garantita per essere il primo elemento. Basta creare tutte le combinazioni senza il primo elemento e aggiungere il primo elemento a ciascuna combinazione.
orlp,

"Supponiamo che 0 sia l'elemento identità."
orlp,

Sì, ma ciò non significa che sia il primo della lista. Pensavo stesse parlando del numero 0dell'esempio, non dell'indice.
mbomb007,

@ mbomb007 è chiaramente l'indice
Leaky Nun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.