Encontre o número de subgrupos de um grupo finito


14

Definições

Você pode pular esta parte se já conhece as definições de grupos , grupos finitos e subgrupos .

Grupos

Na álgebra abstrata, um grupo é uma tupla (G, ∗) , onde G é um conjunto e é uma função G × G → G, de modo que o seguinte vale:

  • Fechamento: para todo x, y em G , x ∗ y também está em G (implicado no fato de que é uma função G × G → G ).

  • Associatividade: para todos os x, y, z em G , (x ∗ y) ∗ z = x ∗ (y ∗ z) .

  • Identidade: existe um elemento e em G tal que para todo x em G , x x e = x = e ∗ x .

  • Inverso: para cada x em G , existe um elemento y em G tal que x ∗ y = e = y ∗ x , onde e é o elemento de identidade mencionado no ponto anterior.

Grupos finitos

Um grupo finito é um grupo (G, ∗) onde G é finito, ou seja, possui muitos elementos finitos.

Subgrupos

Um subgrupo (H, ∗) de um grupo (G, ∗) é tal que H é um subconjunto de G (não necessariamente subconjunto apropriado) e (H, ∗) também é um grupo (ou seja, satisfaz os 4 critérios acima).

Exemplos

Considere o grupo diédrico D 3 (G, ∗) onde G = {1, A, B, C, D, E} e é definido abaixo (uma tabela como essa é chamada de tabela de Cayley ):

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

Nesse grupo, a identidade é 1 . Além disso, A e B são inversos um do outro, enquanto 1 , C , D e E são inversos de si mesmos, respectivamente (o inverso de 1 é 1 , o inverso de C é C , o inverso de D é D e o inverso de E é E ).

Agora, podemos verificar que (H, ∗) onde H = {1, A, B} é um subgrupo de (G, ∗) . Para o fechamento, consulte a tabela abaixo:

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

onde todos os pares possíveis de elementos em H abaixo de dão um membro em H .

A associatividade não requer verificação, pois os elementos de H são elementos de G .

A identidade é 1 . Deve ser o mesmo com a identidade do grupo. Além disso, a identidade em um grupo deve ser única. (Você pode provar isso?)

Para o inverso, verificar que o inverso da Uma é B , que é um membro de H . O inverso de B é A , que também é um membro de H . O inverso de 1 ainda é o próprio, o que não requer verificação.


Tarefa

Descrição

Dado um grupo finito (G, ∗) , encontre o número de seus subgrupos.

Entrada

Para um grupo (G, *) , vai receber um conjunto 2D de tamanho n x n , em que n é o número de elementos em L . Suponha que o índice 0seja o elemento de identidade. A matriz 2D representará a tabela de multiplicação. Por exemplo, para o grupo acima, você receberá a seguinte matriz 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]]

Por exemplo, você pode ver que 3 ∗ 1 = 5 porque a[3][1] = 5, onde aestá a matriz 2D acima.

Notas:

  • Você pode usar uma matriz 2D indexada em 1.
  • A linha e a coluna da identidade podem ser omitidas.
  • Você pode usar outros formatos como achar melhor, mas deve ser consistente. (por exemplo, você pode querer que o último índice seja identidade, etc.)

Resultado

Um número positivo que representa o número de subgrupos no grupo.

Por exemplo, para o grupo acima, (H, ∗) é um subgrupo de (G, ∗) sempre que H =

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

Portanto, existem 6 subgrupos, e sua saída para este exemplo deve ser 6.


Dicas

Você pode ler os artigos aos quais vinculei. Esses artigos contêm teoremas sobre grupos e subgrupos que podem ser úteis para você.


Pontuação

Isso é . Responda com os menores ganhos de contagem de bytes.


Oh, não estava claro para mim o e refere-se especificamente ao elemento de identidade, não apenas a qualquer resultado intermediário.
orlp

@orlp esclarecido.
Leaky Nun

Se você quiser chamar 0o elemento de identidade, é confuso ter o operador descrito como multiplicação ...
Neil

@ Neil eh ... quando as convenções se chocam.
Freira vazada

1
Eu assumi que os elementos na lista 2D eram idênticos aos índices de suas linhas / colunas; caso contrário, como você identificaria qual linha / coluna combina com qual?
Ørjan Johansen

Respostas:


8

Mathematica, 62 48 bytes

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

Função pura esperando uma matriz 2D indexada em 1. Counté o número de Subsetsda Firstlinha da matriz de entrada que são fechados sob a operação de grupo. Como isso incluirá o conjunto vazio, subtraímos 1. Observe que um subconjunto não vazio de um grupo finito fechado na operação de grupo é de fato um subgrupo (e vice-versa, por definição).

Estritamente falando, não verifico se o subconjunto xestá fechado na operação de grupo, restrinja a tabela de multiplicação ao subconjunto xe verifique se ele contém precisamente os elementos de x. Claramente, isso implica que xestá fechado em relação à operação do grupo. Por outro lado, qualquer subgrupo xconterá 1e, portanto x, será um subconjunto dos elementos que aparecem na tabela de multiplicação restrita e, como xé fechado na operação de grupo, deve ser igual x.


4

Haskell , 79 bytes

Basicamente, uma porta do método Mathematica da ngenisis. (Exceto que eu estou usando matrizes indexadas em 0).

cpega uma lista de listas de se Intretorna um número inteiro.

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

Experimente online!

Supõe-se que os Ints sejam numerados da mesma forma que as linhas (listas externas) e as colunas que mostram sua multiplicação. Assim, como 0 é a identidade, a primeira coluna é igual aos índices das linhas. Isso permite usar as entradas da primeira coluna para construir os subconjuntos.

Como funciona

  • c é a função principal.
  • g é a matriz do grupo como uma lista de listas.
  • lé um subconjunto dos elementos. A lista de subconjuntos é construída da seguinte maneira:
    • foldr(\r->([id,(r!!0:)]<*>))[[]]gdobra uma função sobre as linhas de g.
    • ré uma linha de g, cujo primeiro (0º) elemento é extraído como um elemento que pode ser incluído ( (r!!0:)) ou não ( id).
    • <*> combina as opções para esta linha com as seguintes.
  • and[g!!x!!y`elem`l|x<-l,y<-l]testa para cada par de elementos lse o seu múltiplo está l.
  • sum[1|...]-1 conta os subconjuntos que passam no teste, exceto um, o subconjunto vazio.

3

Geléia , 17 16 bytes

1 byte graças 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.

Experimente online! (Indexado 1)


Você pode fazer Jem vez de LRsalvar um byte :-)
ETHproductions

@ETHproductions uau, obrigado por descobrir isso.
Nunez Leaky

3

Python 2, 297 215 bytes

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)]))

Experimente online

Este programa funciona para o grupo de exemplo sem ==T[x][y], mas ainda tenho certeza de que é necessário.

Edit: Agora assume que o elemento de identidade de G é sempre o primeiro.


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 sem Golfe

Os elementos negativos do grupo podem ser suportados sem nenhum custo, alterando -1para ''.


Por que você verifica a identidade? A identidade é garantida como o primeiro elemento. Basta fazer todas as combinações sem o primeiro elemento e adicionar o primeiro elemento a cada combinação.
orlp

"Suponha que 0 seja o elemento de identidade."
orlp

Sim, mas isso não significa que é o primeiro da lista. Eu pensei que estava falando sobre o número 0do exemplo, não o índice.
mbomb007

@ mbomb007 é claramente o índice
Leaky Nun
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.