Математически говоря, XOR двух битов может рассматриваться как сложение в поле F_2.
Вы хотите решить набор уравнений в поле F_2.Для четырех битовых полей с битами (a_0, a_1, ... a_n), (b_0, b_1, ..., b_n), (c_0, c_1, ..., c_n), (r_0, r_1, ..., r_n), вы получите уравнения:
x * a_0 + y * b_0 + z * c_0 = r_0
x * a_1 + y * b_1 + z * c_1 = r_1
...
x * a_n + y * b_n + z * c_n = r_n
(где вы ищете x, y, z).
Вы можете запрограммировать это как простую целочисленную линейную задачу с glpk
, возможно lp_solve
(но я не помню, подойдет ли это).Однако они могут работать очень медленно, поскольку пытаются решить гораздо более общую проблему.
После некоторого поиска в Google, кажется, эта страница может быть хорошим началом поиска кода.Из описаний видно, что Dixon
и LinBox
могли бы подойти.
В любом случае, я думаю, что вопрос в mathoverflow может дать вам более точные ответы.Если вы это сделаете, пожалуйста, свяжите ваш вопрос здесь.
Обновление: Sagemath использует M4RI для решения этой проблемы.Это делает его (для меня) очень хорошей рекомендацией.