Moufangループのカウント


17

ループは非常に単純な代数構造です。タプル(G、+)で、Gは集合で、+は二項演算子G×G→Gです。つまり、+Gから2つの要素を取得し、新しい要素を返します。また、オペレーターは2つの特性を満たす必要があります

  • キャンセル:すべての場合、ABGのユニークな存在のxyとGよう

    a + x = b
    y + a = b
    
  • アイデンティティ:ある電子Gのすべてのためのように、AGは、

    e + a = a
    a + e = a
    

グループの概念に精通している場合、ループは連想プロパティを持たない単なるグループであることに気付くかもしれません。

ループは非常に単純なので、人々はより多くのルールを追加して、より興味深い新しい構造を作成することを好みます。そのような構造はMoufangループもことFORALL満たす次の4人のアイデンティティをループであり、XY及びZG

z + (x + (z + y)) = ((z + x) + z) + y
((y + z) + x) + z = y + (z + (x + z))
(z + x) + (y + z) = (z + (x + y)) + z
(z + x) + (y + z) = z + ((x + y) + z)

たとえば、次のCayleyテーブルはMoufangループを表しています。

0  1  2  3
1  0  3  2
2  3  0  1
3  2  1  0

(あなたが慣れていない場合はケーリーテーブルは正方行列であるM M i、jはに等しい私+ jは。それはセットに二項演算子を表現するのに便利な方法ですが。)

アイデンティティがあることを簡単に示すことができ0ます。キャンセルは表示が少し難しくなりますが、ブルートフォースアプローチではこの表が得られます

b a → 0 1 2 3
↓
0     0 1 2 3
1     1 0 3 2
2     2 3 0 1
3     3 2 1 0

私たちの要素は

a + x = b = x + a

(このテーブルはCayleyのテーブルと同じであることに気付くかもしれません。このMoufangループがなぜそうなのかを理解するために読者に演習として残しておきます)

次に、構造のMoufang IDを確認する必要があります。特定の構造に対してこれを行うには2つの方法があります。最初の方法は、関連性があり、したがって自動的に基準を満たしていることを認識することです。ここでは、すべての式でそれぞれ4つの値の可能性がある3つの自由変数があります。これは、7 * 4 3または448の計算を実行する必要があることを意味します。生の計算は省略しますが、これを確認するために使用できるHaskellをいくつか示します

仕事

入力出力として正の整数nが与えられると、次数nの Moufangループの数。(グループの順序はセットのサイズです)

これはため、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。

テストケース

最初の71入力のMoufangループの数は次のとおりです。

1,1,1,2,1,2,1,5,2,2,1,6,1,2,1,19,1,5,1,6,2,2,1,20,2,2,5,5,1,4,1,122,1,2,1,18,1,2,2,19,1,7,1,5,2,2,1,103,2,5,1,6,1,17,2,17,2,2,1,18,1,2,4,4529,1,4,1,6,1,4,1

1
G×G」とは何ですか?
エリックアウトゴルファー

8
関係する数学は非常にふわふわしており、この課題を読むすべての人がアクセスできないため、私はこの課題に反対しました。おそらく、実用的な例が役立つでしょう(8番目の入力が5になる理由を説明するなど)?あなたがそれを追加した場合、私は投票を撤回すると思いますが、もちろんあなた次第です。

6
@IanGödelふわふわとはどういう意味ですか?確かに、より高度な数学的トピックですが、PPCGの数学から遠ざかるべきではないと思います。Moufangループの実際の例を追加しますが、入力全体を手動で計算すると、おそらく課題が煩雑になります。
小麦ウィザード

2
@WheatWizard「Fluffy」、おそらく「Advanced」など。編集:私は下票を撤回しましたが、まだ例を待っています。

1
それはだあなたを補正する際@Giuseppe DOはあまりにも悪い感じではない、私はまた、ミスを犯し12ていません11。なぜなら11素数であることに気づいたはずです。
小麦ウィザード

回答:


4

Pythonの3475の 410バイト

バイトを節約してくれたMr.Xcoderに感謝します!

