Теоретическое обоснование устойчивости метода
Настоящий раздел посвящён анализу устойчивости предложенного метода маскировки.
Предварительно дадим некоторые вспомогательные определения и теоремы. Пусть

Определение 1. Пусть



Определение 2. Взаимно-однозначная односторонняя функция

Определение 3. p-приближённым алгоритмом решения оптимизационной задачи называется алгоритм, находящий решение не более чем в p раз хуже оптимального решения.
Например рассмотрим задачу S минимизации некоторого функционала f. Пусть A - p -приближённый алгоритм нахождения решения задачи S. Пусть для некоторой реализации задачи оптимальное значение функционала равно X. Тогда алгоритм A найдёт решение задачи, при котором значение f равно Y, причём будет справедливо неравенство

Определение 4. Пусть




Теорема 1. Пусть



Доказательство. Введём обозначение




1. Покажем, что задача СУЩ находится в классе NP. Для этого построим булевскую формулу

Если переменная существенна, то существует такой вектор






2. Покажем, что к задаче СУЩ полиномиально сводится задача ВЫП, которая является NP-полной. Пусть





Определение 5. Пусть







Обозначим через ?f формулу, реализующую функцию f. Пусть Ф - множество формул (потенциально бесконечное) такое, что если ?f - случайно и равновероятно выбранная формула из Ф, а f - функция, которую она реализует, то случайная величина

Множество формул Ф называется семейством непрозрачных предикатов, если для любого полиномиального вероятностного алгоритма A: Ф - > {0,1} выполняются условия

Теорема 2. Если непрозрачные предикаты существуют, то P

Доказательство. Пусть P = NP. Тогда существует полиномиальный алгоритм для решения задачи выполнимости, то есть существует алгоритм A, который для любой формулы ?f за полиномиальное проверит условие f



Мы можем расширить понятие непрозрачного предиката, предположив, что область его определения может быть произвольной (например, множество всех целых чисел, представимых определённым количеством битов). Покажем, что непрозрачные предикаты могут быть реализованы и с использованием указателей, и с использованием массивов.
Теорема 3. Если булевские непрозрачные предикаты существуют, то непрозрачные предикаты, построенные на указателях, существуют.
Доказательство. Пусть f - булевский непрозрачный предикат. Пусть f:



struct s { struct s *neg; struct s *min[2]; struct s *max[2]; };
Создадим в начале работы программы в динамической памяти ссылочную структуру, показанную на рис. 9.
Здесь элемент, на который указывает Pfalse, соответствует логическому значению "ложь", а элемент, на который указывает Ptrue, соответствует логическому значению "истина".
Рассмотрим каждую булевскую операцию и поставим ей в соответствие операцию над указателями в созданной структуре данных.



Рис. 9: Схема построения непрозрачного предиката из указателей
Таким образом, каждому булевскому выражению u мы сопоставили выражение указательного типа e. Поскольку задача определения u

Теорема 4.
Если булевские непрозрачные предикаты существуют, то и непрозрачные предикаты, построенные над массивами, существуют.
Доказательство. Пусть е - непрозрачный предикат над указателями, построенный, как показано в предыдущей теореме. Поставим ему в соответствие массив целого типа a из 10 элементов, заполненный следующим образом: int a[10] = { 5, 0, 0, 5, 0, 0, 0, 5, 5, 5 };
Указательному значению Pfalse соответствует целое значение 0, а указательному значению Ptrue - целое значение 5. Тогда выражения непрозрачного предиката, построенного на указателях, заменяются на индексные выражения по следующим правилам:
Определение 6. Пусть f:










Теорема 5. Пусть даны m, n, f:



Доказательство. Доказательство принадлежности задачи к классу NP аналогично доказательству теоремы 1. Для доказательства NP-полноты заметим, что задача СУЩ является частным случаем данной задачи, если мы выберем I={1,...,n).
Пусть V={v1,...,vk) - множество переменных замаскированной программы. Предположим, что базовый блок представляет собой вычисление булевской функции f:


Пусть Vin






Данной оптимизационной задаче соответствует задача проверки свойств ЗАВ: дано множество булевских переменных V={v1,...,vk}, булевская функция f:







Теорема 6. Задача ЗАВ NP-полна.
Доказательство Принадлежность задачи классу NP следует из того, что для каждого i (1



Для доказательства NP-полноты покажем, как задача СУЩМНОЖ сводится к данной задаче. Пусть f - булевская функция f:


Введём m-1 новую переменную z1,...,zm-1 следующим образом: каждое вхождение xk в формулу для вычисления f заменим выражением xk v z1 v...v zm-1, а выражение - на выражение



Если переменная xk существенна для f, то переменные xk,z1,...,zm-1 окажутся существенными для f1 .
Если переменная xk несущественная для f, то все переменные xk,z1,...,zm-1 несущественны для f1. С другой стороны, если хотя бы одна переменная из множества {xk,z1,...,zm-1} окажется несущественной в f1, то и все переменные этого множества будут несущественными.
В таком случае пусть p=m-1 . Тогда, если задача ЗАВ для функции f1 , множества переменных I и значения p даёт ответ "да", отсюда следует, что все переменные xk,z1,...,zm-1 несущественны, а если ответ "нет", то все эти переменные существенны.
Таким образом задача СУЩМНОЖ сводится к задаче ЗАВ, что показывает NP-полноту последней.
Рассмотрим оптимизационную задачу ЗАВ. Она состоит в нахождении такого Win

Теорема 7. Если P

Доказательство. Пусть существует такое p>1 , что существует полиномиально-ограниченный алгоритм A, который находит множество существенных переменных WinA такое, что pA=|WinA|






Рассмотрим следующую реализацию задачи СУЩ. Пусть f - булевская функция f:


Пусть [x] - минимальное целое число, не меньшее x. Введём l=m*[p] новую переменную z1,...,zl следующим образом: каждое вхождение xk в формулу для вычисления f заменим на выражение xk v z1 v ... v zl , а выражение




Обозначим через Win0 оптимальное решение оптимизационной задачи ЗАВ для формулы f, а через Win1 - оптимальное решение для формулы f1 .
Обозначим WinA решение, найденное алгоритмом A для f1.
Пусть xk - существенная переменная. Тогда Win0 таково, что 1+1




Пусть xk - несущественная переменная. Тогда Win0 таково, что 0






Заметим, что p*(m-1)< l+1 =m*[p]+1 . В зависимости от WinA, полученного полиномиальным p-приближённым алгоритмом A мы можем определить, является ли xk существенной переменной или нет. Следовательно, P=NP.
Определение 7. Назовём "мёртвыми" все инструкции, которые относятся к вычислению несущественных переменных.
Из доказанного выше немедленно следует, что задача выявления мёртвого кода в программе, состоящей из одного базового блока, NP-полна, и, более того, для любого p>1 не существует p-приближённого полиномиального алгоритма выявления мёртвого кода.
Переменные произвольных целых типов могут рассматриваться как набор переменных булевского типа. Например, переменная типа int может рассматриваться как 32 булевские переменные, для доступа к которым используются битовые операции.