Дано это:

  • Набор примерно из 800 псевдослучайных 64-разрядных целых чисел без знака.

    2910088619203924111,  8611579852607706360,  10743563285097812384,
    6712886796489718596, 17298387234720051377,  12467698534877227789,
    3782074590599432740,  1419307814092336225,   7951308495700413025,
    ...
  • Целевое целое число 17358988457627394926 того же вида, в большинстве случаев не входящее в набор.

Гарантируется, что целевое целое число было получено путем операции XOR над подмножеством до 50 (или меньше) целых чисел из набора вместе.

Какой алгоритм является наиболее эффективным для поиска подмножества (любого, не обязательно наименьшего) целых чисел, которые составляют целевое целое при XOR?

Если NP-жесткий, что будет основной идеей, чтобы доказать это?

2
Niklas 7 Окт 2012 в 03:50
1
Я отказываюсь от своего последнего комментария ... если все, что вам нужно, это решение (а не лучшее решение), это не сложно для NP.
 – 
nneonneo
7 Окт 2012 в 04:04
@nneonneo: Спасибо. Я уточнил в вопросе, что подойдет любое решение.
 – 
Niklas
7 Окт 2012 в 04:07
Связана ли эта проблема с шифрованием? Можете ли вы привести пример того, как и почему вам удается получить целевое целое число, которое является результатом операции xor из набора значений в массиве. У вас есть идея, как применить к этой проблеме метод исключения Гаусса?
 – 
Bob Bryan
7 Окт 2012 в 21:52
@BobBryan: Да. Играл с написанием шахматной библиотеки на питоне. Для эффективного поиска Zobrist-хеши могут использоваться в качестве идентификаторов позиций. См. github.com/niklasf/python-chess/blob. / master / chess /… для примера реализации. Мне было интересно, могу ли я отменить эту хеш-функцию.
 – 
Niklas
7 Окт 2012 в 23:56
Поскольку кажется, что у вас есть доступ к коду хеш-функции, с практической точки зрения нельзя просто сохранить индексы в хеш-функции в массиве, который впоследствии можно будет использовать для их легкого извлечения? Если они вам нужны часто, то, скорее всего, будет гораздо эффективнее сделать это таким образом. Я подозреваю, что использование исключения Гаусса может быть простым, если вы использовали его раньше, но если нет, то его будет сложно реализовать. Возможно, @nneonneo может предоставить вам несколько примеров кода, если вы действительно хотите пойти по этому пути.
 – 
Bob Bryan
8 Окт 2012 в 05:09

1 ответ

Лучший ответ

Работа в Z 2 эквивалентна поиску решения матричного уравнения Ax = b, где A - это двоичная матрица размером 64x800, образованная путем двоичного разложения каждого элемента. и b - это 64-элементная двоичная матрица, представляющая решение.

Такую систему довольно легко решить, используя прямое исключение Гаусса.

5
nneonneo 7 Окт 2012 в 04:09
Большое спасибо. Это простое, но мощное понимание того, что ({0, 1}, XOR) образует группу.
 – 
Niklas
7 Окт 2012 в 04:17