Какая это конечная абелева группа?

12

Описание

Напишите функцию, f(m, G)которая принимает в качестве аргументов отображение mи набор / список различных неотрицательных целых чисел G.

mследует сопоставить пары целых чисел Gс новыми целыми числами в G. ( G, m) гарантированно образует конечную абелеву группу , но любой элемент 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).

  • Ваша реализация должна теоретически работать для произвольно больших входных данных, но не обязательно должна быть эффективной.

  • Нет никаких ограничений на использование встроенных программ любого рода.

  • Применяются стандартные правила . Самый короткий код в байтах побеждает.

Leaderboard

Чтобы ваш счет появился на доске, он должен быть в следующем формате:

# Language, Bytes

Линн
источник
Если mразрешено быть словарем, могли бы вы также предоставить контрольные примеры в качестве словарей?
Мартин Эндер
Я подумал об этом, но они довольно большие, особенно в последнем случае (тысячи пар ключ-значение), и я не могу придумать для них очень хороший формат. Возможно, ответчикам будет проще скопировать определения функций, а затем создать сами словари (с чем-то вроде for a in G: for b in G: d[(a, b)] = m(a, b)).
Линн
Я думаю, что это правильно. Я не могу понять вашу пасту достаточно хорошо, чтобы проверить, что происходит, но это должно доказать это: bpaste.net/show/5821182a9b48
Линн
Чтобы помочь обернуть его вокруг: он работает с троичными числами с тритами в формате 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)
flawr
источник
1

GAP , 159 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) (для всех a, b из G) - это группа (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 элементами:

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
Кристиан Сиверс
источник