ЗАДАЧА ОБ ОЖЕРЕЛЬЯХ. АЛГОРИТМЫ НАХОЖДЕНИЯ РЕШЕНИЙ. ПРОГРАММНАЯ РЕАЛИЗИЦИЯ ЗАДАЧИ
Секция: 6. Математические науки
XXXIV Студенческая международная заочная научно-практическая конференция «Молодежный научный форум: технические и математические науки»
ЗАДАЧА ОБ ОЖЕРЕЛЬЯХ. АЛГОРИТМЫ НАХОЖДЕНИЯ РЕШЕНИЙ. ПРОГРАММНАЯ РЕАЛИЗИЦИЯ ЗАДАЧИ
Введение
В данной статье рассматриваются некоторые алгоритмы решения задачи об ожерельях. В данной работе уделим особое внимание Лемме Бёрнсайда, теореме Пойа и некоторым соответствующим определениям, так как этот теоретический материал поможет реализовать программный продукт решения задачи, что является нашей целью.
Актуальность
В чем же состоит актуальность выбранной нами темы? Ответ на данный вопрос прост. В теории кодирования некоторые вопросы связаны с известной комбинаторной задачей, которая называется «Задача об ожерельях».
Какое же отношение имеет задача об ожерельях к проблемам кодирования? А дело вот в чем: при передаче закодированных сообщений на передающей и приемной сторонах канала связи должна выполняться синхронизация. Синхронность работы обеспечивается тактовыми генераторами. При сбоях этих генераторов происходит нарушение синхронизации, а это в свою очередь приведет к неправильному восприятию символов. Т.е. в качестве начального символа кодового слова воспринимается такой символ, который и не является начальным. Отсюда вытекает и актуальность задачи построения кодов, которые способны восстанавливать синхронизацию.
Основные определения
Действие группы на множестве – это гомоморфизм групп , где – группа биекций. Обозначается .
При фиксированном действии для каждого элемента определены его орбита и стабилизатор – подгруппа .
Орбиты действия – классы эквивалентности по отношению
.
Действие называется
· Транзитивным, если все множество – единственная орбита, т.е. ;
· Эффективным, если его ядро неэффективности тривиально.
Функция Эйлера определяется для всех целых положительных a и представляет собою число чисел ряда взаимно простых с a.
Инвариантной перестановкой будет являться любая перестановка, полученная из данной циклическим сдвигом.
Перестановка – это упорядоченный набор чисел , обычно трактуемый как биекция на множеств , которая числу ставит в соответствие i-ый элемент из набора. Число при этом называется порядком перестановки.
Циклом длины называется такая перестановка которая тождественна на всём множестве X кроме подмножества и , . Обозначается
Формулировка задачи об ожерельях
Требуется посчитать количество ожерелий из бусинок, каждая из которых может быть покрашена в один из цветов. При сравнении двух ожерелий их можно поворачивать, но не переворачивать, т.е. разрешается сделать циклический сдвиг. Решение данной задачи опирается на лемму Бёрнсайда и теорему Пойа.
Лемма Бёрнсайда
Пусть группа действует на множество . Будем называть два элемента и эквивалентными. Если для некоторого , то два элемента и являются эквивалентными. Тогда число классов эквивалентности равно сумме числа стабилизаторов по всем элементам группы , делённой на размер этой группы: , — количество стабилизаторов для элемента .
Обобщением леммы Бёрнсайда является Теорема Пойа. Она позволяет находить количество классов эквивалентности, используя величину - количество циклов в перестановке.
Теорема Пойа
где — количество различных классов эквивалентности, - количество циклов в перестановке , - количество различных состояний одного элемента.
Первый алгоритм нахождения решения задачи про ожерелья
Дано: бусины различных цветов, ожерелье состоит из бусин.
Для решения данной задачи мы обратимся к теореме Пойа, воспользовавшись нижеприведенной формулой:
Из условия видно, что любая перестановка, которая получается путем циклического сдвига, будет инвариантной данной. Очевидно, что всего инвариантных перестановок в каждом классе (т.к. для каждой перестановки длины существует инвариантная перестановка). Следующим шагом будет нахождение . Обратим внимание, что в i-ой перестановке на позиции стоит элемент . А также видим, что элемент переходит в элемент , где . Следовательно, длина цикла для -ой перестановки равна , где -НОД,НОК.
Откуда следует что: где — количество различных ожерелий, получаемые из бусин различных цветов.
Если бусины раскрашиваем в один цвет, то они принадлежат одной орбите, т.е. одна получается из другой путем преобразования симметрии. У тождественного поворота есть неподвижных точек. Обратившись к лемме Бёрнсайда, получаем, что число орбит равняется , где - минимальное число, причем делится на , число их раскрасок . Сумма инвариантных раскрасок для всех поворотов:
В последней сумме слагаемых (— функция Эйлера), для которых . Если же , то .
Количество , меньших , определяется перебором чисел вида , и обязательно проверяются эти числа условием .
По определению функции таких чисел будет . Сделав подстановку, получаем: Тогда количество различных
ожерелий будем высчитывать по формуле:
Второй алгоритм нахождения решения про ожерелья
Пусть теперь ожерелья считаются одинаковыми, они переходят друг в друга не только поворотом, но и отражением относительно некоторой оси, которая может располагаться на двух противоположных бусин, или ось лежит на противоположных пустотах, а также ось может проходить через бусину, если их нечетное количество. Для решения задачи по второму алгоритму будем пользоваться леммой Бёрнсайда.
Сначала отметим, что в качестве операций требуется рассматривать только повороты и отражения. Возможные операции:
1) Поворот и отражение – отражение.
2) Отражение и поворот – отражение.
3) Отражение и отражение – поворот.
Пронумеруем наши бусинки по часовой стрелке. Поворот не меняет порядка. Нетрудно понять, что и отражение не меняет порядка, а меняет лишь направление обхода бусин. Если мы сначала совершим поворот, а потом проведем отражение относительно какой-нибудь оси, то мы можем получить, то же самое и обычным отражением относительно какой-то оси. Такая ось будет, ведь всегда можно выбрать ось, которая поставит первую бусину на своё первоначальное место, поменяв направление обхода. Поэтому поворот и отражение не добавляет нам новой операции. Аналогично рассуждая во втором пункте, получим такой же вывод. В третьем пункте мы дважды меняем направление обхода, но не изменяем порядка. Поэтому эту операцию заменит обычный поворот.
Выделим два случая, когда число бусин нечетное и четное.
Случай 1. Дано: число бусин - нечётное. Тогда мы имеем осей, которые проходят через каждую бусину. Рассмотрим одну ось. Возьмём саму бусину, через которую проходит выбранная ось, и половину бусин с одной стороны от этой оси. Окрасим выбранные бусины в различные цвета, а остальная половина бусин по ним однозначно восстановится. Таким образом, количество неподвижных точек для одной оси получим . Операций в группе станет в два раза больше: (т.е. сдвигов и отражений).
Воспользуемся леммой Бёрнсайда, взяв формулу:
. Первые операций — повороты, сумма их количества неподвижных точек принимает значение , где - количество ожерелий из бусинок различных цветов без отражений (вышеприведенный алгоритм). Деление в предыдущем алгоритме происходило на , а здесь на . Следующие операций — отражения. Сумма неподвижных точек будет .
Случай 2. Дано: число бусин - чётное. В данном случае мы имеем осей, проходящих через пустоты между бусинами. Можно выбрать по бусин и дать им различные цвета. Остальная половина восстановится по ним. Для данных осей количество неподвижных точек будет . Ещё у нас есть осей, проходящих через бусины. В данных случаях мы можем выбрать по бусин. То есть количество неподвижных точек будет . Операций в группе также . Снова воспользовавшись Леммой Бёрнсайда, получим:
Теперь вернемся к проблемам кодирования. Разложим бусин по окружности, указав для каждой бусины номер ее цвета. Если совершить обход этой окружности в определенном направлении, начав с какой-то бусины, то ожерелью из бусинок будет соответствовать слово (), где - это номер цвета i-й бусины. Т.к. обход можно начать с любой бусины, поэтому любому ожерелью соответствует слов, получаемых одно из другого путем циклических сдвигов. Чтобы вывести формулу для нахождения числа основных слов, воспользуемся функцией Мёбиуса
, если ;
0 - в остальных случаях.
Обозначив общее число основных слов длины алфавита из символов ,получим . Полученная формула позволяет найти число интересующих нас ожерелий, которое, очевидно, равно
Один из возможных путей решения - рассмотрение множества n-буквенных кодовых слов, удовлетворяющего такому ограничению: если () и ()- кодовые слова, то никакое из «перекрытий» между ними
(), (),…, () не является кодовым словом. Коды, обладающие этим свойством, называются синхронизируемыми. Решение задачи об ожерельях позволит узнать, насколько велика плата за усовершенствование кода. Действительно, если - кодовое слово синхронизируемого кода, то кодовым словом не может быть его циклический сдвиг, так как он является перекрытием для пары .
Следовательно, обозначенное максимальное число n-буквенных слов синхронизируемого кода, который использует алфавит из символов, не превосходит числа несоставных ожерелий с бусинами различных цветов.
.
В итоге, получаем верхнюю границу для числа n -буквенных кодовых слов синхронизируемого кода:
Реализация программного продукта
Формулировка конкретной задачи: ожерелье состоит из N колечек, нанизанных на замкнутую нить. Все колечки имеют разные размеры. В зависимости от размера колечки пронумерованы числами от 1 до N, начиная с самого маленького и до самого большого. Колечки можно передвигать вдоль нити и протаскивать одно через другое, если номера этих колечек отличаются более чем на единицу. Необходимо упорядочить колечки в порядке возрастания номеров вдоль нити по часовой стрелке.
Реализация решения данной задачи разработана на языке программирования С++. Среда разработки - Microsoft Visual Studio.
class Functions{
public:
static int ReadInt(){
int value = 0;
scanf("%d", &value);
return value;}
static int Abs(int x)
{return (x < 0) ? -x: x;}
};
class Data{
private: …
public: …
bool Swap(int i, int j){
Data &data = *this;
if (Functions::Abs(data[i]-data[j]) < 2)
return false;
int t = data[i];
data[i] = data[j];
data[j] = t;
return true;}
…
class Solver{
public:
static void Solve(Data &data){
while (true){
bool end = true;
for (int i = 0; i < data.Size(); i++){
if (data[i] > data[i+1])
continue;
if (data.Swap(i, i+1)){
printf("%d %d\n", data[i+1], data[i]);
end = false;}
} if (end)
break;
}printf("0\n");
};}; …
Заключение
Таким образом, в данной работе мы достигли своей цели, представив программную реализацию решения конкретной задачи об ожерельях, а также рассмотрели различные алгоритмы нахождения решения.