Temukan jumlah subkelompok dari grup hingga

14

Definisi

Anda dapat melewati bagian ini jika Anda sudah tahu definisi grup , grup hingga , dan subkelompok .

Grup

Dalam aljabar abstrak, grup adalah tupel (G, ∗) , di mana G adalah himpunan dan adalah fungsi G × G → G sedemikian rupa sehingga berlaku sebagai berikut:

  • Penutupan: untuk semua x, y dalam G , x ∗ y juga dalam G (tersirat oleh fakta bahwa adalah fungsi G × G → G ).

  • Asosiatif: untuk semua x, y, z dalam G , (x ∗ y) ∗ z = x ∗ (y ∗ z) .

  • Identitas: ada elemen e dalam G sedemikian sehingga untuk semua x dalam G , x ∗ e = x = e ∗ x .

  • Inverse: untuk setiap x dalam G , terdapat elemen y dalam G sedemikian sehingga x ∗ y = e = y ∗ x , di mana e adalah elemen identitas yang disebutkan dalam poin-poin sebelumnya.

Kelompok terbatas

Sebuah grup terbatas adalah kelompok (G, *) di mana G adalah terbatas, yaitu memiliki finitely banyak elemen.

Subkelompok

Sebuah subkelompok (H, *) dari kelompok (G, *) adalah seperti yang H adalah bagian dari G (bagian tidak selalu tepat) dan (H, *) juga kelompok (yaitu memenuhi 4 kriteria di atas).

Contohnya

Pertimbangkan kelompok dihedral D 3 (G, ∗) di mana G = {1, A, B, C, D, E} dan didefinisikan di bawah ini (tabel seperti ini disebut tabel Cayley ):

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

Dalam grup ini, identitasnya adalah 1 . Juga, A dan B adalah invers satu sama lain, sementara 1 , C , D , dan E adalah inversnya masing-masing (kebalikan dari 1 adalah 1 , kebalikan dari C adalah C , kebalikan dari D adalah D , dan kebalikan dari E adalah E ).

Sekarang, kita dapat memverifikasi bahwa (H, ∗) di mana H = {1, A, B} adalah subkelompok dari (G, ∗) . Untuk penutupan, lihat tabel di bawah ini:

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

di mana semua pasangan yang mungkin dari unsur-unsur di H bawah * memberikan anggota di H .

Associativity tidak memerlukan memeriksa, karena unsur H adalah elemen dari G .

Identitasnya adalah 1 . Ini harus sama dengan identitas grup. Selain itu, identitas dalam grup harus unik. (Bisakah Anda membuktikan ini?)

Untuk terbalik, periksa bahwa kebalikan dari A adalah B , yang merupakan anggota dari H . Kebalikan dari B adalah A , yang juga anggota dari H . Kebalikan dari 1 masih sendiri, yang tidak perlu diperiksa.


Tugas

Deskripsi

Diberi grup terbatas (G, ∗) , cari jumlah subkelompoknya.

Memasukkan

Untuk grup (G, ∗) , Anda akan menerima array 2D ukuran n × n , di mana n adalah jumlah elemen dalam G . Asumsikan bahwa indeks 0adalah elemen identitas. Array 2D akan mewakili tabel perkalian. Misalnya, untuk grup di atas, Anda akan menerima array 2D berikut:

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

Misalnya, Anda dapat melihat bahwa 3 ∗ 1 = 5 karena a[3][1] = 5, di mana alarik 2D di atas.

Catatan:

  • Anda dapat menggunakan array 2D 1-diindeks.
  • Baris dan kolom untuk identitas dapat dihilangkan.
  • Anda dapat menggunakan format lain sesuai keinginan Anda, tetapi itu harus konsisten. (mis. Anda mungkin menginginkan indeks terakhir sebagai identitas, dll.)

Keluaran

Angka positif yang mewakili jumlah subkelompok dalam grup.

Misalnya, untuk grup di atas, (H, ∗) adalah subkelompok dari (G, ∗) setiap kali H =

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

Oleh karena itu, ada 6 subkelompok, dan output Anda untuk contoh ini seharusnya 6.


Petunjuk

Anda dapat membaca artikel yang saya tautkan. Artikel-artikel tersebut berisi teorema tentang grup dan subkelompok yang mungkin berguna bagi Anda.


Mencetak gol

Ini adalah . Jawab dengan kemenangan byte terendah.

