ค้นหาจำนวนกลุ่มย่อยของกลุ่ม จำกัด


14

คำนิยาม

คุณสามารถข้ามส่วนนี้ถ้าคุณรู้อยู่แล้วว่าคำจำกัดความของกลุ่ม , กลุ่มแน่นอนและกลุ่มย่อย

กลุ่ม

พีชคณิตนามธรรมในกลุ่มคือ tuple (G, ∗)โดยที่Gเป็นเซตและเป็นฟังก์ชั่นG × G → Gดังต่อไปนี้:

  • การปิด: สำหรับทั้งหมดx, yในG , x ∗ yก็เป็นG (โดยนัยจากข้อเท็จจริงที่ว่าเป็นฟังก์ชั่นG × G → G )

  • associativity: สำหรับทุกx, y, zในG , (x * y) * Z = x * (y * z)

  • บัตรประจำตัว: มีอยู่องค์ประกอบอีในGเช่นว่าทุกxในG , x * E = x = x

  • ผกผัน: สำหรับแต่ละxในGจะมีองค์ประกอบyในGเช่นนั้นที่x ∗ y = e = y ∗ xโดยที่eคือองค์ประกอบตัวตนที่กล่าวถึงในสัญลักษณ์ก่อนหน้า

กลุ่ม จำกัด

กลุ่มแน่นอนเป็นกลุ่ม(G, *)ที่Gมี จำกัด คือมีองค์ประกอบหลายขีด

กลุ่มย่อย

กลุ่มย่อย (H, *)ของกลุ่ม(G, *)เป็นเช่นนั้นHเป็นส่วนหนึ่งของG (ไม่จำเป็นต้องเป็นชุดย่อยที่เหมาะสม) และ(H, *)นอกจากนี้ยังเป็นกลุ่ม (เช่นความพึงพอใจ 4 เกณฑ์ข้างต้น)

ตัวอย่าง

พิจารณากลุ่ม dihedral D 3 (G, ∗)โดยที่G = {1, A, B, C, D, E}และถูกกำหนดไว้ด้านล่าง (ตารางแบบนี้เรียกว่าตาราง Cayley ):

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

ในกลุ่มนี้ตัวตนคือ1 ยิ่งไปกว่านั้นAและBเป็นผกผันของกันและกันขณะที่1 , C , DและEเป็นผู้ผกผันของตัวเองตามลำดับ (ค่าผกผันของ1คือ1 , ค่าผกผันของCคือC , อินเวอร์สของDคือDและ การผกผันของEคือE )

ตอนนี้เราสามารถยืนยันได้ว่า(H, *)ที่H = {1, A, B}เป็นกลุ่มย่อยของ(G, *) สำหรับการปิดโปรดดูตารางด้านล่าง:

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

ที่ทุกคู่ที่เป็นไปได้ขององค์ประกอบในHภายใต้*ให้สมาชิกในH

associativity ไม่จำเป็นต้องมีการตรวจสอบเนื่องจากองค์ประกอบของHเป็นองค์ประกอบของG

รหัสประจำตัวคือ1 สิ่งนี้จะต้องเหมือนกันกับข้อมูลประจำตัวของกลุ่ม นอกจากนี้ตัวตนในกลุ่มจะต้องไม่ซ้ำกัน (คุณสามารถพิสูจน์ได้ไหม)

สำหรับผกผันตรวจสอบที่ผกผันของเป็นBซึ่งเป็นสมาชิกของH ค่าผกผันของBคือAซึ่งเป็นสมาชิกของHด้วยเช่นกัน ค่าผกผันของ1ยังคงเป็นของตัวเองซึ่งไม่จำเป็นต้องตรวจสอบ


งาน

ลักษณะ

ให้กลุ่ม จำกัด(G, ∗) , หาจำนวนกลุ่มย่อย

อินพุต

