Hangi sonlu abelyan grubu bu?


12

Açıklama

f(m, G)Bağımsız değişken olarak bir eşleme mve farklı, negatif olmayan tamsayıların bir kümesini / listesini kabul eden bir işlev yazın G.

miçindeki tamsayı çiftlerini Gyeni tamsayılarla eşleştirmelidir G. ( G, m) 'nin sonlu bir abelya grubu oluşturması garanti edilir , ancak herhangi bir unsuru Gkimlik olabilir.

Önemli bir teorem var:

[Her sonlu abelya grubu], döngüsel prime güç düzeni gruplarının doğrudan çarpımı için izomorfiktir.

fasal güçlerin listesini [p1, ... pn]artan sırada döndürmelidir .G, Z_p1 kere izomorfiktir ... kez Z_pn

Örnekler

  • f((a, b) → (a+b) mod 4, [0, 1, 2, 3])dönmelidir [4]parametreler grup açıklamak gibi Z 4 .

  • f((a, b) → a xor b, [0, 1, 2, 3])dönmelidir [2, 2]parametreleri izomorf bir grubu tarif olarak, Z 2 x Z 2 .

  • f((a, b) → a, [9])[]parametreler önemsiz grubu tanımladığı için geri dönmelidir ; yani sıfır siklik grupların ürünü.

  • Aşağıdaki mgibi tanımlayın :

    (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
    

    Daha sonra f(m, [0, 1, ..., 80])geri [3, 3, 9]dönmelisiniz, çünkü bu grup Z 3 × Z 3 × Z 9'a izomorfiktir

kurallar

  • mbir işlev (veya bazı işlevlere ilişkin işlev işaretçisi) Int × Int → Intveya sözlüğünün G × Gyeni öğelerine eşlenen bir sözlük eşlemesi olabilir G.

  • fparametrelerini ters sırayla alabilir, yani uygulayabilirsiniz f(G, m).

  • Uygulamanız teorik olarak keyfi olarak büyük girdiler için çalışmalıdır, ancak aslında verimli olması gerekmez.

  • Herhangi bir tür yerleşik kullanım konusunda herhangi bir sınırlama yoktur.

  • Standart kuralları geçerlidir. Bayt cinsinden en kısa kod kazanır.

Liderler Sıralaması

Puanınızın tahtada görünmesi için şu biçimde olması gerekir:

# Language, Bytes


Eğer mbir sözlük olmasına izin, siz de sözlüklerde olarak test durumları sağlayabilir?
Martin Ender

Bunu düşündüm, ama oldukça büyükler, özellikle son durum (binlerce anahtar / değer çifti) ve onlar için çok iyi bir format düşünemiyorum. Yanıtlayanların işlev tanımlarını kopyalaması ve daha sonra sözlükleri kendileri (örneğin bir şeyle for a in G: for b in G: d[(a, b)] = m(a, b)) oluşturmaları muhtemelen daha kolaydır .
Lynn

Bence doğru. Yaptığınızı doğrulamak için macununuzu yeterince anlamlandıramıyorum, ancak bu bunu kanıtlamalıdır: bpaste.net/show/5821182a9b48
Lynn

Başınızı etrafına sarmaya yardımcı olmak için: biçimdeki tritlere sahip üçlü sayılar üzerinde çalışır, AABCbunları üçlü olarak muamele eder (A, B, C), çift ekleme modülü ile (9, 3, 3).
Lynn

Oh, sadece (çok aptalca) hatamı fark ettim. Snippet'in için teşekkürler!
flawr

Yanıtlar:


5

Matlab, 326 bayt

Bazı grup teorileriyle bu fikir oldukça basittir: İşte TL; DR Grubun elemanlarının tüm olası emirlerini hesaplayın. Sonra belli bir ana güç düzeninin en büyük alt grubunu bulun ve gruptan "çarpanlarına ayırın", durulayın, tekrarlayın.

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)

Örnek girişler:

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; 

Golf versiyonu:

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

GAP , 159111 bayt

GAP, bir grubu çarpım tablosuyla oluşturmamıza ve onun abelyan değişmezlerini hesaplamamıza izin verir:

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;

Eski sürüm

G jeneratörleri ve a * b = m (a, b) (son olarak G'den a, b) ile ilişkiler içeren sonlu olarak sunulan grup, başladığımız gruptur (G, m). Bunu oluşturabilir ve abelyan değişmezlerini GAP ile hesaplayabiliriz:

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;

Örnekler

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;

Şimdi yapabiliriz:

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

Aslında, tamsayıların listesini kullanmakla sınırlı değiliz. Doğru etki alanını kullanarak genel artıyı kullanabiliriz:

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

Yani esas olarak, ikinci örneğini, grubunun 2 elemanlı alan üzerinde 2 boyutlu vektör uzayının ilave grubuna izomorf olduğunu kullanarak yapabilirim:

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

Ve geri kalan örnekler:

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

Ek açıklamalar

Eski versiyonda, m'nin G için bir grup kompozisyonu tanımlaması gerekmiyordu. M (a, b) = m (a, c) ise, bu sadece b = c olduğunu söyler. Böylece yapabiliriz ai(m1,[0..5])ve ai(m3,[5..15]). Yeni sürüm bu durumlarda korkunç başarısız olur, m her ikisi de m'de G olmayan değerleri döndürürse.

(G, m) abelyan değilse, onun abelyanlaştırılmış versiyonunun bir tanımını alırız, bu onun en büyük abelya faktör grubu:

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

Bu nedir AbelianInvariantsgenellikle, normalde sadece çağırır için kullanılır AbelianInvariants(SymmetricGroup(4)).

Golfçü versiyon

function(m,G)return AbelianInvariants(GroupByMultiplicationTable(List(G,a->List(G,b->Position(G,m(a,b))))));end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.