Тест ассоциативности

Материал из testwiki
Перейти к навигации Перейти к поиску

Тест ассоциативности — проверка бинарной операции на ассоциативность. Наивная процедура проверки, заключающаяся в переборе всех возможных троек аргументов операции, требует O(n3) времени, где n — размер множества, над которым определена операция. Ранние тесты ассоциативности не давали асимптотических улучшений по сравнению с наивным алгоритмом, однако позволяли улучшить время работы в некоторых частных случаях. Например, Роберт Тарьян в 1972 году обнаружил, что предложенный в 1949 году тест Лайта позволяет выполнить проверку за O(n2logn), если исследуемая бинарная операция обратима (задаёт квазигруппу). Первый вероятностный тест, улучшающий время работы с O(n3) до O(n2logδ1), был предложен в 1996 году Шридхаром Раджагопаланом и Шаблон:Не переведено 5. В 2015 году был предложен квантовый алгоритм, проверяющий операцию на ассоциативность за время O(n10/7), что является улучшением по сравнению с поиском Гровера, работающим за O(n3/2)[1].

Постановка задачи

Дана таблица размера n×n, описывающая замкнутую операцию :G×GG на множестве G размера n, то есть операция задана своей таблицей Кэли, а G вместе с данной операцией образует магму. Необходимо проверить, что для любых a,b,cG выполнено a(bc)=(ab)c (другими словами, операция ассоциативна). Любой детерминированный алгоритм, решающий данную задачу, потребует не менее O(n2) времени, так как каждая ячейка таблицы Кэли должна быть считана хотя бы раз. Полный перебор всех троек a,b,c с проверкой того, что равенство выполняется для каждой тройки, требует O(n3) времени[2].

Мотивация

Проверка ассоциативности — одна из естественных задач, возникающих при работе с таблицами Кэли различных операций[3]. В частности, такая проверка реализована в системах компьютерной алгебры GAP[4] и Maple[5]. В наиболее общем случае, существуют операции, для которых все тройки, кроме одной, являются ассоциативными — примером такой операции на n3 элементах служит операция , такая что 12=2, а для всех остальных элементов ab=3. Её единственной неассоциативной тройкой является 1,1,2, так как 1(12)=12=23=32=(11)2[6]. Из-за существования таких операций может сложиться впечатление, что проверка ассоциативности потребует обработки всех возможных троек и потому асимптотическое улучшение времени работы алгоритма невозможно[7]. По этой же причине наивный вероятностный алгоритм, проверяющий ассоциативность случайным образом выбранных троек, потребует O(n3) проверок, чтобы гарантировать достаточно низкую вероятность ошибки[8]. Однако предложенный Раджагопаланом и Шульманом алгоритм показывает, что эта оценка может быть улучшена, и служит наглядным примером того, как вероятностные алгоритмы могут справляться с задачами, которые выглядят трудными для детерминированных алгоритмов — по состоянию на 2020 год детерминированные алгоритмы, решающие данную задачу за субкубическое время, неизвестны[9].

Тест Лайта

В 1961 году Шаблон:Не переведено 5 и Шаблон:Не переведено 5 опубликовали в книге «Алгебраическая теория полугрупп» тест ассоциативности, сообщённый одному из авторов доктором Лайтом в 1949 году. Алгоритм заключается в рассмотрении для каждого gG операций xgy=x(gy) и xgy=(xg)y. По определению, операция ассоциативна если и только если g=g (таблицы Кэли операций совпадают) для всех gG[10]. Лайт обратил внимание, что если G=S, то есть у G есть порождающее множество S, то проверку достаточно произвести лишь для gS[11][12].

Шаблон:Теорема Шаблон:Доказательство

В худшем случае (например, для операции максимума) наименьшее порождающее множества магмы может состоять из n элементов, потому тест придётся провести для всех элементов G, что займёт O(n3) времени. В 1972 Роберт Тарьян обратил внимание на то, что тест Лайта может быть эффективен для проверки того, задаёт ли заданная операция группу[2]. Это связано с тем, что для некоторых особых типов операций, в том числе операций, удовлетворяющих групповой аксиоме наличия обратного элемента, всегда можно выделить порождающее множество небольшого размера[12].

Шаблон:Теорема

Шаблон:Доказательство

По определению, G является квазигруппой если и только если её таблица Кэли представляет собой латинский квадрат, что может быть проверено за время O(n2). Применение к квазигруппе описанной выше процедуры позволяет в свою очередь детерминированно проверить, является ли G группой, за O(n2logn)[13].