สำหรับกลุ่ม(G, *)คุณจะได้รับอาร์เรย์ 2 มิติขนาดn × nที่nคือจำนวนขององค์ประกอบในG สมมติว่าดัชนี0นั้นเป็นองค์ประกอบตัวตน อาร์เรย์ 2D จะแสดงตารางการคูณ ตัวอย่างเช่นสำหรับกลุ่มด้านบนคุณจะได้รับอาร์เรย์ 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]]

ตัวอย่างเช่นคุณจะเห็นว่า3 ∗ 1 = 5เพราะa[3][1] = 5ที่ซึ่งaเป็นอาร์เรย์ 2D ด้านบน

หมายเหตุ:

  • คุณสามารถใช้อาร์เรย์ 2 มิติที่จัดทำดัชนีไว้ได้
  • สามารถละเว้นแถวและคอลัมน์ของข้อมูลประจำตัวได้
  • คุณอาจใช้รูปแบบอื่นตามที่เห็นสมควร แต่ต้องสอดคล้องกัน (เช่นคุณอาจต้องการให้ดัชนีสุดท้ายเป็นตัวตนแทนเป็นต้น)

เอาท์พุต

ตัวเลขบวกหมายถึงจำนวนของกลุ่มย่อยในกลุ่ม

ตัวอย่างเช่นสำหรับกลุ่มข้างต้น(H, ∗)เป็นกลุ่มย่อยของ(G, ∗)เมื่อใดก็ตามที่H =

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

ดังนั้นจึงมี66กลุ่มย่อยและการส่งออกของคุณเช่นนี้ควรจะเป็น


คำแนะนำ

คุณสามารถอ่านบทความที่ฉันเชื่อมโยง บทความเหล่านั้นมีทฤษฎีบทเกี่ยวกับกลุ่มและกลุ่มย่อยที่อาจเป็นประโยชน์กับคุณ


เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟตอบด้วยจำนวนไบต์ต่ำสุดที่ชนะ


โอ้มันไม่ชัดเจนสำหรับฉันeหมายถึงองค์ประกอบเฉพาะไม่ใช่เพียงแค่ผลลัพธ์ระดับกลาง
orlp

@orlp ชี้แจงแล้ว
Leun Nun

หากคุณกำลังจะเรียก0องค์ประกอบตัวตนแล้วก็ทำให้เกิดความสับสนว่าจะมีผู้ประกอบการอธิบายว่าคูณ ...
นีล

@ Neil เอ๊ะ ... เมื่อการประชุมปะทะกัน
Leun Nun

1
ฉันคิดว่าองค์ประกอบในรายการ 2D นั้นเหมือนกับดัชนีของแถว / คอลัมน์มิฉะนั้นคุณจะระบุได้อย่างไรว่าแถวไหน / คอลัมน์ใด
Ørjan Johansen

คำตอบ:


8

Mathematica, 62 48 ไบต์

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

ฟังก์ชั่นที่บริสุทธิ์คาดว่าจะมีอาร์เรย์ 2D 1 ดัชนี Counts จำนวนSubsetsของFirstแถวของอาร์เรย์การป้อนข้อมูลที่มีการปิดการดำเนินงานภายใต้กลุ่ม 1ตั้งแต่นี้จะรวมถึงชุดที่ว่างเปล่าเราลบ โปรดทราบว่ากลุ่มย่อยที่ไม่มีข้อ จำกัด ของกลุ่ม จำกัด ที่ถูกปิดภายใต้การดำเนินงานของกลุ่มนั้นแท้จริงแล้วเป็นกลุ่มย่อย (และในทางกลับกันโดยคำจำกัดความ)

อย่างเคร่งครัดพูดผมไม่ได้ตรวจสอบว่าเซตxนี้ปิดให้บริการภายใต้การดำเนินกลุ่มผม จำกัด ตารางสูตรคูณในการย่อยและตรวจสอบว่ามันมีอย่างแม่นยำองค์ประกอบของx xเห็นได้ชัดว่านี่ก็หมายความว่าxปิดที่เกี่ยวกับการดำเนินงานของกลุ่ม ตรงกันข้ามกลุ่มย่อยใด ๆxจะมี1จึงxจะเป็นส่วนหนึ่งขององค์ประกอบที่ปรากฏในตารางสูตรคูณ จำกัด และตั้งแต่นี้ปิดให้บริการภายใต้การดำเนินกลุ่มก็ต้องเท่ากับxx


