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

Матеріал з testwiki
Версія від 10:28, 26 серпня 2024, створена imported>Lxlalexlxl
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Тест асоціативності — перевірка бінарної операції на асоціативність. Наївна процедура перевірки, яка полягає у переборі всіх можливих трійок аргументів операції, вимагає O(n3) часу, де n — розмір множини, над яким визначено операцію. Ранні тести асоціативності не давали асимптотичних покращень порівняно з наївним алгоритмом, проте дозволяли покращити час роботи в окремих випадках. Наприклад, Роберт Тарджан 1972 року виявив, що запропонований 1949 року тест Лайта дозволяє виконати перевірку за O(n2logn), якщо досліджувана бінарна операція оборотна (задає квазігрупу). Перший імовірнісний тест, що покращує час роботи з O(n3) до O(n2logδ1), був запропонований 1996 року Шрідхаром Раджаґопаланом і Шаблон:Iw. 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 року Шаблон:Iw і Шаблон:Iw опублікували у книзі «Алгебраїчна теорія напівгруп» (Шаблон:Lang-en) тест асоціативності, повідомлений одному з авторів доктором Лайтом 1949 року. Алгоритм полягає у розгляді для кожного gG операцій xgy=x(gy) і xgy=(xg)y. За визначенням, операція асоціативна якщо і тільки якщо g=g (таблиці Келі операцій збігаються) для всіх gG[10]. Лайт звернув увагу, що якщо G=S, тобто G має породжувальну множину S, то перевірку достатньо провести лише для gS[11][12].

Шаблон:Теорема Шаблон:Доведення1

У гіршому випадку (наприклад, для операції максимуму) найменша породжувальна множина магми може складатися з n елементів, тому тест доведеться провести для всіх елементів G, що займе O(n3) часу. 1972 року Роберт Тарджан звернув увагу на те, що тест Лайта може бути дієвим для перевірки того, чи задає задана операція групу[2]. Це пов'язано з тим, що для деяких спеціальних операцій, зокрема операцій, що задовольняють груповій аксіомі наявності зворотного елемента, завжди можна виділити породжувальну множину невеликого розміру[12].

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

Шаблон:Доведення1

За визначенням, G є квазігрупою якщо і тільки якщо її таблиця Келі є латинським квадратом, що може бути перевірено за час O(n2). Застосування до квазігрупи описаної вище процедури дозволяє своєю чергою детерміновано перевірити, чи є G групою, за O(n2logn)[13].

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

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

Алгоритм

Алгоритм використовує Шаблон:Iw 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. У такому разі, за Шаблон:Iw, ймовірність спростування невірної тотожності за одну ітерацію може бути поліпшено з 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