Ответ 1
Пересчет как ограниченная проблема с линейным программированием
Задача может быть переформулирована как следующая ограниченная задача ILP (целочисленное линейное программирование).
Let x1,...,xN be as in the original problem, i.e. the goal is to minimize(a1+...+aN)
under the conditions (x1+a1) XOR ... (xN+aN) = 0, a1,...,aN >= 0.
The following is than an equivalent bounded ILP:
Find b[k,i] (0 <= k <= K, 1 <= i <= N) and s[k] (0 <= k <= K) such that
(A) b[k,i] in {0, 1} for all i=1..n, k=0..K,
(B) s[k] is an integer >= 0 for all k=0..K,
(C) sum(b[k,i]*2^k, k=0..K) >= x[i] for all i = 1..N,
(D) sum(b[k,i], i=1..N) = 2*s[k] for all k = 0..K
and minimize
sum(b[k,i]*2^k, i=1..n, k=0..K).
From a solution of the bounded ILP the ai are obtained by
a[i] = sum(b[k,i]*2^k, k=0..(K-1)) - x[i]
b [k, i] является просто k-м битом двоичного представления (xi + ai) здесь (условия (A) и (C)). Чтобы сделать общий XOR zero, четное число b [k, i] должно быть равным 1 для каждого k. Это представлено условиями (B) и (D). (Заметим, что левая сумма в (D) должна быть четной, если она равна 2 * s [k], а s [k] - целое число).
K, то есть количество бит (плюс одно, фактически), необходимое для представления всех (xi + ai), должно быть определено заранее. Выбирая K такой, что все xi являются < 2 ^ K должно быть достаточно, то есть ai на один бит больше самого большого xi. Но выбор большего K не имеет значения, верхние биты просто выйдут как ноль. Если K выбран до малого, ILP не будет иметь решения.
Существование решения
Игнорируя условие минимальности, проблему можно пересчитать как
Учитывая x, y z с x <= y, найдем a и b такие, что (x + a) XOR (y + b) = z
Учитывая экземпляр исходной задачи, с N >= 2. Пусть x = x1, y = x2, z = (x3 XOR x4 XOR... xn). Если вы найдете подходящие a и b, установите a1 = a, a2 = b, a3 =... = an = 0, чтобы получить решение исходной задачи.
Упрощенная задача решается (опять же, игнорируя минимальность) на
- Если (y XOR z) >= x, то a: = ((y XOR z) - x), b: = 0 - решение (*)
- Если (x XOR z) >= y, то a: = 0, b: = ((x XOR z) - y) является решением (*)
- В противном случае выберите a такое, что (x + a) XOR z >= y. Такое a всегда существует, вы можете, например, дать a: = 2 ^ k с 2 ^ k > max (x, y, z). Установка b: = ((x + a) XOR z) - y) дает решение (*)
(*) Чтобы убедиться, что это действительно решения, вам просто нужно применить немного алгебры. Например, в случае (1) после подстановки a и b вы получаете: (x + (y XOR z) -x) XOR (y + 0). Что идентично: (y XOR z) XOR y и, следовательно, к: z. что и требовалось доказать Случай (2) работает аналогичным образом. В случае (3) вы получаете: (x + a) XOR (y + ((x + a) XOR z) -y) = (x + a) XOR ((x + a) XOR z) = z.
Это показывает, что при N >= 2 решение всегда существует.
Независимо от того, минимальны ли эти решения, я не знаю. В случае (3) это, очевидно, зависит от выбора a, поэтому, по крайней мере, вам нужно будет найти оптимальный выбор для a. Возможно также, что исходная проблема позволяет решать меньшие решения, чем упрощенная задача. Anway, может быть, это повторение поможет кому-то разобраться в полном решении.
Кстати, тот факт, что исходные проблемы по существу оставляют вам полную свободу того, как "распространять" значения коррекции ai по xi, заставляет меня задаться вопросом, не является ли это эквивалентом какой-либо проблемы с рюкзаком. Если это так, поиск минимального решения вполне может быть NP-трудным.
Наблюдения относительно минимальности
Возьмем следующую задачу:
(1+a1) XOR (3+a2) XOR (6+a3) = 0
В двоичном формате это
(001b+a1) XOR (011b+a2) XOR (110b+a3) = 0
Остаток для a1 = a2 = a3 = 0 равен 001b XOR 011b XOR 110b = 100b. Очевидным решением является, таким образом, a1 = 4, a2 = 0, a3 = 0. Или, альтернативно, a1 = 0, a2 = 4, a3 = 0. Это решение не является минимальным, хотя следующее решение меньше
a1=1, a2=1, a3=0
Он также минимален, так как все меньшие решения могут иметь только один ненулевой ai, а все члены (2 XOR 3 XOR 6), (1 XOR 4 XOR 6), (1 XOR 3 XOR 7) -нуль.
Это показывает, что алгоритм gree, который работает снизу (т.е. младший бит) вверх, может работать, поскольку такой алгоритм будет пропускать первые два бита, так как их остаток равен нулю изначально.
Это также показывает, что вы не можете выбрать определенный ненулевой бит k из остатка и попытаться его обнулить, добавив 2 ^ k к одному из xi. Иногда вам нужно добавить его к нескольким xi, чтобы найти минимальное решение.
Это подталкивает меня немного дальше к вере в то, что найти минимальное решение - довольно сложная проблема.