Biarawati Bocor
sumber
Oh, tidak jelas bagi saya e secara spesifik mengacu pada elemen identitas, bukan hanya hasil antara.
orlp
@ orlp diklarifikasi.
Leaky Nun
Jika Anda akan memanggil 0elemen identitas, maka membingungkan memiliki operator yang dideskripsikan sebagai multiplikasi ...
Neil
@Neil eh ... saat konvensi berbenturan.
Leaky Nun
1
Saya berasumsi elemen-elemen dalam daftar 2D identik dengan indeks baris / kolomnya, jika tidak, bagaimana Anda akan mengidentifikasi baris / kolom mana yang sesuai dengan yang mana?
Ørjan Johansen

Jawaban:

8

Mathematica, 62 48 byte

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

Fungsi murni mengharapkan array 2D 1-diindeks. Counts jumlah Subsetsdari Firstbaris dari array masukan yang tertutup di bawah operasi kelompok. Karena ini akan termasuk set kosong, kami kurangi 1. Perhatikan bahwa subset kosong dari grup hingga yang ditutup di bawah operasi grup sebenarnya adalah subkelompok , (dan sebaliknya, menurut definisi).

Sebenarnya saya tidak memeriksa bahwa himpunan bagian xditutup di bawah operasi grup, saya membatasi tabel perkalian untuk himpunan bagian xdan memeriksa bahwa itu berisi elemen tepat x. Jelas ini menyiratkan yang xditutup sehubungan dengan operasi grup. Sebaliknya, setiap subkelompok xakan berisi 1dan dengan demikian xakan menjadi bagian dari elemen yang muncul dalam tabel perkalian terbatas, dan karena xditutup di bawah operasi grup, itu harus sama x.

ngenisis
sumber
4

Haskell , 79 byte

Pada dasarnya sebuah pelabuhan dari metode Mathematica ngenisis. (Kecuali saya menggunakan array 0-diindeks.)

cmengambil daftar daftar Ints dan mengembalikan bilangan bulat.

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

Cobalah online!

Diasumsikan bahwa Int s diberi nomor yang sama dengan baris (daftar luar) dan kolom yang menunjukkan perkaliannya. Jadi, karena 0 adalah identitas, kolom pertama sama dengan indeks baris. Ini memungkinkan menggunakan entri dari kolom pertama untuk membangun himpunan bagian.

Bagaimana itu bekerja

  • c adalah fungsi utama.
  • g adalah array grup sebagai daftar daftar.
  • ladalah bagian dari elemen. Daftar himpunan bagian dibangun sebagai berikut:
    • foldr(\r->([id,(r!!0:)]<*>))[[]]gmelipat fungsi di atas baris g.
    • radalah deretan g, elemen pertama (ke-0) diekstraksi sebagai elemen yang dapat disertakan ( (r!!0:)) atau tidak ( id).
    • <*> menggabungkan pilihan untuk baris ini dengan yang berikut.
  • and[g!!x!!y`elem`l|x<-l,y<-l]menguji untuk setiap pasangan elemen lapakah kelipatannya ada l.
  • sum[1|...]-1 menghitung himpunan bagian yang lulus tes, kecuali satu, bagian kosong.
Ørjan Johansen
sumber
3

Jelly , 17 16 byte

1 byte berkat 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.

Cobalah online! (1-diindeks)

Biarawati Bocor
sumber
Anda dapat melakukan Jalih - alih LRmenyimpan byte :-)
ETHproduk
@ ETHproductions wow, terima kasih sudah melihat itu.
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)]))

Cobalah online

Program ini berfungsi untuk grup contoh tanpa ==T[x][y] , tapi saya masih cukup yakin itu perlu.

Sunting: Sekarang mengasumsikan bahwa elemen identitas G selalu yang pertama.


Tidak Disatukan:

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 Tidak Dikunci

Elemen grup negatif dapat didukung tanpa biaya dengan mengubah -1ke ''.

mbomb007
sumber
Mengapa Anda memeriksa identitas? Identitas dijamin menjadi elemen pertama. Buat saja semua kombinasi tanpa elemen pertama dan tambahkan elemen pertama ke setiap kombinasi.
orlp
"Anggap 0 adalah elemen identitas."
orlp
Ya, tapi itu tidak berarti itu yang pertama dalam daftar. Saya pikir itu berbicara tentang nomor 0untuk contoh, bukan indeks.
mbomb007
@ mbomb007 itu jelas indeksnya
Leaky Nun