これはどの有限アーベル群ですか?


12

説明

f(m, G)引数としてmapping m、および明確な非負整数のセット/リストを受け入れる関数を作成しますG

mの整数のペアGをの新しい整数にマッピングする必要がありますG。(Gm)は有限のアーベル群を形成することが保証されていますが、の任意の要素はG恒等式である可能性があります。

次のような重要な定理があります。

[各有限アーベル群]は、素数次数の巡回群の直接積に同型です。

f[p1, ... pn]次のような昇順で素数のリストを返す必要がありますGはZ_p1倍... Z_pn倍に同型です

  • f((a, b) → (a+b) mod 4, [0, 1, 2, 3])返さなければならない[4]パラメータは、グループ記述として、Z 4

  • f((a, b) → a xor b, [0, 1, 2, 3])[2, 2]パラメータはZ 2 ×Z 2に同型なグループを記述するため、返されるはずです。

  • f((a, b) → a, [9])[]パラメータは自明なグループを記述するため、を返す必要があります。すなわち、ゼロの巡回グループの積。

  • m次のように定義します。

    (a, b) → (a mod 3 + b mod 3) mod 3
           + ((floor(a / 3) + floor(b / 3)) mod 3) * 3
           + ((floor(a / 9) + floor(b / 9)) mod 9) * 9
    

    次にf(m, [0, 1, ..., 80])返す必要があり[3, 3, 9]、このグループは、同形であるように、Z 3 ×Z 3 ×Z 9

ルール

  • mは、関数(または関数への関数ポインタ)Int × Int → Int、またはのG × G新しい要素にペアをマッピングする辞書のいずれかですG

  • f反対の順序でパラメータを取ることができますf(G, m)

  • 実装は、任意の大きな入力に対して理論的に機能するはずですが、実際には効率的である必要はありません。

  • あらゆる種類の組み込みの使用に制限はありません。

  • 標準の規則が適用されます。バイト単位の最短コードが優先されます。

リーダーボード

ボードにスコアを表示するには、次の形式にする必要があります。

# Language, Bytes


場合はm、辞書であることを許可されている、あなたにも辞書としてテストケースを提供することができますか?
マーティンエンダー

私はそれを考えましたが、特に最後のケース(何千ものキーと値のペア)でかなり大きく、それらに適したフォーマットを考えることはできません。おそらく、回答者が関数定義をコピーしてから、辞書自体を(のようなものでfor a in G: for b in G: d[(a, b)] = m(a, b))構築する方が簡単でしょう。
リン

正しいと思います。何が起こっているのかを確認するにはペーストの意味を十分に理解できませんが、これはそれを証明する必要があります:bpaste.net/show/5821182a9b48
Lynn

頭を包み込むのを助けるために:フォーマットのトリットを持つ3進数を操作し、ペアワイズ加算moduloでAABCトリプルとして扱います。(A, B, C)(9, 3, 3)
リン

ああ、私は自分の(非常に愚かな)間違いを認識しました。スニペットをありがとう!
flawr

回答:


5

Matlab、326バイト

いくつかのグループ理論では、アイデアは非常に単純です。ここでは、TL; DRグループの要素のすべての可能な順序を計算します。次に、特定の一次電力順序の最大のサブグループを見つけて、グループから「分解」し、すすぎ、繰り返します。

function r=c(h,l)

                            %factorize group order
N=numel(L);
f=factor(N);
P=unique(f);                %prime factors
for k=1:numel(P);
    E(k)=sum(f==P(k));    %exponents of unique factors
end;

                            %calculate the order O of each element
O=L*0-1; 
l=L;
for k=2:N+1;

    l=h(l,L);

    O(l==L & O<0)=k-1
end;

%%

O=unique(O);               % (optional, just for speedupt)
R=[];
                           % for each prime,find the highest power that
                           % divides any of the orders of the element, and
                           % each time substract that from the remaining
                           % exponent in the prime factorization of the
                           % group order
for p=1:nnz(P);                          % loop over primes
    while E(p)>1;                        % loop over remaining exponent
        for e=E(p):-1:1;                 % find the highest exponent
            B=mod(O,P(p)^e)==0;          
            if any(B)
                R=[R,P(p)^e];            % if found, add to list
                O(B)=O(B)/(P(p)^e);
                E(p)=E(p)-e;
                break;
            end;
        end;
    end;
    if E(p)==1;
        R=[R,P(p)];
    end;