4

Haskell , 79 ไบต์

โดยทั่วไปเป็นพอร์ตของวิธีการทางคณิตศาสตร์ของ ngenisis (ยกเว้นฉันกำลังใช้อาร์เรย์ 0 ที่จัดทำดัชนีไว้)

cรับรายการของInts และคืนค่าจำนวนเต็ม

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

ลองออนไลน์!

มันจะสันนิษฐานว่าInts นั้นมีหมายเลขเหมือนกับแถว (รายการด้านนอก) และคอลัมน์ที่แสดงการคูณ ดังนั้นเนื่องจาก 0 คือข้อมูลประจำตัวคอลัมน์แรกจึงเหมือนกับดัชนีของแถว สิ่งนี้อนุญาตให้ใช้รายการของคอลัมน์แรกเพื่อสร้างชุดย่อย

มันทำงานอย่างไร

  • c เป็นหน้าที่หลัก
  • g เป็นอาร์เรย์กลุ่มเป็นรายการ
  • lเป็นส่วนย่อยขององค์ประกอบ รายการของชุดย่อยถูกสร้างขึ้นดังนี้:
    • foldr(\r->([id,(r!!0:)]<*>))[[]]ggฟังก์ชั่นพับมากกว่าแถวที่
    • rคือแถวของgซึ่งองค์ประกอบแรกถูกสกัดเป็นองค์ประกอบที่อาจรวม ( (r!!0:)) หรือไม่ (id )
    • <*> รวมตัวเลือกสำหรับแถวนี้เข้ากับตัวเลือกต่อไปนี้
  • and[g!!x!!y`elem`l|x<-l,y<-l]ทดสอบองค์ประกอบแต่ละคู่lว่ามีหลายตัวlหรือไม่
  • sum[1|...]-1 นับชุดย่อยที่ผ่านการทดสอบยกเว้นเซตย่อยที่ว่างเปล่าหนึ่งชุด

3

เยลลี่ , 17 16 ไบต์

1 ไบต์ขอบคุณ 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.

ลองออนไลน์! (1 จัดทำดัชนี)


คุณสามารถทำได้Jแทนที่จะLRบันทึกไบต์ :-)
ETHproductions

@ ETHproductions ว้าวขอบคุณมากที่ได้ทราบ
แม่ชีที่รั่วไหล

3

Python 2, 297 215 ไบต์

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

ลองออนไลน์

โปรแกรมนี้ใช้ได้กับกลุ่มตัวอย่างที่ไม่มี==T[x][y]แต่ฉันก็ยังค่อนข้างมั่นใจว่ามันจำเป็น

แก้ไข: ตอนนี้สมมติว่าองค์ประกอบตัวตนของGเป็นองค์ประกอบแรกเสมอ


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 ที่ไม่ดี

องค์ประกอบกลุ่มเชิงลบจะได้รับการสนับสนุนที่ไม่มีค่าใช้จ่ายโดยการเปลี่ยนไป-1''


ทำไมคุณถึงตรวจสอบตัวตน? ข้อมูลประจำตัวรับประกันว่าจะเป็นองค์ประกอบแรก เพียงสร้างชุดค่าผสมทั้งหมดโดยไม่มีองค์ประกอบแรกและเพิ่มองค์ประกอบแรกลงในชุดค่าผสมแต่ละชุด
orlp

"สมมติว่า 0 คือองค์ประกอบประจำตัว"
orlp

ใช่ แต่นั่นไม่ได้หมายความว่ามันเป็นอันดับแรกในรายการ ฉันคิดว่ามันกำลังพูดถึงตัวเลข0สำหรับตัวอย่างไม่ใช่ดัชนี
mbomb007

@ mbomb007 เป็นดัชนีที่ชัดเจน
Leaky Nun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.