式の対称性を使用して、65バイトを節約します。はい、それはたくさんです。

from itertools import*
n=int(input())
P=permutations
R=[*range(n)]
u=[]
A=all
S=sorted
for T in P(P(R),n):u+=[T]*(A(A(R==S(x)for x in
t)and any([*x]==S(x)for x in t)and
A(t[z][t[x][t[z][y]]]==t[t[t[z][x]][z]][y]and
t[t[z][x]][t[y][z]]==t[t[z][t[x][y]]][z]for x in R
for y in R for z in R)for t
in(T,[*zip(*T)]))and A(A(1-A(p[T[i][j]]==U[p[i]][p[j]]for i in R
for j in R)for p in P(R))for U in u))
print(len(u))

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


一部andはに置き換えることができます*が、バイト数は少なくなりますが、実行時間が大幅に遅くなります:

Python 3、??? バイト

[TODOコードをここに入力]

(もちろん、すべて*がプログラムの速度を大幅に低下させるわけではなく、そのうちのいくつかだけが重要です)


ゴルフをしていない:

from itertools import *
n = 4 # int(input())
rangeN = list(range(n))

def is_moufang_loop(T):
    A = tuple(zip(*T))
    return all(
        all(sorted(x) == rangeN for x in t)
        and any(list(x) == sorted(x) for x in t)
        and all(
                T[z][T[x][T[z][y]]] == T[T[T[z][x]][z]][y]
            and T[T[z][x]][T[y][z]] == T[T[z][T[x][y]]][z]
            for x in rangeN for y in rangeN for z in rangeN)
        for t in (T, A)
    )

def isomorphic(loop1, loop2):
    for p in permutations(rangeN):
        if all(
            p[loop1[i][j]] == loop2[p[i]][p[j]]
            for i in rangeN
            for j in rangeN
        ): return True
    return False

unique_moufang_loops = []
for x in [
        cayley_table 
        for cayley_table in permutations(permutations(rangeN), n)
        if is_moufang_loop(cayley_table)
]:
    if all(not isomorphic(x, y) for y in unique_moufang_loops):
        unique_moufang_loops.append(x)

print(len(unique_moufang_loops))

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

スクロールバーなし...


説明:

プログラムは非常に簡単です。

  • 可能な各「二項演算子」は、Cayleyテーブル(0インデックス)で表されます。
  • 「同一性」プロパティが存在することを意味e両方ようにe「行とe」番目の列が等しい[0, 1, 2, ..., n-1]と同じ条件であるが、

    配列Tとその転置の両方に等しい行があり[0, 1, 2, ..., n-1]ます。

  • 「キャンセル」プロパティは次と同等です

    すべての行とすべての列はの順列です[0, 1, 2, ..., n-1]

だから、一部

all(
        all(sorted(x) == rangeN for x in t) 
        and any(list(x) == sorted(x) for x in t) 
        for t in (T, A))

コードのチェック。(アレイ内のすべての行についてT、その転置A、それに等しいソートされrangeN、両方の行が存在Tし、Aそれ自体への等号は、ソートされています)

Moufangループの4つの条件は、手動でチェックされます。

z + (x + (z + y)) = ((z + x) + z) + y
((y + z) + x) + z = y + (z + (x + z))
(z + x) + (y + z) = (z + (x + y)) + z
(z + x) + (y + z) = z + ((x + y) + z)

コードで(a + b)は、として表されT[a][b]ます。(Cayleyテーブルとしての表現のため)。Pythonチェーンの等値比較を使用して、の重複を避け(z + x) + (y + z)ます。

ただし、式は対称であるため:

+最初の式のオペランドを切り替えると、2番目の式が得られます。我々がオペランドを切り替えた場合と+第三の式では、我々は第4式を取得xし、yスワップ場所を。

Cayleyテーブルの転置は、オペランドが交換された2項演算子と同等であることに注意してください。(x + y -> y + x

最後に、すべての候補Cayleyテーブルが次から選択されます。

permutations(permutations(rangeN), n) 

そのため、各行はrangeN[0, 1, 2, ..., n-1])の順列であり、n個別の行があります。

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