информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100Страшный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / FAQ / теория
FAQ
главная
операционные системы
sysadmin
программирование
теория
общие вопросы





Факторизация (factoring) и выполнимость (satisfability)
lime
Опубликовано: dl, 13.11.04 22:54

Представление.

Факторизация - разложение целого числа на два целых множителя.

Обозначим числа, которыми будем оперировать следующим образом: Z = X*Y.

С самого начала следует определиться с тем, в каком виде следует представить числа. Ответ очевиден - в двоичной. Именно эта система счисления дает желаемые исходные значения логических переменных - нули и единицы.

Заранее договоримся, что исходные числа будем обозначать заглавными буквами, а их разряды - прописными.

Таким образом, исходное выражение Z = X*Y примет вид z1z2z3...zn = x1x2x3...xn * y1y2y3...yn.

Разрядность всех чисел одинакова не случайно. Это единственный способ получить ВСЕ ВОЗМОЖНЫЕ РАЗЛОЖЕНИЯ исходного числа вплоть до тривиального, когда один из сомножителей равен 1. В качестве отступления можно сказать, что в случае, если мы хотим получить все возможный разложения, за исключением тривиального, следует вспомнить, что число 1 - это максимальное число, которое можно записать в двоичном виде одним разрядом. В этом случае исходное выражение примет вид z1z2z3...zn = x1x2x3...xn-1 * y1y2y3...yn-1.

Школа.

Для сведения задачи факторизация к задаче выполнимость следует во-первых разобраться с механизмом произведения двух целых чисел. Для простоты рассуждений и большей наглядности ограничим значения чисел шестью разрядами.


                xxxxxx (x1x2x3x4x5x6)
                yyyyyy (y1y2y3y4y5y6)
           -----------------
                xxxxxx *y6
               xxxxxx  *y5
              xxxxxx   *y4
             xxxxxx    *y3
            xxxxxx     *y2
           xxxxxx      *y1
           -----------------
           00000zzzzzz

В дальнейших рассуждениях будем использовать термины "строка" и "столбец" (по аналогии со школьными). В данном примере индексы разрядов при числах не указаны. Это сделано для того, чтобы "не поехали" те самые "столбцы". Предлагается додумывать их самостоятельно, а для подсказки использовать числа в скобках (справа от множителей).

Как помнится из школы произведение - это множество сложений одного из сомножителей (в нашем случае X), который предварительно умножен на один из разрядов второго сомножителя (yi) и смещен на соответствующее число разрядов влево.

При суммировании чисел, представленных в двоичной системе действуют следующие правила: число X переписывается в каждой строке в первозданном виде, а разряды числа Y в данном случае являются своеобразной маской для данных строк: если yi=1, значит X в данной строке записывается "как есть"; если yi=0, значит значения всех разрядов в данной строке равно 0.

Сведение.

Смысл сведения задачи факторизация к задаче выполнимость заключается в формировании логической формулы, которая будет выполнима тогда и только тогда, когда исходное число - не простое. Т.е. необходимо сформировать такую булеву формулу f(z1, z2, ..., x1, x2, ..., y1, y2, ...), которая будет выполнима, если Z=X*Y. При этом значения переменных найденного выполняющего набора будут являться решением исходной задачи факторизации числа.

Видим, что для реализации произведения логическими средствами следует логически интерпретировать множество сумм с масками, переносы и получаемый результат. Рассмотрим механизм суммирования более детально. Начнем с младших разрядов числа Z. Нам известно значение z6 (это разряд исходного числа). Оно получается как x6*y6 (по построению). Рассматривая все возможные варианты исходных данных и результатов сложения, получаем два правила:
1. Если один из сомножителей равен 0, значит и результат равен 0.
2. Если оба сомножителя равны 1, значит результат равен 1.

Теперь самое время вспомнить задачу, к которой мы собираемся сводить нашу проблему. Задача выполнимость по своей формулировке является множеством ограничений на одновременное появление в выполняющем наборе некоторых значений переменных. Каждый терм формулы задает такое ограничение. Для примера: терм (k1 or !k3 or k7) говорит о том, что никакой выполняющий набор не может содержать одновременно инверсию всех переменных данного терма, т.е. недопустимо !k1, k3, !k7 в одном наборе.

