Автокорреляционный многочлен — различия между версиями
м (rollbackEdits.php mass rollback) |
|||
(не показаны 4 промежуточные версии 3 участников) | |||
Строка 16: | Строка 16: | ||
== Пример построения автокорреляционного многочлена == | == Пример построения автокорреляционного многочлена == | ||
− | Пусть имеем алфавит <tex>\Sigma = \{0, 1\}</tex>, рассмотрим строку <tex>p=001100</tex>. Будем проверять факт совпадения суффикса и префикса строки <tex>p</tex>, используя следующую таблицу: | + | Пусть имеем алфавит <tex>\Sigma = \{0, 1\}</tex>, рассмотрим строку <tex>p=001100</tex>. Будем проверять факт совпадения суффикса и префикса строки <tex>p</tex>, используя следующую таблицу: |
{| class="wikitable" | {| class="wikitable" | ||
− | + | | style="font-weight:bold; background:#eaf2ff;" | 0 | |
− | + | | style="font-weight:bold; background:#eaf2ff;" | 0 | |
− | + | | style="font-weight:bold; background:#eaf2ff;" | 1 | |
− | + | | style="font-weight:bold; background:#eaf2ff;" | 1 | |
− | + | | style="font-weight:bold; background:#eaf2ff;" | 0 | |
− | + | | style="font-weight:bold; background:#eaf2ff;" | 0 | |
− | + | | | |
− | + | | | |
− | + | | | |
− | + | | | |
− | + | | | |
− | + | | rowspan="2" | c<sub>0</sub> = 1 | |
|- | |- | ||
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
− | |1 | + | | style="color: green; background:#eaf2ff;" | 1 |
− | |1 | + | | style="color: green; background:#eaf2ff;" | 1 |
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
+ | | | ||
| | | | ||
+ | | | ||
+ | | | ||
| | | | ||
+ | |- | ||
+ | | colspan="12" | | ||
+ | |- | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | | ||
+ | | | ||
| | | | ||
| | | | ||
| | | | ||
− | |1 | + | | rowspan="2" | c<sub>1</sub> = 0 |
|- | |- | ||
| | | | ||
+ | | style="color: green; background:#eaf2ff;" | 0 | ||
+ | | style="color: red; background:#eaf2ff;" | 0 | ||
+ | | style="color: green; background:#eaf2ff;" | 1 | ||
+ | | style="color: red; background:#eaf2ff;" | 1 | ||
+ | | style="color: green; background:#eaf2ff;" | 0 | ||
|0 | |0 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
− | |0 | + | |- |
− | |- | + | | colspan="12" | |
+ | |- | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | rowspan="2" | c<sub>2</sub> = 0 | ||
+ | |- | ||
| | | | ||
| | | | ||
+ | | style="color: red; background:#eaf2ff;" | 0 | ||
+ | | style="color: red; background:#eaf2ff;" | 0 | ||
+ | | style="color: red; background:#eaf2ff;" | 1 | ||
+ | | style="color: red; background:#eaf2ff;" | 1 | ||
|0 | |0 | ||
|0 | |0 | ||
− | |||
− | |||
− | |||
− | |||
| | | | ||
| | | | ||
| | | | ||
− | |0 | + | |- |
− | |- | + | | colspan="12" | |
+ | |- | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | rowspan="2" | c<sub>3</sub> = 0 | ||
+ | |- | ||
| | | | ||
| | | | ||
| | | | ||
− | |0 | + | | style="color: red; background:#eaf2ff;" | 0 |
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
− | |1 | + | | style="color: red; background:#eaf2ff;" | 1 |
|1 | |1 | ||
|0 | |0 | ||
Строка 81: | Строка 123: | ||
| | | | ||
| | | | ||
− | |0 | + | |- |
+ | | colspan="12" | | ||
+ | |- | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 1 | ||
+ | | style="font-weight:bold" | 1 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | rowspan="2" | c<sub>4</sub> = 1 | ||
|- | |- | ||
| | | | ||
Строка 87: | Строка 143: | ||
| | | | ||
| | | | ||
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
|1 | |1 | ||
|1 | |1 | ||
Строка 94: | Строка 150: | ||
|0 | |0 | ||
| | | | ||
− | |1 | + | |- |
+ | | colspan="12" | | ||
+ | |- | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold" | 1 | ||
+ | | style="font-weight:bold" | 1 | ||
+ | | style="font-weight:bold" | 0 | ||
+ | | style="font-weight:bold; background:#eaf2ff;" | 0 | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | rowspan="2" | c<sub>5</sub> = 1 | ||
|- | |- | ||
| | | | ||
Строка 101: | Строка 171: | ||
| | | | ||
| | | | ||
− | |0 | + | | style="color: green; background:#eaf2ff;" | 0 |
|0 | |0 | ||
|1 | |1 | ||
Строка 107: | Строка 177: | ||
|0 | |0 | ||
|0 | |0 | ||
− | |||
|} | |} | ||
− | В итоге автокорреляционный многочлен строки <tex>p=001100</tex> | + | В итоге автокорреляционный многочлен строки <tex>p=001100</tex> равен <tex>C(z) = 1 + z^4 + z^5</tex>. |
− | Несложно заметить, что <tex>c_0</tex> всегда равняется <tex>1</tex>, ибо префикс и суффикс длины <tex> | + | Несложно заметить, что <tex>c_0</tex> всегда равняется <tex>1</tex>, ибо префикс и суффикс длины <tex>k</tex> являются исходной строкой и, следовательно, всегда совпадают. <tex>c_{k-1}</tex> равняется <tex>1</tex> только в том случае, если первый и последний символы строки совпадают. |
== Примеры решений задач с использованием автокорреляционного многочлена == | == Примеры решений задач с использованием автокорреляционного многочлена == | ||
Строка 118: | Строка 187: | ||
| definition = Пусть <tex>\Sigma</tex> {{---}} данный алфавит, <tex>p</tex> {{---}} данная непустая строка над алфавитом <tex>\Sigma</tex>. Найти производящую функцию множества слов, не содержащих <tex>p</tex> как подстроку. | | definition = Пусть <tex>\Sigma</tex> {{---}} данный алфавит, <tex>p</tex> {{---}} данная непустая строка над алфавитом <tex>\Sigma</tex>. Найти производящую функцию множества слов, не содержащих <tex>p</tex> как подстроку. | ||
}} | }} | ||
− | Пусть <tex>|\Sigma| = m</tex> {{---}} мощность алфавита <tex>\Sigma</tex>, <tex>S</tex> {{---}} множество слов, не содержащих <tex>p</tex> как подстроку, <tex>\alpha \in S</tex> {{---}} произвольное слово из <tex>S</tex>, <tex>T</tex> {{---}} множество слов, содержащих <tex>p</tex> как подстроку только в самом конце. Рассмотрим все слова вида <tex>\alpha \sigma_1, \alpha \sigma_2, \dots, \alpha \sigma_m</tex>, где <tex>\sigma_1, \sigma_2, \dots, \sigma_m</tex> {{---}} все символы алфавита <tex>\Sigma</tex>. Так как слово <tex>\alpha</tex> не содержало подстроку <tex>p</tex>, то после добавления символа <tex>\sigma_i</tex> новая строка либо так же не содержит <tex>p</tex> как подстроку, и, следовательно, <tex>\alpha\sigma_i \in S</tex>, либо содержит, но только в самом конце, и тогда <tex>\alpha\sigma_i \in T</tex>. Очевидно также, что от удаления последнего символа у слова из <tex>T</tex> всегда получается слово из <tex>S</tex>, то есть, путём добавления ко всем <tex>\alpha \in S</tex> символа <tex>\sigma_i \in \Sigma, i=\overline{1,m},</tex> мы получим все непустые слова из <tex>T</tex> и <tex>S</tex>. В контексте комбинаторных объектов это выражается в равенстве <tex> \{\epsilon\} + S \times \Sigma = | + | Пусть <tex>|\Sigma| = m</tex> {{---}} мощность алфавита <tex>\Sigma</tex>, <tex>S</tex> {{---}} множество слов, не содержащих <tex>p</tex> как подстроку, <tex>\alpha \in S</tex> {{---}} произвольное слово из <tex>S</tex>, <tex>T</tex> {{---}} множество слов, содержащих <tex>p</tex> как подстроку только в самом конце. Рассмотрим все слова вида <tex>\alpha \sigma_1, \alpha \sigma_2, \dots, \alpha \sigma_m</tex>, где <tex>\sigma_1, \sigma_2, \dots, \sigma_m</tex> {{---}} все символы алфавита <tex>\Sigma</tex>. Так как слово <tex>\alpha</tex> не содержало подстроку <tex>p</tex>, то после добавления символа <tex>\sigma_i</tex> новая строка либо так же не содержит <tex>p</tex> как подстроку, и, следовательно, <tex>\alpha\sigma_i \in S</tex>, либо содержит, но только в самом конце, и тогда <tex>\alpha\sigma_i \in T</tex>. Очевидно также, что от удаления последнего символа у слова из <tex>T</tex> всегда получается слово из <tex>S</tex>, то есть, путём добавления ко всем <tex>\alpha \in S</tex> символа <tex>\sigma_i \in \Sigma, i=\overline{1,m},</tex> мы получим все непустые слова из <tex>T</tex> и <tex>S</tex>. В контексте комбинаторных объектов это выражается в равенстве <tex> \{\epsilon\} + S \times \Sigma = S + T</tex>, где <tex>\epsilon </tex> {{---}} комбинаторный объект веса 0, соответствующий пустой строке. |
Рассмотрим теперь слова вида <tex>\alpha p</tex>. После добавления к слову <tex>\alpha</tex> строки <tex>p</tex> мы точно получим все строки из <tex>T</tex>, но, кроме них, могут также получиться строки, имеющие первое вхождение <tex>p</tex> не в самом конце, следовательно, нельзя утверждать, что <tex>\alpha p</tex> всегда принадлежит <tex>T</tex>. Несложно заметить, что <tex> \alpha p \notin T </tex> тогда и только тогда, когда <tex> \alpha p </tex> имеет 2 перекрывающихся вхождения строки <tex>p</tex>. Для того чтобы <tex> \alpha p </tex> имело 2 перекрывающихся вхождения строки <tex>p</tex> необходимо, чтобы <tex>p</tex> имела какой-нибудь суффикс, совпадающий с каким-нибудь префиксом, иначе говоря, чтобы <tex>p</tex> имело автокорреляционный многочлен <tex>C(z) \ne 1</tex>. В результате выходит, что при добавлении ко всем <tex>\alpha \in S</tex> строки <tex>p</tex> получим все строки из <tex>T</tex>, а также все строки, имеющие 2 перекрывающиеся вхождения строки <tex>p</tex>, иными словами, все строки вида <tex>\gamma p_0p_1 \dots p_i \dots p_{k-1} p_{k-i} p_{k-i+1} \dots p_{k-1}</tex> (или, что то же, <tex>\gamma p_0p_1 \dots p_{i-1} p_1 p_2 \dots p_{k-1}</tex>), где <tex>\gamma</tex> {{---}} некоторый префикс <tex>\alpha</tex>, <tex>i \in \overline{1, k-1}</tex>, {{---}} номер некоторого ненулевого коэффициента автокорреляционного многочлена <tex>C(z)</tex> строки <tex>p</tex>. Нетрудно заметить, что <tex>\gamma p_0p_1 \dots p_i \dots p_{k-1} p_{k-i} p_{k-i+1} \dots p_{k-1}</tex> можно представить как некую строку <tex>t \in T</tex> с приписанным в конец суффиксом строки <tex>p</tex> длины <tex>i</tex>. В контексте комбинаторных объектов суффикс строки <tex>p</tex> длины <tex>i</tex> является комбинаторным объектом веса <tex>i</tex>, а его производящей функцией является <tex>z^i</tex>, то есть, по сути, это слагаемое автокорреляционного многочлена <tex>C(z)</tex>. Тогда получаем следующее равенство: <tex>S \times \{p\} = T + \dots + T \times \{p_{k-i} p_{k-i+1} \dots p_{k-1}\} + \dots = T \times C</tex>, где <tex>C</tex> {{---}} комбинаторный класс, соответствующий автокорреляционному многочлену <tex>C(z)</tex>. | Рассмотрим теперь слова вида <tex>\alpha p</tex>. После добавления к слову <tex>\alpha</tex> строки <tex>p</tex> мы точно получим все строки из <tex>T</tex>, но, кроме них, могут также получиться строки, имеющие первое вхождение <tex>p</tex> не в самом конце, следовательно, нельзя утверждать, что <tex>\alpha p</tex> всегда принадлежит <tex>T</tex>. Несложно заметить, что <tex> \alpha p \notin T </tex> тогда и только тогда, когда <tex> \alpha p </tex> имеет 2 перекрывающихся вхождения строки <tex>p</tex>. Для того чтобы <tex> \alpha p </tex> имело 2 перекрывающихся вхождения строки <tex>p</tex> необходимо, чтобы <tex>p</tex> имела какой-нибудь суффикс, совпадающий с каким-нибудь префиксом, иначе говоря, чтобы <tex>p</tex> имело автокорреляционный многочлен <tex>C(z) \ne 1</tex>. В результате выходит, что при добавлении ко всем <tex>\alpha \in S</tex> строки <tex>p</tex> получим все строки из <tex>T</tex>, а также все строки, имеющие 2 перекрывающиеся вхождения строки <tex>p</tex>, иными словами, все строки вида <tex>\gamma p_0p_1 \dots p_i \dots p_{k-1} p_{k-i} p_{k-i+1} \dots p_{k-1}</tex> (или, что то же, <tex>\gamma p_0p_1 \dots p_{i-1} p_1 p_2 \dots p_{k-1}</tex>), где <tex>\gamma</tex> {{---}} некоторый префикс <tex>\alpha</tex>, <tex>i \in \overline{1, k-1}</tex>, {{---}} номер некоторого ненулевого коэффициента автокорреляционного многочлена <tex>C(z)</tex> строки <tex>p</tex>. Нетрудно заметить, что <tex>\gamma p_0p_1 \dots p_i \dots p_{k-1} p_{k-i} p_{k-i+1} \dots p_{k-1}</tex> можно представить как некую строку <tex>t \in T</tex> с приписанным в конец суффиксом строки <tex>p</tex> длины <tex>i</tex>. В контексте комбинаторных объектов суффикс строки <tex>p</tex> длины <tex>i</tex> является комбинаторным объектом веса <tex>i</tex>, а его производящей функцией является <tex>z^i</tex>, то есть, по сути, это слагаемое автокорреляционного многочлена <tex>C(z)</tex>. Тогда получаем следующее равенство: <tex>S \times \{p\} = T + \dots + T \times \{p_{k-i} p_{k-i+1} \dots p_{k-1}\} + \dots = T \times C</tex>, где <tex>C</tex> {{---}} комбинаторный класс, соответствующий автокорреляционному многочлену <tex>C(z)</tex>. | ||
Строка 125: | Строка 194: | ||
:<tex> | :<tex> | ||
\begin{cases} | \begin{cases} | ||
− | \{\epsilon\} + S \times \Sigma = | + | \{\epsilon\} + S \times \Sigma = S + T \\ |
S \times \{p\} = T \times C \\ | S \times \{p\} = T \times C \\ | ||
\end{cases} | \end{cases} |
Текущая версия на 19:24, 4 сентября 2022
Определение: |
Автокорреляционный многочлен (англ. autocorrelation polynomial) для строки
| длины — это многочлен вида , причем , если префикс строки длины совпадает с суффиксом строки длины , иначе :
Содержание
Пример построения автокорреляционного многочлена
Пусть имеем алфавит
, рассмотрим строку . Будем проверять факт совпадения суффикса и префикса строки , используя следующую таблицу:0 | 0 | 1 | 1 | 0 | 0 | c0 = 1 | |||||
0 | 0 | 1 | 1 | 0 | 0 | ||||||
0 | 0 | 1 | 1 | 0 | 0 | c1 = 0 | |||||
0 | 0 | 1 | 1 | 0 | 0 | ||||||
0 | 0 | 1 | 1 | 0 | 0 | c2 = 0 | |||||
0 | 0 | 1 | 1 | 0 | 0 | ||||||
0 | 0 | 1 | 1 | 0 | 0 | c3 = 0 | |||||
0 | 0 | 1 | 1 | 0 | 0 | ||||||
0 | 0 | 1 | 1 | 0 | 0 | c4 = 1 | |||||
0 | 0 | 1 | 1 | 0 | 0 | ||||||
0 | 0 | 1 | 1 | 0 | 0 | c5 = 1 | |||||
0 | 0 | 1 | 1 | 0 | 0 |
В итоге автокорреляционный многочлен строки
равен .Несложно заметить, что
всегда равняется , ибо префикс и суффикс длины являются исходной строкой и, следовательно, всегда совпадают. равняется только в том случае, если первый и последний символы строки совпадают.Примеры решений задач с использованием автокорреляционного многочлена
Задача: |
Пусть | — данный алфавит, — данная непустая строка над алфавитом . Найти производящую функцию множества слов, не содержащих как подстроку.
Пусть
— мощность алфавита , — множество слов, не содержащих как подстроку, — произвольное слово из , — множество слов, содержащих как подстроку только в самом конце. Рассмотрим все слова вида , где — все символы алфавита . Так как слово не содержало подстроку , то после добавления символа новая строка либо так же не содержит как подстроку, и, следовательно, , либо содержит, но только в самом конце, и тогда . Очевидно также, что от удаления последнего символа у слова из всегда получается слово из , то есть, путём добавления ко всем символа мы получим все непустые слова из и . В контексте комбинаторных объектов это выражается в равенстве , где — комбинаторный объект веса 0, соответствующий пустой строке.Рассмотрим теперь слова вида
. После добавления к слову строки мы точно получим все строки из , но, кроме них, могут также получиться строки, имеющие первое вхождение не в самом конце, следовательно, нельзя утверждать, что всегда принадлежит . Несложно заметить, что тогда и только тогда, когда имеет 2 перекрывающихся вхождения строки . Для того чтобы имело 2 перекрывающихся вхождения строки необходимо, чтобы имела какой-нибудь суффикс, совпадающий с каким-нибудь префиксом, иначе говоря, чтобы имело автокорреляционный многочлен . В результате выходит, что при добавлении ко всем строки получим все строки из , а также все строки, имеющие 2 перекрывающиеся вхождения строки , иными словами, все строки вида (или, что то же, ), где — некоторый префикс , , — номер некоторого ненулевого коэффициента автокорреляционного многочлена строки . Нетрудно заметить, что можно представить как некую строку с приписанным в конец суффиксом строки длины . В контексте комбинаторных объектов суффикс строки длины является комбинаторным объектом веса , а его производящей функцией является , то есть, по сути, это слагаемое автокорреляционного многочлена . Тогда получаем следующее равенство: , где — комбинаторный класс, соответствующий автокорреляционному многочлену .В результате имеем 2 уравнения:
В терминах производящих функций эти уравнения выглядят так:
Решим полученную систему относительно
:В итоге получаем искомую производящую функцию множества
слов, не содержащих данную непустую как подстроку:- , где — автокорреляционный многочлен , , .
Задача: |
Пусть | — данный алфавит, — данная непустая строка над алфавитом . Найти производящую функцию множества слов, содержащих как подстроку.
Пусть
— мощность данного алфавита . Ясно, что слов длины над алфавитом мощности будет штук. Тогда производящей функцией множества всех слов над алфавитом мощности будет . Вычтя из нее полученную ранее производящую функцию множества слов, не содержащих как подстроку, получим искомую производящую функцию: , где — автокорреляционный многочлен , .
Задача: |
Пусть | — данный алфавит, — данная непустая строка над алфавитом . Найти производящую функцию множества слов, имеющих единственное вхождение как подстроки в самом конце.
Пусть
— множество слов, содержащих как подстроку только в самом конце. Вернемся к системе уравнений, полученной при решении первой задачи, и воспользуемся найденным выражением :В результате получаем искомую производящую функцию
:- , где — автокорреляционный многочлен , , .
См. также
Источники информации
- Васильев А. Т. Лекции по дискретной математике // Связь ПФ с регулярными языками, автокорреляция и пентагональная теорема Эйлера, 2020. URL: https://youtu.be/EmhScUQwXT0?t=2034.
- Wikipedia — Autocorrelation (words)