Описание
Напишите функцию, f(m, G)которая принимает в качестве аргументов отображение mи набор / список различных неотрицательных целых чисел G.
mследует сопоставить пары целых чисел Gс новыми целыми числами в G. ( G, m) гарантированно образует конечную абелеву группу , но любой элемент Gможет быть тождественным.
Есть важная теорема, которая гласит:
fдолжен вернуть список основных полномочий [p1, ... 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
for a in G: for b in G: d[(a, b)] = m(a, b)).
AABC, обрабатывая их как тройки (A, B, C), с попарно сложением по модулю (9, 3, 3).
mразрешено быть словарем, могли бы вы также предоставить контрольные примеры в качестве словарей?