Давайте сначала поищем абстрактное определение проблемы: у вас есть тип битового вектора длиной 8 бит, который представляет собой комбинацию ваших 8 входных сигналов. Для каждого сигнала у вас есть значение битового вектора, например 10000000
(первый сигнал) или 00100000
(третий сигнал). Эти значения приведены. Вы хотите сгенерировать следующие значения (я пропустил тривиальные):
r[0] = 10100000
r[1] = 01010000
r[2] = 00101000
r[5] = 00010100
r[8] = 01011010
r[9] = 00111010
r[10] = 00011100
r[11] = 00001101
r[12] = 00100100
r[14] = 01111110
r[15] = 00111100
Теперь мы хотим найти минимум комбинаций (выполнений XOR
) для генерации этих значений. Это проблема оптимизации. Я не буду приводить полное доказательство наименьшего количества XOR
казней здесь, но вот что я получаю:
int i1 = s02 ^ s04; // 01010000
int i2 = s03 ^ s05; // 00101000
int i3 = s04 ^ s06; // 00010100
int i4 = s05 ^ s07; // 00001010
int i5 = s03 ^ s06; // 00100100
int i6 = i1 ^ i4; // 01011010
int i7 = i2 ^ i3; // 00111100
int i8 = s06 ^ s07; // 00000110
r[0] = s01 ^ s03;
r[1] = i1;
r[2] = i2;
r[5] = i3;
r[8] = i6;
r[9] = i7 ^ i8;
r[10] = i3 ^ s05;
r[11] = i4 ^ i8 ^ s08;
r[12] = i5;
r[14] = i6 ^ i5;
r[15] = i7;
14 XOR
с.
Чтобы сформулировать общий алгоритм: вы начинаете с набора S={10000000, 01000000, ... , 00000001}
. Вам нужна весовая функция, которая сообщает вам стоимость вашего набора. Определите это как: количество XOR
с, необходимое для вычисления всех целевых значений из значений в S
без сохранения дополнительных временных значений плюс количество значений в S
минус 8 (начальные значения). Первая часть весовой функции может быть реализована с помощью грубой силы (найдите все возможные комбинации для значения цели, которые используют каждое значение в S
не более одного раза, выберите ту, которая имеет наименьшее количество XOR
выполнений).
Чтобы оптимизировать значение вашей весовой функции, вы объединяете два значения из S
с XOR
и добавляете их к S
, давая S1
. Выберите те два значения, которые предоставляют наименьшее новое значение весовой функции (опять же, это можно определить методом грубой силы). У S1 теперь есть еще одно значение (которое будет временным, например, i
в моем решении). Для создания этого значения требуется один XOR
(поэтому весовая функция считает количество значений в S
).
Продолжайте этот шаг, пока не найдете новое значение для добавления к S
, которое уменьшает значение весовой функции. Результирующий набор содержит начальные значения плюс все временные значения, которые вы должны вычислить. Шаги, которые вы предприняли, расскажут вам, как рассчитать непосредственные значения.
Это жадный алгоритм. Он не обязательно находит минимальное количество XOR
с, но показывает вам простой способ, по крайней мере, получить хорошее решение. Возможно, что алгоритм на самом деле всегда находит лучшее решение, но это должно быть доказано. Если вы хотите быть абсолютно уверенным, вы можете выполнить полный обход всех возможных шагов, которые уменьшают значение весовой функции, начиная с начальных значений S
. Это будет обход дерева, и дерево будет конечным - поскольку значение не может опуститься ниже 0 - так что оно определенно решаемо.