Nhóm abelian hữu hạn này là gì?


12

Sự miêu tả

Viết hàm f(m, G)chấp nhận làm đối số của nó một ánh xạ mvà một tập hợp / danh sách các số nguyên riêng biệt, không âm G.

mnên ánh xạ các cặp số nguyên vào Gsố nguyên mới trong G. ( G, m) được đảm bảo để tạo thành một nhóm abelian hữu hạn , nhưng bất kỳ yếu tố nào Gcó thể là danh tính.

Có một định lý quan trọng nói rằng:

[Mỗi nhóm abel hữu hạn] là đẳng cấu với một sản phẩm trực tiếp của các nhóm tuần hoàn của trật tự quyền lực chính.

fphải trả về một danh sách các quyền hạn [p1, ... pn]theo thứ tự tăng dần sao choG đẳng cấu với Z_p1 lần ... lần Z_pn

Ví dụ

  • f((a, b) → (a+b) mod 4, [0, 1, 2, 3])nên trả về [4], như các tham số mô tả nhóm Z 4 .

  • f((a, b) → a xor b, [0, 1, 2, 3])sẽ trả về [2, 2], vì các tham số mô tả một nhóm đẳng cấu với Z 2 × Z 2 .

  • f((a, b) → a, [9])nên trả về [], như các tham số mô tả nhóm tầm thường; tức là sản phẩm của các nhóm không tuần hoàn.

  • Xác định mnhư sau:

    (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
    

    Sau đó f(m, [0, 1, ..., 80])sẽ quay trở lại [3, 3, 9], vì nhóm này là đẳng cấu với Z 3 × Z 3 × Z 9

Quy tắc

  • mcó thể là một hàm (hoặc con trỏ hàm cho một số hàm) Int × Int → Inthoặc một cặp ánh xạ từ điển G × Gthành các phần tử mới của G.

  • fcó thể lấy tham số của nó theo thứ tự ngược lại, tức là bạn cũng có thể thực hiện f(G, m).

  • Về mặt lý thuyết, việc triển khai của bạn nên hoạt động đối với các đầu vào lớn tùy ý, nhưng thực sự không cần phải hiệu quả.

  • Không có giới hạn về việc sử dụng bất kỳ loại tích hợp nào.

  • Luật tiêu chuẩn được áp dụng. Mã ngắn nhất trong byte thắng.

Bảng xếp hạng

Để điểm số của bạn xuất hiện trên bảng, nó phải ở định dạng này:

# Language, Bytes


Nếu mđược phép làm từ điển, bạn có thể cung cấp các trường hợp thử nghiệm như từ điển không?
Martin Ender

Tôi đã xem xét nó, nhưng chúng khá lớn, đặc biệt là trường hợp cuối cùng (hàng ngàn cặp giá trị khóa) và tôi không thể nghĩ ra một định dạng rất tốt cho chúng. Có thể dễ dàng hơn cho người trả lời sao chép các định nghĩa hàm, và sau đó tự xây dựng từ điển (với một cái gì đó như for a in G: for b in G: d[(a, b)] = m(a, b)).
Lynn

Tôi nghĩ đó là chính xác. Tôi không thể hiểu rõ về dán của bạn đủ tốt để xác minh những gì đang diễn ra, nhưng điều này sẽ chứng minh điều đó: bpaste.net/show/5821182a9b48
Lynn

Để giúp quấn đầu của bạn xung quanh nó: nó hoạt động trên các số thứ ba với các dấu trong định dạng AABC, coi chúng là bộ ba (A, B, C), với modulo bổ sung theo cặp (9, 3, 3).
Lynn

Ồ, tôi vừa nhận ra sai lầm (rất ngu ngốc) của mình. Cảm ơn bạn cho đoạn trích của bạn!
flawr

Câu trả lời:


5

Matlab, 326 byte

Với một số lý thuyết nhóm, ý tưởng này khá đơn giản: Ở đây TL; DR Tính toán tất cả các thứ tự có thể có của các phần tử của nhóm. Sau đó tìm nhóm con lớn nhất của một trật tự quyền lực nhất định và "nhân tố" nó ra khỏi nhóm, rửa sạch, lặp lại.

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)

Ví dụ đầu vào:

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; 

Phiên bản chơi gôn:

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 , 159 111 byte

GAP cho phép chúng ta chỉ cần xây dựng một nhóm bằng bảng nhân và tính toán các bất biến abelian của nó:

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;

Phiên bản cũ

Nhóm được trình bày chính xác với các bộ tạo G và quan hệ a * b = m (a, b) (với tất cả a, b từ G) là nhóm (G, m) mà chúng tôi bắt đầu. Chúng ta có thể tạo nó và tính toán các bất biến abelian của nó với 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;

Ví dụ

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;

Bây giờ chúng ta có thể làm:

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

Trên thực tế, chúng tôi không bị hạn chế sử dụng danh sách các số nguyên. Sử dụng tên miền chính xác, chúng ta chỉ có thể sử dụng dấu cộng chung:

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

Vì vậy, về cơ bản tôi có thể thực hiện ví dụ thứ hai bằng cách sử dụng nhóm của nó là đẳng cấu với nhóm phụ gia của không gian vectơ 2 chiều trên trường có 2 phần tử:

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

Và các ví dụ còn lại:

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

Nhận xét bổ sung

Trong phiên bản cũ, m không cần xác định thành phần nhóm cho G. Nếu m (a, b) = m (a, c), điều đó chỉ nói rằng b = c. Vì vậy, chúng tôi có thể làm ai(m1,[0..5])ai(m3,[5..15]). Phiên bản mới sẽ thất bại kinh khủng trong những trường hợp này, cả hai phiên bản nếu m trả về các giá trị không nằm trong G.

Nếu (G, m) không phải là abelian, chúng ta sẽ có một mô tả về phiên bản bị hủy bỏ của nó, đó là nhóm yếu tố abelian lớn nhất của nó:

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

Đây là những gì AbelianInvariantsthường được sử dụng cho, chúng ta thường chỉ cần gọi AbelianInvariants(SymmetricGroup(4)).

Phiên bản chơi gôn

function(m,G)return AbelianInvariants(GroupByMultiplicationTable(List(G,a->List(G,b->Position(G,m(a,b))))));end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.