กลุ่ม Abelian อัน จำกัด อันนี้คืออะไร?


12

ลักษณะ

เขียนฟังก์ชั่นf(m, G)ที่ยอมรับเป็นข้อโต้แย้งของการทำแผนที่mและชุด / รายการที่แตกต่างกัน Gintegers

mควร map คู่ของจำนวนเต็มในจำนวนเต็มใหม่G G( G, m) รับประกันว่าจะสร้างกลุ่ม Abelianแน่นอนแต่องค์ประกอบใด ๆ ของGอาจเป็นตัวตน

มีทฤษฎีบทสำคัญที่บอกว่า:

[แต่ละกลุ่ม Abelian จำกัด ] isomorphic กับผลิตภัณฑ์โดยตรงของกลุ่มวงจรของการสั่งซื้อพลังงานที่สำคัญ

fจะต้องส่งคืนรายการมหาอำนาจ[p1, ... pn]ตามลำดับจากน้อยไปมากเช่นนั้นG isomorphic ถึง 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]เป็นพารามิเตอร์ที่อธิบายกลุ่ม isomorphic ไป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]เนื่องจากกลุ่มนี้ isomorphic ถึงZ 3 × Z 3 × Z 9

กฎระเบียบ

  • mอย่างใดอย่างหนึ่งอาจจะเป็นฟังก์ชั่น (หรือตัวชี้ฟังก์ชั่นการทำงานบางส่วน) Int × Int → Intหรือคู่ทำแผนที่พจนานุกรมในองค์ประกอบใหม่G × GG

  • ff(G, m)อาจใช้พารามิเตอร์คู่แข่งตรงข้ามเช่นคุณอาจใช้

  • การใช้งานของคุณควรทำงานในทางทฤษฎีสำหรับอินพุตขนาดใหญ่โดยพลการ แต่ไม่จำเป็นต้องมีประสิทธิภาพ

  • ไม่มีข้อ จำกัด ในการใช้บิวด์อินทุกชนิด

  • ใช้กฎมาตรฐานของรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ลีดเดอร์บอร์ด

เพื่อให้คะแนนของคุณปรากฏบนกระดานควรอยู่ในรูปแบบนี้:

# Language, Bytes


หากmได้รับอนุญาตให้เป็นพจนานุกรมคุณสามารถให้กรณีทดสอบเป็นพจนานุกรมได้หรือไม่
Martin Ender

ฉันพิจารณาแล้ว แต่พวกมันก็ค่อนข้างใหญ่โดยเฉพาะอย่างยิ่งกรณีสุดท้าย (คู่ของคีย์ - ค่าหลายพันคู่) และฉันไม่สามารถคิดรูปแบบที่ดีสำหรับพวกเขาได้ มันอาจจะง่ายขึ้นสำหรับ answerers ที่จะคัดลอกคำจำกัดความของฟังก์ชั่นและจากนั้นสร้างพจนานุกรมของตัวเอง (กับสิ่งที่ต้องการfor a in G: for b in G: d[(a, b)] = m(a, b))
ลินน์

ฉันคิดว่ามันถูกต้อง ฉันไม่เข้าใจว่าการวางของคุณดีพอที่จะตรวจสอบสิ่งที่เกิดขึ้น แต่สิ่งนี้ควรพิสูจน์ได้: bpaste.net/show/5821182a9b48
Lynn

เพื่อช่วยห่อหัวของคุณรอบ ๆ มัน: ทำงานบนตัวเลขที่ประกอบไปด้วย trits ในรูปแบบAABCการรักษาพวกเขาเป็นสามเท่ากับ(A, B, C)modulo นอกจากนี้แบบ(9, 3, 3)สองทาง
ลินน์

โอ้ฉันเพิ่งเข้าใจผิด (โง่มาก) ของฉัน ขอบคุณสำหรับตัวอย่างของคุณ!
ข้อบกพร่อง

คำตอบ:


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; 

รุ่น Golfed:

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 ไบต์

GAP ช่วยให้เราสามารถสร้างกลุ่มโดยตารางการคูณและคำนวณค่าคงที่ของ abelian:

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) (สำหรับ a, b จาก G) คือกลุ่ม (G, m) ที่เราเริ่มต้นด้วย เราสามารถสร้างและคำนวณค่าคงที่ abelian กับ 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 ]

ดังนั้นฉันสามารถทำตัวอย่างที่สองโดยใช้ว่ากลุ่มของมันคือ isomorphic กับกลุ่มเพิ่มเติมของปริภูมิเวกเตอร์ 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) ไม่ใช่ abelian เราจะได้คำอธิบายของเวอร์ชัน abelianized นั่นคือกลุ่มปัจจัย abelian ที่ใหญ่ที่สุด:

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

นี่คือสิ่งที่มักจะใช้สำหรับเราจะได้ตามปกติเพียงโทรAbelianInvariantsAbelianInvariants(SymmetricGroup(4))

รุ่น golfed

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.