end;
r=sort(R)

入力例:

L = 0:3;
h=@(a,b)mod(a+b,4);
h=@(a,b)bitxor(a,b);
L = 0:80;
h=@(a,b)mod(mod(a,3)+mod(b,3),3)+mod(floor(a/3)+floor(b/3),3)*3+ mod(floor(a/9)+floor(b/9),9)*9; 

ゴルフバージョン:

function r=c(h,l);N=numel(L);f=factor(N);P=unique(f);for k=1:numel(P);E(k)=sum(f==P(k));end;O=L*0-1;l=L;for k=2:N+1;l=h(l,L);O(l==L&O<0)=k-1;end;R=[];for p=1:nnz(P);while E(p)>1;for e=E(p):-1:1;B=mod(O,P(p)^e)==0; if any(B);R=[R,P(p)^e]; O(B)=O(B)/(P(p)^e);E(p)=E(p)-e;break;end;end;end;if E(p)==1;R=[R,P(p)];end;end;r=sort(R)

1

GAP159 111バイト

GAPを使用すると、乗算表でグループを簡単に構築し、そのアーベル不変量を計算できます。

ai:=    # the golfed version states the function w/o assigning it
function(m,G)
  local t;
  t:=List(G,a->List(G,b->Position(G,m(a,b))));
  # t is inlined in the golfed version
  return AbelianInvariants(GroupByMultiplicationTable(t));
end;

古いバージョン

ジェネレーターGと関係a * b = m(a、b)(Gからのすべてのa、b)を持つ有限で提示されたグループは、私たちが始めたグループ(G、m)です。GAPで作成してアーベル不変量を計算できます。

ai:=    # the golfed version states the function w/o assigning it
function(m,G)
  local F,n,rels;
  n:=Size(G);
  F:=FreeGroup(n);
  rels:=Union(Set([1..n],i->
                Set([1..n],j->
                  F.(i)*F.(j)/F.(Position(G,m(G[i],G[j]))) ) ));
  # rels is inlined in the golfed version
  return AbelianInvariants(F/rels);
end;

m1:=function(a,b) return (a+b) mod 4; end;
# I don't feel like implementing xor
m3:=function(a,b) return 9; end;
m4:=function(a,b)
  return (a+b) mod 3 # no need for inner mod
         + ((QuoInt(a,3)+QuoInt(b,3)) mod 3) * 3
         + ((QuoInt(a,9)+QuoInt(b,9)) mod 9) * 9;
  end;

できるようになりました:

gap> ai(m1,[0..3]);
[ 4 ]

実際、整数のリストの使用に制限されていません。正しいドメインを使用すると、一般的なプラスを使用できます。

ai(\+,List(Integers mod 4));
[ 4 ]

したがって、2つの要素を持つフィールド上の2次元ベクトル空間の加法群と同型であることを使用して、本質的に2番目の例を実行できます。

gap> ai(\+,List(GF(2)^2));
[ 2, 2 ]

残りの例:

gap> ai(m3,[9]);
[  ]
gap> ai(m4,[0..80]);
[ 3, 3, 9 ]

補足説明

古いバージョンでは、mはGのグループ構成を定義する必要がありませんでした。m(a、b)= m(a、c)の場合、b = cとだけ言います。だから我々は何ができるai(m1,[0..5])ai(m3,[5..15])。これらの場合、mがGにない値を返す場合、両方のバージョンがそうであるように、新しいバージョンは恐ろしく失敗します。

(G、m)がアーベルでない場合、アーベル化されたバージョンの説明を取得します。これは最大のアーベル因子グループです。

gap> ai(\*,List(SymmetricGroup(4)));
[ 2 ]

これはAbelianInvariants通常使用されるもので、通常はを呼び出しますAbelianInvariants(SymmetricGroup(4))

ゴルフバージョン

function(m,G)return AbelianInvariants(GroupByMultiplicationTable(List(G,a->List(G,b->Position(G,m(a,b))))));end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.