NP-полнота задачи о сумме подмножества — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 20 промежуточных версий 4 участников)
Строка 1: Строка 1:
==Формулировка задачи==
+
{{Задача
В '''задаче о сумме подмножества''' (Subset sum problem) входными данными являются набор из <math>n</math> целых чисел <math>S</math> и целое число <math>s</math>. Требуется выяснить, возможно ли выбрать подмножество <math>S' \subseteq S</math> с суммой <math>s</math>:
+
|definition = Дано множество <tex>S</tex>, содержащие <tex>n</tex> целых чисел и целое число <tex>s</tex>. Требуется выяснить, возможно ли выбрать подмножество <tex>S' \subseteq S</tex> с суммой <tex>s</tex>: <br>
<p style="text-align:center;">
+
<tex>\exists S' \subseteq S: \sum\limits_{s_{i} \in S'}{s_{i}} = s</tex>
<math>\exist S' \subseteq S: \sum_{s_{i} \in S'}{s_{i}} = s</math>
+
}}
</p>
+
 
 
==Доказательство NP-полноты==
 
==Доказательство NP-полноты==
Для доказательства того, что Subset sum problem <math>\in</math> [[NPC]], необходимо доказать два факта:
+
Для доказательства того, что '''задаче о сумме подмножества''' (англ. ''Subset sum problem'', <tex>\mathrm{SSP}</tex>) [[NPC | NP-полной]], необходимо доказать два факта:
*Subset sum problem <math>\in</math> [[NP]]  
+
*<tex>\mathrm{SSP} \in</tex> [[NP | <tex>\mathrm{NP}</tex>]]  
*Subset sum problem <math>\in</math>[[NPH]]  
+
*<tex>\mathrm{SSP} \in</tex> [[NPH | <tex>\mathrm{NPH}</tex>]]  
===Доказательство принадлежности к NP===
+
 
