有限グループのサブグループの数を見つける


14

定義

グループの定義が既にわかっている場合は、この部分をスキップできます。有限グループ、およびサブグループの

グループ

抽象代数では、グループはタプル(G、∗)です。ここで、Gは集合であり、は関数G×G→Gです。次のようなです。

  • 閉包:Gのすべてのx、yについて、x ∗ yGにもあります(が関数G×G→Gであるという事実によって暗示されます)。

  • 連想:すべてのためのX、Y、ZにおけるG(X * Y)* Z = X *(Y * Z)

  • 同一性:要素が存在するEにおけるGのようにすべてのためのxにおけるGX * E = X = E * X

  • 逆:毎XにおけるG、要素が存在するYはGように、X * Y = E = Y * XE前の箇条書きに記載された同一要素です。

有限グループ

有限群の基である(G、*)G、有限であるすなわち、有限個の要素を有します。

サブグループ

サブグループ (H *)グループの(G、*)があるようであり、Hは、の部分集合であるG(必ずしも適切ではないサブセット)および(H *)、グループ(すなわち、満足4つの基準を超える)です。

検討二面体群のD 3 (G、*)G = {1、A、B、C、D、E}及び*は以下に定義されているが(このようなテーブルが呼び出されケーリーテーブル):

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

このグループでは、IDは1です。また、ABはながら、互いの逆数である1CD、及びEは、の逆数(それぞれ自身の逆数である1がある1の逆、CであるCの逆Dがであり、D、および逆数EはあるE)。

これで、H = {1、A、B}の(H、∗)(G、∗)のサブグループであることを検証できます。閉鎖については、以下の表を参照してください。

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

どこの要素のすべての可能なペアHの下の*は、内のメンバー与えるHを

Hの要素はGの要素であるため、結合性はチェックを必要としません。

IDは1です。これは、グループIDと同じでなければなりません。また、グループ内のIDは一意である必要があります。(これを証明できますか?)

逆変換のための逆ていることを確認し、Aがであり、Bのメンバーである、HBの逆はAで、これもHのメンバーです。1の逆はそれ自体であり、確認する必要はありません。


仕事

説明

有限グループ(G、∗)が与えられた場合、そのサブグループの数を見つけます。

入力

グループ(G、∗)の場合、サイズn×nの 2D配列を受け取ります。ここで、nGの要素数です。インデックス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上記2次元アレイです。

ノート:

  • 1インデックスの2D配列を使用できます。
  • IDの行と列は省略できます。
  • 適切と思われる他の形式を使用することもできますが、一貫している必要があります。(つまり、最後のインデックスを代わりにIDにしたい場合など)

出力

グループ内のサブグループの数を表す正の数。

たとえば、上のグループの場合、H =のときはいつでも(H、∗)(G、∗)のサブグループです。

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

したがって、6つのサブグループがあり、この例の出力はになります6


ヒント

私がリンクした記事を読むことができます。それらの記事には、あなたに役立つかもしれないグループとサブグループに関する定理が含まれています。


得点

これはです。最も少ないバイト数で勝ちます。


ああ、それは私には明確ではなかったeは、具体的アイデンティティの要素だけでなく、任意の中間結果を参照します。
-orlp

@orlpが明確になりました。
リーキー修道女

あなたがコールするつもりなら0、アイデンティティ要素を、オペレータのように記述持っている混乱だ乗算 ...
ニール

@Neil eh ...規則が衝突するとき。
リーキー修道女

1
2Dリストの要素は、行/列のインデックスと同一であると仮定しました。
Ørjanヨハンセン

回答:


8

Mathematica、62 48バイト

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

1インデックスの2D配列を期待する純粋な関数。Count番号s SubsetsFirstグループ操作の下で閉じている入力アレイの行は。これには空のセットが含まれるため、を減算し1ます。グループ操作で閉じられる有限グループの空でないサブセットは、実際にはサブグループであることに注意してください(定義により、その逆も同様です)。

厳密に言えばx、グループ演算でサブセットが閉じていることを確認せず、乗算テーブルをサブセットに制限し、xの要素が正確に含まれていることを確認しますx。明らかに、これxはグループ操作に関して閉じられていることを意味します。逆に、いずれかのサブグループがx含まれます1ので、x制限された乗算テーブルに現れる要素のサブセットとなり、以降xのグループ操作の下では閉じている、それは等しくなければなりませんx


4

Haskell、79バイト

基本的には、ngenisisのMathematicaメソッドの移植版です。(0インデックス配列を使用している場合を除きます。)

cのリストのリストを取り、Int整数を返します。

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

オンラインでお試しください!

Intsには、その乗算を示す行(外部リスト)および列と同じ番号が付けられていると想定されます。したがって、0はIDであるため、最初の列は行のインデックスと同じです。これにより、最初の列のエントリを使用してサブセットを構築できます。

使い方

  • c 主な機能です。
  • g リストのリストとしてのグループ配列です。
  • l要素のサブセットです。サブセットのリストは次のように構成されます。
    • foldr(\r->([id,(r!!0:)]<*>))[[]]gは、の行で関数を折りたたみgます。
    • rの行でありg、その最初(0番目)の要素は、含まれる可能性のある要素((r!!0:))または抽出されない要素()として抽出されidます。
    • <*> この行の選択肢を次の選択肢と組み合わせます。
  • and[g!!x!!y`elem`l|x<-l,y<-l]要素の各ペアに対して、lその倍数がであるかどうかをテストしlます。
  • sum[1|...]-1 空のサブセットを除いて、テストに合格したサブセットをカウントします。

3

ゼリー17 16バイト

ETHproductionsのおかげで1バイト(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の恒等要素が常に最初であると仮定します。


ゴルフをしていない:

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

Ungolfed TIO

に変更-1することにより、負のグループ要素を無料でサポートできます''


なぜ身元を確認するのですか?IDは最初の要素であることが保証されています。最初の要素なしですべての組み合わせを作成し、最初の要素を各組み合わせに追加するだけです。
-orlp

「0がアイデンティティ要素であると仮定します。」
orlp

ええ、しかし、それはそれがリストの最初であることを意味しません。0インデックスではなく、例の数値について話していると思いました。
mbomb007

@ mbomb007それは明らかにインデックスです
リーキー修道女
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.