Я тут переписываю с нуля на чисто код программы (с упором на производительность), которая разбирает группу на подгруппы и вычисляет всевозможные свойства для последующего анализа. Некоторыми из этих свойств являются абелевость, нормальность, центральность и характеристичность. Мой вопрос касается, собственно, того
как эти свойства должны вычисляться, чтобы было быстро и не было ошибок.
Вот, например, абелевость. По определению группа/подгруппа абелева, когда любая пара её элементов коммутирует. То есть
Разумеется, вычислять в лоб по этому определению двумя вложенными циклами по всем элементам группы нерационально. Поэтому я придумал следующую оптимизацию: проверяем, что коммутирует любая пара образующих группы/подгруппы
G. Корректность этой проверки следует из следующего утверждения:
Цитата:
Группа абелева тогда и только тогда, когда любая пара её образующих коммутирует.
В обратную сторону это утверждение очевидно. В прямую оно следует из того, что любой элемент группы представим в виде комбинации (слова) образующих (букв). Если записать два слова для двух элементов группы одно за другим, то за счёт того, что образующие коммутируют, можно первое слово по одной букве протащить за второе слово, что будет означать, что рассматриваемые элементы коммутируют. Разумеется, эта процедура работает только при условии конечности представления элементов группы, что верно для конечной группы. Что происходит в бесконечном случае — отдельный вопрос.
С нормальностью чуть-чуть интереснее. Подгруппа
N группы
G является нормальной, если любое сопряжение любого элемента
любым элементом
даёт элемент группы
N:
В случае абелевой группы ничего проверять не надо, любая подгруппа будет нормальной. А вот в случае неабелевой группы хотелось бы чего-нибудь более продвинутого, чем проверка в лоб по определению. Гонять два вложенных цикла (один по элементам подгруппы, другой — всей группы) с последующим поиском результата (не важно, двоичным ли поиском в сортированном списке элементов или же через массив флагов принадлежности элемента) в подгруппе — занятие очень нерациональное. Как мне кажется, образующие и здесь должны помочь.
Сопряжение любым элементом (словом) группы
G можно представить как последовательное применение сопряжений образующими (буквами, составляющими слово) группы
G. Если любой элемент подгруппы
N любой образующей группы
G сопрягается в элемент, всё также принадлежащий подгруппе
N, то и любой другой элемент группы
G будет действовать так же. Получается, в одном из вложенных циклов перебор достаточно делать лишь по образующим группы, а не по всей группе целиком.
Хотелось бы сократить и второй цикл: перебирать только образующие подгруппы
N. Вопрос: можно ли?