ОК, для этого вам нужно знать несколько алгебраических правил о xor
и not
и 0 = false
и 1 = true
.
Прежде всего, xor
удовлетворяет как ассоциативному, так и коммутативному законам. Если мы xor
вместе будем длинной цепью, мы сможем изменить содержание своего сердца.
Далее x xor x = 0
. Когда мы добавим к этому факт, что 0 xor y = y
мы можем просто отбросить совпадающие пары переменных.
Далее, замена. Уравнение вида x1 xor x2 xor ... xor xn = 0
подразумевает, что x1 = x2 xor x3 xor ... xor xn
. Аналогично x1 xor x2 xor ... xor xn = 1
подразумевает, что x1 = 1 xor x2 xor x3 xor ... xor xn
. Эти факты могут быть заменены в других ваших уравнениях. Это может привести к повторным переменным, которые мы можем затем отбросить.
Это означает, что каждое уравнение можно использовать для записи одной переменной в терминах других, а затем ее можно подставить в другие уравнения. Это теперь зависимая переменная. В конце у нас будет одно из трех состояний.
1 = 0
означает, что нет решений.
- Нет уравнений и не осталось переменных. Есть одно решение. Просто подставь назад и получишь.
- Несколько переменных никогда не были исключены, но вы вышли из уравнений. Эти переменные свободны . Вы можете установить их на что угодно и получить ответ. Вы можете также установить их на
1
.
Позвольте мне проиллюстрировать ваши уравнения.
(1) 1 = V1 xor V2 xor V3
(2) 0 = V1 xor V2
(3) 1 = V2 xor V3
С (1)
мы знаем, что:
(4) V1 = 1 xor V2 xor V3
(Примечание: V1
исключено.) Замените (4)
на (2)
и (3), чтобы получить:
(5) 0 = V1 xor V2
= (1 xor V2 xor V3) xor V2
= 1 xor V3
(6) 1 = V2 xor V3
(Обратите внимание, что (6)
является тривиальной заменой.)
С (5)
получаем:
(7) 1 = V3
(Примечание: V3
исключено.) Замените (7)
на (6)
, и мы получим:
(8) 1 = V2 xor V3
= V2 xor 1
С (8)
получаем:
(9) V2 = 1 xor 1 = 0
(примечание, V2
исключено.)
Правила (9)
, (7)
и (4)
исключены V2
, V3
и V1
, поэтому существует одно решение. И это:
(9) V2 = 0
(7) V3 = 1
(4) V1 = 1 xor V2 xor V3 = 1 xor 0 xor 1 = 0
Обратите внимание, что это полностью механическая процедура. На каждом шаге я брал первое оставленное мной уравнение, использовал его для записи одной переменной в терминах других, а затем подставлял ее в другие. На одно уравнение меньше, на одну переменную меньше. Это всегда работает.
Вам нужно будет разработать хорошее представление и код для этого. Но надеюсь, что знание того, что вы пытаетесь сделать, поможет.