Для сведения сформулированных выше правил произведений к термам формулы необходимо понять, какие значения множителей и результата произведения взаимоисключают друг друга и на этой основе следует сформулировать правила конфликтных ситуаций. В результате получим:
1. Если один из множителей равен 0, то результат не может быть равен 1.
2. Если оба множителя равны 1, то результат не может быть равен 0.

Теперь на основе этих правил запишем явные конфликты с использованием переменных:
1. Запрещены сочетания !x6 z6, !y6 z6.
2. Запрещены сочетания y6 x6 !z6 .

И в заключение преобразуем каждый выписанный конфликт в терм.
1. (x6 !z6), (y6 !z6).
2. (!y6 !x6 z6)

К полученным термам остается добавить только значение переменной z6. Если младший разряд исходного числа имеет значение 1, значит допишем к формуле терм z6 и !z6 в противном случае.

Разумеется, для подобного произведения, результат которого известен, нет смысла составлять формулу в подобном виде - она несколько избыточна. Это было сделано для наглядности и понимания. Теперь рассмотрим пример получения термов для второго разряда числа Z.

Сложность заключается в том, что в данном случае мы должны просуммировать два разряда числа X, учитывая их маски. Решая подобную проблему в лоб можно получить довольно громоздкие выражения. Поэтому предлагается следующее. Вводим понятие временной суммы. Это будет некоторая дополнительно введенная переменная, задача которой - хранить временный результат суммирования всех вышележащих разрядов с учетом масок. Будем обозначать такие переменные как ti.

Итак, имеем (это второй столбец нашей суммы):

               x5 *y6
               x6 *y5
	      -------
	       z5
	       p1

p1 - это перенос в следующий разряд. Как известно при суммировании такое иногда случается.

1. Вводим переменную t1. t1=x5 * y6.

2. Вводим переменную t2. t2=x5 * y5.

3. z5=t1 + t2.

4. p1=1, если t1=1 и t2=1; p1=0, если t1=0 или t2=0

Для первого и второго пунктов термы формируются согласно примеру выше.

Для третьего пункта получим (!t1 or t2 or z5) (t1 or !t2 or z5) (!t1 or !t2 or !z5) (t1 or t2 or !z5)

Для четвертого пункта получим (!t1 or !t2 or p1) (t1 or !p1) (t2 or !p1).

Для формирования термов для третьего и более старших разрядов действует новое правило: все переносы из предыдущих разрядов рассматриваются в данном столбце как еще одно слагаемое, не имеющее маски. Соответствующим образом строятся термы.

Все множество сформированных термов даст нам логическую формулу, отвечающую тем требованиям, которые мы к ней предъявляли в самом начале, а именно - формула будет выполнима тогда и только тогда, когда исходное число Z - непростое и множество решений данной формулы будет содержать множество разложений исходного числа на множители, которые могут быть сформированы из выполняющего набора подбором соответствующих переменных. Данное следует из построения.

Сложность.

Данное сведение изобилует множеством дополнительно введенных перменных. Делалось это для наглядности и с уверенностью можно сказать, что существует куда более эффективное сведение. В качестве дополнительной информации ниже приводится зависимость размера задачи факторизация и получаемый при этом размер булевой формулы для другого алгоритма.
n Факторизуемое число
vars Количество переменных в формуле
clauses Количество термов в формуле
bits Разрядность факторизуемого числа в двоичном представлении
factors Множители

n vars clauses bits factors

9 35 159 4 3 3
49 70 362 6 7 7
169 117 645 8 13 13
961 176 1008 10 31 31
3721 247 1451 12 61 61
16129 330 1974 14 127 127

3 12 36 2 3
7 17 61 3 7
15 35 159 4 3 5
31 43 204 5 31
63 70 362 6 3 3 7
127 81 427 7 127
255 117 645 8 3 5 17
511 131 730 9 131
1023 176 1008 10 3 11 31

В качестве заключения можно сказать, что различными авторами предложено несколько вариантов подобного сведения. Сложность простых алгоритмов (похожих на предложенный) составляет порядка O(n^2), где n - количество разрядов исходного факторизуемого числа в двоичном представлении. Более изощренные алгоритмы минимизируют сложность до значения O(n^1,5). Показатель степени - константа. Безусловный полином.



lime for bugtraq.ru



обсудить  |  все отзывы (26)

[12165]



Rambler's Top100
Рейтинг@Mail.ru



  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach