这是哪个有限的阿贝尔群?


12

描述

编写一个函数f(m, G),该函数接受映射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

为了帮助您将头缠起来:它对三进制数进行运算,其格式为trits AABC,将它们视为三元组(A, B, C),并具有成对加法模数(9, 3, 3)
林恩

哦,我刚刚意识到我的(非常愚蠢的)错误。谢谢您的摘录!
瑕疵的

Answers:


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

GAP159111字节

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个元素的字段上的二维矢量空间的加法组同构:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.