Тест Раджагопалана — Шульмана

Первым субкубическим тестом стал алгоритм типа Монте-Карло, предложенный в 1996 году[14] Шридхаром Раджагопаланом из Принстонского университета и Шаблон:Не переведено 5 из Технологического института Джорджии. Предложенная ими процедура требует O(n2logδ1) времени, где δ — наибольшая допустимая вероятность ошибки[3][7].

Алгоритм

Алгоритм использует Шаблон:Не переведено 5 2[G] — линейное пространство (алгебру) над двухэлементным полем 2 размерности n, базисные векторы vg1,,vgn которого соответствуют всем различным элементам магмы g1,,gn. Векторы такого пространства имеют вид

A=ag1vg1+ag2vg2++agnvgn=gGagvg, где ag2.

Для них определена операция суммы

A+B=gG(agbg)vg, где обозначает сложение ag и bg в 2,

а также операция произведения

AB=x,yGaxbyvxy=gG(xy=gaxby)vg, где axby обозначает произведение ax и by в 2.

Произведение векторов в такой алгебре становится более интуитивным, если считать, что для любой пары базисных векторов оно определено как vxvy=vxy, а произведение любой другой пары векторов получается «раскрытием скобок» и перегруппировкой слагаемых. Например, для G={p,q,r} произведение имеет вид

AB=(apvp+aqvq+arvr)(bpvp+bqvq+brvr)=apbp(vpvp)+apbq(vpvq)++arbr(vrvr),

а при подстановке vxvy=vxy получается выражение, соответствующее общему определению[8]. Для определённой таким образом алгебры имеет место следующая лемма[15]:

Шаблон:Теорема

Для проверки ассоциативности выбираются случайные A,B,C2[G], для которых проверяется A(BC)=(AB)C. Такая проверка может быть осуществлена за время O(n2), а для достижения вероятности ошибки, не превосходящей δ, достаточно сделать log8/7δ1 проверок, что даёт общее время работы O(n2logδ1)[15].

Произвольные операции

Подход Раджагопалана и Шульмана может быть обобщён для проверки тождеств общего вида при условии, что каждая переменная встречается ровно один раз в левой и правой части тождества[16].

Для примера можно рассмотреть множество G, на элементах которого заданы три операции: «объединение» ab, «пересечение» ab и «дополнение» a¯. Необходимо проверить, что a(bc)=a(bc). Для этого можно рассмотреть индуцированные на 2[G] операции

AB=gG(xy=gaxby)g, AB=gG(xy=gaxby)g и A¯=gGa¯gg

и проверить, что для этих операций в 2[G] верно A(BC)=A(BC). В наиболее общем виде процедура может быть охарактеризована следующей теоремой[16]:

Шаблон:Теорема

В случае |D1|==|Dk|=n операция j имеет область определения размера ncj, в связи с чем M=nmaxcj и вычислительная сложность процедуры приобретает вид O(2klnmaxcjlogδ1), в то время как наивная проверка потребовала бы O(lnk) операций[16].

Данный результат может быть улучшен, если вместо 2[G] рассматривать алгебру p[G] для простого числа p>k. В таком случае, по лемме Шварца — Зиппеля, вероятность опровержения неверного тождества за одну итерацию может быть улучшена с 12k до 1kp, что при p(1+ε)k соответствует константной вероятности ε1+ε и позволяет улучшить время работы до O(lMlogδ1)[6].

Поиск свидетеля нетождественности

Алгоритм может быть модифицирован для нахождения конкретного набора переменных, на которых тождество не выполняется. Для примера, можно рассмотреть поиск неассоциативной тройки (a,b,c) за время O(n2lognlogδ1). Пусть для некоторых A,B,C2[G] известно, что A(BC)(AB)C. Данным элементам можно сопоставить тройку A,B,C, такую что если ai=0, то ai также равно 0, а если ai=1, то ai выбирается случайным образом между 0 и 1 (аналогично для bi и ci). Для вероятности того, что A(BC)(AB)C, будет всё ещё верна оценка снизу 18, потому процедуру можно повторять до тех пор, пока каждый из элементов A,B,C не будет иметь единицу лишь в одной из позиций, что будет соответствовать искомой неассоциативной тройке в G[17].

Примечания

Шаблон:Примечания

Литература

Шаблон:Refbegin

Шаблон:Refend

Шаблон:Хорошая статья