В качестве сертификата возьмем удовлетворяющее условию задачи множество <math>S'</math> с суммой <math>s</math>. Очевидно, оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция строится очевидным образом, работает за полиномиальное от размера входа время.
+
===Доказательство принадлежности NP===
===Доказательство принадлежности к NPH===
+
В качестве сертификата возьмем удовлетворяющее условию задачи множество <tex>S'</tex> с суммой <tex>s</tex>. Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов <tex>S'</tex> в множество <tex>S</tex> за время <tex>\left\vert{S'}\right\vert \times \left\vert{S}\right\vert</tex>.
Сведем [[NP-полнота_задачи_о_выполнимости_булевой_формулы_в_форме_3-КНФ|3-CNF_Sat]] к задаче о о сумме подмножества. Пусть задана 3-CNF формула <math>\phi</math> от <math>n</math>
+
 
переменных <math>x_{i}</math>, состоящая из <math>k</math> пар скобок <math>C_{i}</math>. Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию <math>f\!\!:\phi \to (S,s)</math>.
+
===Доказательство принадлежности NPH===
 +
Сведем [[NP-полнота_задачи_о_выполнимости_булевой_формулы_в_форме_3-КНФ|<tex>\mathrm{3CNFSAT}</tex>]] к задаче о сумме подмножества. Пусть задана <tex>\mathrm{3CNF}</tex> формула <tex>\varphi</tex> от <tex>n</tex>
 +
переменных <tex>x_{i}</tex>, состоящая из <tex>k</tex> пар скобок <tex>C_{i}</tex>. Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию <tex>f\!\!:\varphi \to (S,s)</tex>.
 +
 
 
====Построение сводящей функции====
 
====Построение сводящей функции====
Для каждой переменной <math>x_{i}</math> и каждой пары скобок <math>C_{j}</math> создадим по два числа в десятичной системе счисления, каждое длиной <math>n+k</math> цифр. Эти числа образуют <math>S</math>. Также создадим число <math>s</math> длиной <math>n+k</math> цифр. Присвоим каждому разряду полученных чисел (одинаковую для всех чисел) метку, соответствующую либо переменной, либо паре скобок.
+
Для каждой переменной <tex>x_{i}</tex> и каждой пары скобок <tex>C_{j}</tex> создадим по два числа в десятичной системе счисления, каждое длиной <tex>n+k</tex> цифр. Эти числа образуют <tex>S</tex>. Также создадим число <tex>s</tex> длиной <tex>n+k</tex> цифр. Присвоим каждому разряду полученных чисел (одинаковую для всех чисел) метку, соответствующую либо переменной, либо паре скобок.
Метки, соответствующие парам скобок, присвоены <math>k</math> младшим разрядам чисел.
+
Метки, соответствующие парам скобок, присвоены <tex>k</tex> младшим разрядам чисел.
*В числе <math>s</math> все разряды, соответствующие переменным, установим <math>1</math>, а оставшиеся сделаем равными <math>4</math>.
+
*В числе <tex>s</tex> все разряды, соответствующие переменным, установим <tex>1</tex>, а оставшиеся сделаем равными <tex>4</tex>.
*Каждой переменной <math>x_{i}</math> соответствуют два числа из <math>S</math>: <math>v_{i}</math> и <math>u_{i}</math>. Опишем создание этих чисел. Разряд, соответствующий <math>x_{i}</math> установим равным <math>1</math>, а все остальные разряды, соответствующие переменным, установим равными <math>0</math>. Далее, для числа <math>v_{i}</math> установим все разряды, соответствующие парам скобок, содержащих <math>x_{i}</math>, равными <math>1</math>. Во все остальные "скобочные" разряды поставим <math>0</math>. В числе <math>w_{i}</math> установим все разряды, соответствующие парам скобок, содержащих <math>\neg x_{i}</math>, равными <math>1</math>, а во все остальные "скобочные" разряды поставим <math>0</math>.
+
*Каждой переменной <tex>x_{i}</tex> соответствуют два числа из <tex>S</tex>: <tex>v_{i}</tex> и <tex>u_{i}</tex>. Опишем создание этих чисел. Разряд, соответствующий <tex>x_{i}</tex> установим равным <tex>1</tex>, а все остальные разряды, соответствующие переменным, установим равными <tex>0</tex>. Далее, для числа <tex>v_{i}</tex> установим все разряды, соответствующие парам скобок, содержащих <tex>x_{i}</tex>, равными <tex>1</tex>. Во все остальные "скобочные" разряды поставим <tex>0</tex>. В числе <tex>w_{i}</tex> установим все разряды, соответствующие парам скобок, содержащих <tex>\neg x_{i}</tex>, равными <tex>1</tex>, а во все остальные "скобочные" разряды поставим <tex>0</tex>.
*Каждой паре скобок <math>C_{j}</math> соответствуют два числа из <math>S</math>: <math>d_{i}</math> и <math>e_{i}</math>. Оба этих числа содержат <math>0</math> во всех разрядах, кроме соответствующего <math>C_{j}</math>. В этом разряде у <math>d_{i}</math> поставим <math>1</math>, а у <math>e_{i}</math> поставим <math>2</math>.
+
*Каждой паре скобок <tex>C_{j}</tex> соответствуют два числа из <tex>S</tex>: <tex>d_{i}</tex> и <tex>e_{i}</tex>. Оба этих числа содержат <tex>0</tex> во всех разрядах, кроме соответствующего <tex>C_{j}</tex>. В этом разряде у <tex>d_{i}</tex> поставим <tex>1</tex>, а у <tex>e_{i}</tex> {{---}} <tex>2</tex>.
 
====Корректность сводящей функции====
 
====Корректность сводящей функции====
*Получаемое сводящей функцией множество <math>S</math> состоит из <math>2(n+k)</math> десятичных чисел длиной <math>(n+k)</math> каждое, выставление каждого разряда занимает полиномиальное время. Таким образом, сведение выполняется за полиномиальное время.
+
*Получаемое сводящей функцией множество <tex>S</tex> состоит из <tex>2(n+k)</tex> десятичных чисел длиной <tex>(n+k)</tex> каждое, выставление каждого разряда занимает полиномиальное время. Таким образом, сведение выполняется за полиномиальное время.
*Пусть формула <math>\phi</math> выполнима, то есть существует набор значений <math>\{y_{i}\}^{n}_{i=1}:~\phi(y_{1}\ldots y_{n})=1 </math>. И пусть <math>(S,s) = f(\phi)</math>. Тогда в полученном множестве <math>S</math> существует подмножество с суммой <math>s</math>. Действительно, для каждой переменной, если <math>y_{k} = 1</math>, то добавим в <math>S'~ v_{i}</math>. Иначе добавим <math>w_{i}</math>. Теперь <math>S'</math> содержит уже <math>n</math> чисел. Заметим, что для каждого "скобочного"разряда в уже набранной части <math>S'</math> есть не менее одного и не более трех чисел, у которых в данном разряде стоит <math>1</math>. Значит для каждого соответствующего паре скобок <math>C_{j}</math> разряда мы сможем выбрать одно или оба числа <math>d_{j}</math> и <math>e_{j}</math> так, чтобы сумма в данном разряде совпадала с требуемой (стала равна <math>4</math>). Добавим их в <math>S'</math>. Также заметим, что суммы во всех "переменных" разрядах равны <math>1</math>, так как для каждого <math>i</math> выбиралось строго одно число из <math>v_{i}</math> и <math>u_{i}</math>. Значит, <math> \sum_{s_{k} \in S'}{s_{k}} = s</math>.
+
*Пусть формула <tex>\varphi</tex> выполнима, то есть существует набор значений <tex>\{y_{i}\}^{n}_{i=1}:~\varphi(y_{1}\ldots y_{n})=1 </tex>. И пусть <tex>(S,s) = f(\varphi)</tex>. Тогда в полученном множестве <tex>S</tex> существует подмножество с суммой <tex>s</tex>. Действительно, для каждой переменной, если <tex>y_{k} = 1</tex>, то добавим <tex>v_{i}</tex> в <tex>S'</tex>. Иначе добавим <tex>w_{i}</tex>. Теперь <tex>S'</tex> содержит уже <tex>n</tex> чисел. Заметим, что для каждого "скобочного" разряда в уже набранной части <tex>S'</tex> есть не менее одного и не более трех чисел, у которых в данном разряде стоит <tex>1</tex>. Значит для каждого соответствующего паре скобок <tex>C_{j}</tex> разряда мы сможем выбрать одно или оба числа <tex>d_{j}</tex> и <tex>e_{j}</tex> так, чтобы сумма в данном разряде совпадала с требуемой (стала равна <tex>4</tex>). Добавим их в <tex>S'</tex>. Также заметим, что суммы во всех "переменных" разрядах равны <tex>1</tex>, так как для каждого <tex>i</tex> выбиралось строго одно число из <tex>v_{i}</tex> и <tex>u_{i}</tex>. Значит, <tex> \sum\limits_{s_{k} \in S'}{s_{k}} = s</tex>.
*Пусть теперь в наборе <math>S</math> есть подмножество <math>S':~  \sum_{s_{k} \in S'}{s_{k}} = s</math>. Тогда исходная формула <math>\phi</math> выполнима. Действительно, если <math>v_{i} \in S'</math>, то установим переменную <math>x_{i}=1</math>. Если же <math>w_{i} \in S'</math>, то <math>x_{i}=0</math>. Покажем, что <math>\phi(x_{1}\ldots x_{n}) = 1 </math>. Действительно, так как <math> \sum_{s_{k} \in S'}{s_{k}} = s</math>, в каждой паре скобок хотя бы один терм равен <math>1</math>. Значит каждый терм равен <math>1</math>. А тогда и вся <math>\phi = 1</math>.
+
*Пусть теперь в наборе <tex>S</tex> есть подмножество <tex>S':~  \sum\limits_{s_{k} \in S'}{s_{k}} = s</tex>. Тогда исходная формула <tex>\varphi</tex> выполнима. Действительно, если <tex>v_{i} \in S'</tex>, то установим переменную <tex>x_{i}=1</tex>. Если же <tex>w_{i} \in S'</tex>, то <tex>x_{i}=0</tex>. Покажем, что <tex>\varphi(x_{1}\ldots x_{n}) = 1 </tex>. Действительно, так как <tex> \sum\limits_{s_{k} \in S'}{s_{k}} = s</tex>, в каждой паре скобок хотя бы один терм равен <tex>1</tex>. Значит каждый терм равен <tex>1</tex>. А тогда и вся <tex>\varphi = 1</tex>.
 
====Пример сведения====
 
====Пример сведения====
Пусть исходная функция <math>\phi(x_{1} \ldots x_{4}) = (x_{1} \or x_{2} \or \neg x_{3}) \and (\neg x_{1} \or x_{2} \or x_{4})</math>.
+
Пусть исходная функция <tex>\varphi(x_{1} \ldots x_{4}) = (x_{1} \lor x_{2} \lor \neg x_{3}) \land (\neg x_{1} \lor x_{2} \lor x_{4})</tex>.
Пометим разряды следующим образом (слева направо): <math>x_{1},x_{2},x_{3},x_{4},C_{1},C_{2}</math>. Тогда:
+
Пометим разряды следующим образом (слева направо): <tex>x_{1},x_{2},x_{3},x_{4},C_{1},C_{2}</tex>. Тогда:
*<math>v_{1} = 100010</math>
+
*<tex>v_{1} = 100010</tex>
*<math>w_{1} = 100001</math>
+
*<tex>w_{1} = 100001</tex>
 +
 
 +
*<tex>v_{2} = 010011 = 10011</tex>
 +
*<tex>w_{2} = 010000 = 10000</tex>
 +
 
 +
*<tex>v_{3} = 001000 = 1000</tex>
 +
*<tex>w_{3} = 001010 = 1010</tex>
 +
 
 +
*<tex>v_{4} = 000101 = 101</tex>
 +
*<tex>w_{4} = 000100 = 100</tex>
  
*<math>v_{2} = 010011 = 10011</math>
+
*<tex>d_{1} = 000010 = 10</tex>
*<math>w_{2} = 010000 = 10000</math>
+
*<tex>e_{1} = 000020 = 20</tex>
  
*<math>v_{3} = 001000 = 1000</math>
+
*<tex>d_{2} = 000001 = 1</tex>
*<math>w_{3} = 001010 = 1010</math>
+
*<tex>e_{2} = 000002 = 2</tex>
  
*<math>v_{4} = 000101 = 101</math>
+
*<tex>s = 111144</tex>
*<math>w_{4} = 000100 = 100</math>
 
  
*<math>d_{1} = 000010 = 10</math>
+
<tex>S = (\bigcup\limits_{i=1}^{4} v_{i}) \cup (\bigcup\limits_{i=1}^{4} w_{i}) \cup (\bigcup\limits_{i=1}^{2} d_{i}) \cup (\bigcup\limits_{i=1}^{2} e_{i})</tex>
*<math>e_{1} = 000020 = 20</math>
 
  
*<math>d_{2} = 000001 = 1</math>
+
Тогда набору значений <tex>Y = (0,0,0,1):~ \varphi(Y) = 1</tex> соответствует <tex>S' = \{w_{1},~w_{2},~w_{3},~v_{4},~d_{1},~e_{1},~e_{2}\}</tex>. И действительно, <tex>100001 + 10000 + 1010 + 101 + 10 + 20 + 2 = 111144</tex>.
*<math>e_{2} = 000002 = 2</math>
 
  
*<math>s = 111144</math>
+
==См. также==
 +
* [[NP]]
 +
* [[NPH]]
 +
* [[NPC]]
 +
* [[Классы NP и Σ₁]]
 +
* [[3CNFSAT]]
 +
* [[Примеры NP-полных языков]]
  
<math>S = (\cup_{i=1 \ldots 4} v_{i}) \cup (\cup_{i=1 \ldots 4} w_{i}) \cup (\cup_{i=1 \ldots 2} d_{i})  \cup (\cup_{i=1 \ldots 2} e_{i})</math>
+
==Источники информации==
 +
* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" {{---}} Издательство MIT Press, 2009. {{---}} 1086 c. {{---}} ISBN 978-0-262-03384-8 (англ.)
 +
* Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. {{---}} М.: Издательский дом "Вильямс", 2002. {{---}} 423 с. {{---}} ISBN 5-8459-0261-4 (рус.)
  
Тогда набору значений <math>Y = (0,0,0,1):~ \phi(Y) = 1</math> соответствует <math>S' = \{w_{1},~w_{2},~w_{3},~v_{4},~d_{1},~e_{1},~e_{2}\}</math>. И действительно, <math>100001 + 10000 + 1010 + 101 + 10 + 20 + 2 = 111144</math>.
+
[[Категория: Теория сложности]]
 +
[[Категория: Детерминированные и недетерминированные вычисления, сложность по времени и по памяти]]
 +
[[Категория: Примеры NP-полных языков]]

Текущая версия на 19:22, 4 сентября 2022

Задача:
Дано множество [math]S[/math], содержащие [math]n[/math] целых чисел и целое число [math]s[/math]. Требуется выяснить, возможно ли выбрать подмножество [math]S' \subseteq S[/math] с суммой [math]s[/math]:
[math]\exists S' \subseteq S: \sum\limits_{s_{i} \in S'}{s_{i}} = s[/math]


Доказательство NP-полноты

Для доказательства того, что задаче о сумме подмножества (англ. Subset sum problem, [math]\mathrm{SSP}[/math]) NP-полной, необходимо доказать два факта:

Доказательство принадлежности NP

В качестве сертификата возьмем удовлетворяющее условию задачи множество [math]S'[/math] с суммой [math]s[/math]. Оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция проверит вхождение всех элементов [math]S'[/math] в множество [math]S[/math] за время [math]\left\vert{S'}\right\vert \times \left\vert{S}\right\vert[/math].

Доказательство принадлежности NPH

Сведем [math]\mathrm{3CNFSAT}[/math] к задаче о сумме подмножества. Пусть задана [math]\mathrm{3CNF}[/math] формула [math]\varphi[/math] от [math]n[/math] переменных [math]x_{i}[/math], состоящая из [math]k[/math] пар скобок [math]C_{i}[/math]. Будем считать, не умаляя общности, что ни одна пара скобок не содержит одновременно переменную и ее отрицание. Также предположим, что каждая переменная входит хотя бы в одну пару скобок. Построим сводящую функцию [math]f\!\!:\varphi \to (S,s)[/math].

Построение сводящей функции

Для каждой переменной [math]x_{i}[/math] и каждой пары скобок [math]C_{j}[/math] создадим по два числа в десятичной системе счисления, каждое длиной [math]n+k[/math] цифр. Эти числа образуют [math]S[/math]. Также создадим число [math]s[/math] длиной [math]n+k[/math] цифр. Присвоим каждому разряду полученных чисел (одинаковую для всех чисел) метку, соответствующую либо переменной, либо паре скобок. Метки, соответствующие парам скобок, присвоены [math]k[/math] младшим разрядам чисел.

  • В числе [math]s[/math] все разряды, соответствующие переменным, установим [math]1[/math], а оставшиеся сделаем равными [math]4[/math].
  • Каждой переменной [math]x_{i}[/math] соответствуют два числа из [math]S[/math]: [math]v_{i}[/math] и [math]u_{i}[/math]. Опишем создание этих чисел. Разряд, соответствующий [math]x_{i}[/math] установим равным [math]1[/math], а все остальные разряды, соответствующие переменным, установим равными [math]0[/math]. Далее, для числа [math]v_{i}[/math] установим все разряды, соответствующие парам скобок, содержащих [math]x_{i}[/math], равными [math]1[/math]. Во все остальные "скобочные" разряды поставим [math]0[/math]. В числе [math]w_{i}[/math] установим все разряды, соответствующие парам скобок, содержащих [math]\neg x_{i}[/math], равными [math]1[/math], а во все остальные "скобочные" разряды поставим [math]0[/math].
  • Каждой паре скобок [math]C_{j}[/math] соответствуют два числа из [math]S[/math]: [math]d_{i}[/math] и [math]e_{i}[/math]. Оба этих числа содержат [math]0[/math] во всех разрядах, кроме соответствующего [math]C_{j}[/math]. В этом разряде у [math]d_{i}[/math] поставим [math]1[/math], а у [math]e_{i}[/math][math]2[/math].

Корректность сводящей функции

  • Получаемое сводящей функцией множество [math]S[/math] состоит из [math]2(n+k)[/math] десятичных чисел длиной [math](n+k)[/math] каждое, выставление каждого разряда занимает полиномиальное время. Таким образом, сведение выполняется за полиномиальное время.
  • Пусть формула [math]\varphi[/math] выполнима, то есть существует набор значений [math]\{y_{i}\}^{n}_{i=1}:~\varphi(y_{1}\ldots y_{n})=1 [/math]. И пусть [math](S,s) = f(\varphi)[/math]. Тогда в полученном множестве [math]S[/math] существует подмножество с суммой [math]s[/math]. Действительно, для каждой переменной, если [math]y_{k} = 1[/math], то добавим [math]v_{i}[/math] в [math]S'[/math]. Иначе добавим [math]w_{i}[/math]. Теперь [math]S'[/math] содержит уже [math]n[/math] чисел. Заметим, что для каждого "скобочного" разряда в уже набранной части [math]S'[/math] есть не менее одного и не более трех чисел, у которых в данном разряде стоит [math]1[/math]. Значит для каждого соответствующего паре скобок [math]C_{j}[/math] разряда мы сможем выбрать одно или оба числа [math]d_{j}[/math] и [math]e_{j}[/math] так, чтобы сумма в данном разряде совпадала с требуемой (стала равна [math]4[/math]). Добавим их в [math]S'[/math]. Также заметим, что суммы во всех "переменных" разрядах равны [math]1[/math], так как для каждого [math]i[/math] выбиралось строго одно число из [math]v_{i}[/math] и [math]u_{i}[/math]. Значит, [math] \sum\limits_{s_{k} \in S'}{s_{k}} = s[/math].
  • Пусть теперь в наборе [math]S[/math] есть подмножество [math]S':~ \sum\limits_{s_{k} \in S'}{s_{k}} = s[/math]. Тогда исходная формула [math]\varphi[/math] выполнима. Действительно, если [math]v_{i} \in S'[/math], то установим переменную [math]x_{i}=1[/math]. Если же [math]w_{i} \in S'[/math], то [math]x_{i}=0[/math]. Покажем, что [math]\varphi(x_{1}\ldots x_{n}) = 1 [/math]. Действительно, так как [math] \sum\limits_{s_{k} \in S'}{s_{k}} = s[/math], в каждой паре скобок хотя бы один терм равен [math]1[/math]. Значит каждый терм равен [math]1[/math]. А тогда и вся [math]\varphi = 1[/math].

Пример сведения

Пусть исходная функция [math]\varphi(x_{1} \ldots x_{4}) = (x_{1} \lor x_{2} \lor \neg x_{3}) \land (\neg x_{1} \lor x_{2} \lor x_{4})[/math]. Пометим разряды следующим образом (слева направо): [math]x_{1},x_{2},x_{3},x_{4},C_{1},C_{2}[/math]. Тогда:

  • [math]v_{1} = 100010[/math]
  • [math]w_{1} = 100001[/math]
  • [math]v_{2} = 010011 = 10011[/math]
  • [math]w_{2} = 010000 = 10000[/math]
  • [math]v_{3} = 001000 = 1000[/math]
  • [math]w_{3} = 001010 = 1010[/math]
  • [math]v_{4} = 000101 = 101[/math]
  • [math]w_{4} = 000100 = 100[/math]
  • [math]d_{1} = 000010 = 10[/math]
  • [math]e_{1} = 000020 = 20[/math]
  • [math]d_{2} = 000001 = 1[/math]
  • [math]e_{2} = 000002 = 2[/math]
  • [math]s = 111144[/math]

[math]S = (\bigcup\limits_{i=1}^{4} v_{i}) \cup (\bigcup\limits_{i=1}^{4} w_{i}) \cup (\bigcup\limits_{i=1}^{2} d_{i}) \cup (\bigcup\limits_{i=1}^{2} e_{i})[/math]

Тогда набору значений [math]Y = (0,0,0,1):~ \varphi(Y) = 1[/math] соответствует [math]S' = \{w_{1},~w_{2},~w_{3},~v_{4},~d_{1},~e_{1},~e_{2}\}[/math]. И действительно, [math]100001 + 10000 + 1010 + 101 + 10 + 20 + 2 = 111144[/math].

См. также

Источники информации

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein "Introduction to Algorithms, 3rd Edition" — Издательство MIT Press, 2009. — 1086 c. — ISBN 978-0-262-03384-8 (англ.)
  • Хопкрофт Дж., Мотвани Р., Ульман Дж. Введение в теорию автоматов, языков и вычислений. 2-е издание. — М.: Издательский дом "Вильямс", 2002. — 423 с. — ISBN 5-8459-0261-4 (рус.)