ЛИТЕРАТУРА
1. Зубков А. М. Рекуррентные формулы для распределений функционалов от дискретных случайных величин // Обозр. прикл. промышл. математики. 1996. Т. 3. Вып. 4. С.567-573.
2. Зубков А. М. Методы расчета распределений сумм случайных величин // Труды по дискретной математике. М.: Физматлит, 2002. Т. 5. С. 51-60.
3. Зубков А. М. Вычисление распределений чисел компонент и циклических точек случайного отображения // Математические вопросы криптографии. 2011. Т. 1. №2. С. 5-18.
4. Filina M. V. and Zubkov A. M. Exact computation of Pearson statistics distribution and some experimental results // Austrian J. Statistics. 2008. V. 37. No. 1. P. 129-135.
5. Filina M. V. and Zubkov A. M. Tail properties of Pearson statistics distributions. // Austrian J. Statistics. 2011. V. 40. No. 1&2. P. 47-54.
УДК 004.432.2
ВЫЧИСЛЕНИЕ СОВЕРШЕННОЙ НЕЛИНЕЙНОСТИ БУЛЕВОЙ ФУНКЦИИ НА ГРАФИЧЕСКОМ ПРОЦЕССОРЕ
А. В. Медведев
Для криптографических приложений представляют интерес функции с высокими показателями «нелинейности», потому что они труднее поддаются анализу. Существует несколько характеристик нелинейности функции, одна из них — совершенная нелинейность [1], которая показывает, насколько функция удалена от класса функций с линейной структурой. Разработан алгоритм вычисления совершенной нелинейности произвольной булевой функции для параллельной реализации на видеокартах NVIDIA, поддерживающих технологию CUDA [2].
Обозначим через P2 (n) множество всех булевых функций от n ^ 1 переменных и X — область их определения, X = {0,1}n.
Определение 1. Для функции f £ P2(n) и набора a £ X функция f (x) = = f (x) ® f (x ® a) называется производной функции f по направлению a.
Определение 2. Говорят, что булева функция f имеет линейную структуру, если существует вектор a £ X \ {0n}, что f = const, т. е. f = fa либо —f = fa. Множество всех функций в P2(n), имеющих линейную структуру, обозначается LS(n).
Определение 3. Число CNf = d(f,LS(n)) = min d(f, g) называется совершен-
gELS(n)
ной нелинейностью функции f. Здесь d(f, g) —расстояние между функциями f и g, равное количеству наборов, на которых они различаются.
Существует ряд способов вычисления CNf; наиболее подходящим для параллельной реализации оказался следующий:
CNf = гmin(w(f),2n - w(f ))/2,
aeX\{0n}
где w(.) —вес булевой функции. Основную трудность здесь представляет вычисление функции f (x ф a). Проблема состоит в том, что CUDA предполагает запуск большого числа нитей параллельно [3], но их совокупная память ограничена (3 Гб для Tesla C2050), поэтому невозможно хранить значения f (x ф a) для каждой нити, и вес производной вычисляется «по частям» (алгоритм 1).
Вектор значений булевой функции от n переменных представляется в памяти массивом 2N-битных ячеек — элементов базового типа языка C/C+—+ (в реализации используется 32-битный тип long int, N = 5). Количество ячеек определяется по формуле m = 2n-N. Далее будем обозначать i-ю ячейку функции f через /¿.
Алгоритм 1. Алгоритм вычисления w(f)
Вход: f, a Выход: w(f)
w ^ 0
Для i = 0,..., m — 1
w ^ w + weight(fi(x) ® fi(x ® a))
Вернуть w = w(f)
Данный алгоритм не требует вычисления f (х ф а) в явном виде, но надо уметь получать і-ю ячейку функции f (хфа). Заметим, что вектор значений f (хфа) получается из вектора значений функции f (х) перестановкой бит по определённому закону. Например, если аі = 1, то меняются местами половины вектора значений исходной функции, иначе ничего не меняется; если а2 = 1, то меняются между собой половины внутри половин всего вектора, иначе они не меняются, и т. д. рекурсивно.
Алгоритм 2 принимает на вход вектор а и номер і, а на выходе выдает номер і ячейки f (х), который соответствует ячейке с номером і в f (х ф а).
Алгоритм 2. Алгоритм вычисления номера ячейки для функции f (х ф а) Є Р2(п) Вход: і, а = а1 ... ап, т — количество ячеек
Выход: і, такой, что /¿(х) = fj (х ф а) (без учета перестановки бит внутри ячейки)
I ^ 0 // инициализация левой границы интервала і' ^ і
іи> ^ т>> 1 // половина длины текущего интервала Для к = 1,... , п Если і < I + ш, то Если ак = 1, то і ^ і' + ш иначе I ^ I + іи>
Если ак = 1, то і' ^ і' - га іи> ^ іи> >> 1 Конец цикла.
Вернуть і
Перестановка бит внутри ячеек происходит по такому же закону, но в реализации используется более быстрый способ на основе битовых операций.
Ниже приведены результаты экспериментов по вычислению CNf при разной степени распараллеливания. Испытания проводились на компьютере Intel(R) Core(TM)2 Quad Q6700 2,66 ГГц с установленной видеокартой NVIDIA Tesla C2050. На CPU алгоритм реализован в двух вариантах — последовательном и с использованием библиотеки
ОрепМР, которая позволяет задействовать все ядра центрального процессора (в нашем случае 4 ядра). В таблице показано время работы (в секундах) соответствующих реализаций.
CPU GPU
n Посл. алг. OpenMP CUDA
15 1,02 0,25 0,01
16 4,13 1,03 0,04
17 16,9 4,22 0,15
18 69,9 17,4 0,65
Таким образом, реализация для видеокарты с использованием технологии CUDA оказалась быстрее, чем последовательный алгоритм, примерно в 106 раз, а в сравнении с параллельной реализацией на центральном процессоре — примерно в 26,5 раз.
ЛИТЕРАТУРА
1. Агибалов Г. П. Избранные теоремы начального курса криптографии. Томск: Изд-во НТЛ, 2005.
2. http://developer.download.nvidia.eom/compute/DevZone/docs/html/C/doc/CUDA_C_ Programming_Guide.pdf
3. http://developer.download.nvidia.eom/eompute/DevZone/does/html/C/doe/CUDA_C_ BestPraetiees.pdf
УДК 519.7
О СХОДИМОСТИ ГИБРИДНОГО SAT+ROBDD-ЛОГИЧЕСКОГО ВЫВОДА1
А. А. Семенов, А. С. Игнатьев
Проблема обращения дискретных функций возникает во многих теоретических и прикладных областях современной кибернетики. Пусть f : {0, 1}* ^ {0, 1}* — вычислимая детерминированным образом за полиномиальное от длины входа время дискретная функция. Если A(f) — некоторый полиномиальный алгоритм, вычисляющий f, то A(f) задает семейство функций вида fn : {0,1}n ^ {0,1}* , n £ N. Задача обращения произвольной функции fn из данного семейства состоит в следующем: известно у £ Range fn, требуется, зная текст программы A(f), найти произвольный x £ {0,1}n, такой, что fn(x) = у. Описанная задача является вычислительно трудной в общей постановке — она не может быть решена за полиномиальное время в предположении, что P = NP. Поскольку различные практические задачи могут рассматриваться как частные случаи сформулированной, разработка вычислительных алгоритмов для её решения является актуальной областью.
Описанную проблему можно сводить к SAT-задачам [1], используя эффективные алгоритмы трансляции программ в булевы уравнения (см., например, [2]). Для решения получаемых SAT-задач можно использовать различные методы, лучшие из которых базируются на алгоритме DPLL. В КНФ, получаемой в процессе трансляции алгоритма A(fn), можно выделить множество Xn, состоящее из n так называемых «переменных входа» рассматриваемой функции. Мощность данного множества равна n. В [3] говорится о том, что Xn является «сильной формой» множества-лазейки для алгоритма DPLL, который применяется к КНФ C(fn), кодирующей задачу обращения fn
хРабота выполнена при поддержке гранта РФФИ № 11-07-00377-a.