ОБНОВЛЕНИЕ: в итоге я не использовал Eigen и реализовал собственное матричное представление GF(2), где каждая строка представляет собой массив целых чисел, а каждый бит целого числа представляет собой одну запись. Затем я использую модифицированное исключение Гаусса с битовыми операциями для получения желаемых векторов.
В настоящее время у меня есть (большая) прямоугольная разреженная матрица, которую я храню с помощью Eigen3, которую я хочу найти (правильное) нулевое пространство над GF (2). Я исследовал и нашел несколько возможных подходов к этому:
Это означает простое использование некоторой формы исключения Гаусса, чтобы найти сокращенную форму матрицы, которая сохраняет нулевое пространство, а затем извлечь нулевое пространство из него. Хотя я знаю, как бы я сделал это вручную, я совершенно не знаю, как бы я это реализовал.
Я не знаком с ними, но, насколько я понимаю, (ортонормированные) базисные векторы нулевого пространства могут быть извлечены из разложенной формы матрицы.
Теперь мой вопрос: какой подход я должен использовать в моем случае (т.е. прямоугольную разреженную матрицу над GF (2)), который не включает преобразование в плотную матрицу? А если подходов много, что бы порекомендовали с точки зрения производительности и простоты реализации?
Я также открыт для использования других библиотек, помимо Eigen.
Для контекста я пытаюсь найти комбинированные отношения эквивалентности для алгоритмов факторинга (например, как в квадратичном сите). Кроме того, если возможно, я хотел бы изучить возможность распараллеливания этих алгоритмов в будущем, поэтому, если существует подход, который позволил бы это сделать, это было бы здорово!
Eigen изначально не поддерживает GF(2)
— это недавно обсуждалось, но пока ни у кого не было времени/интереса реализовать это. Для этого вы можете создать собственный тип. Я предполагаю, что любая форма разложения LU подходит лучше всего - стоит ли использовать SparseLU, действительно зависит от размера и структуры разреженности вашей матрицы.
Каков ожидаемый максимальный размер матрицы и каково отношение ненулевых элементов к нулевым? Используете ли вы SparseMatrix
для хранения своей матрицы или используете плотное представление?
Обновленный ответ - спасибо Гарольду: QR-разложение вообще не применимо для вашего случая.
См. например
https://math.stackexchange.com/questions/1346664/how-to-find-orthogonal-vectors-in-gf2
Я ошибочно предположил, что QR здесь применим, но это не теоретически.
Если вас все еще интересуют подробности о QR-алгоритмах, откройте новую тему.
Вы приняли во внимание часть GF (2)?
Как я уже говорил в своих ответах, я ответил только на общие вопросы с упором на QR. Эти точки действительны независимо от GF(2)
Ну, я бы так не сказал, они действительны в R и C, но разложение QR по GF (2) имеет странные проблемы и часто невозможно (вектор с четным числом единиц в нем имеет "длину" ноль и не может быть нормализована)
@harold Спасибо за подробности! Поэтому я хочу сформулировать это более точно: мой ответ имеет отношение только к действительности предпосылки ОП, что QR в целом применим к его случаю.
@Secundi: Вы продолжаете говорить, что это «относится к предпосылке ОП». Это? Вы уверены? Гарольд поднимает важный вопрос.
@gspr Я обновил свой ответ. Я предположил, что предположение ОП будет правильным, что QR применим (для его случаев). Мой ответ следует рассматривать в этом контексте. Таким образом, вопрос ОП, возможно, придется изменить, чтобы отличить это.
Назовем рассматриваемую матрицу М. Тогда (поправьте меня, если я ошибаюсь):
GF(2) подразумевает, что M эквивалентна битовой матрице — каждый элемент может иметь одно из двух значений.
Арифметика на GF(2) аналогична целочисленной арифметике с неотрицательными числами, но выполняется по модулю 2, поэтому сложение — побитовое XOR
, а умножение — побитовое AND
. Неважно, какие именно элементы содержит GF(2) — все они эквивалентны битам.
Векторы в GF(2) линейно независимы, пока они не равны, или пока они отличаются хотя бы на один бит, или v_1 + v_2 ≠ 0 (поскольку сложение в GF(2) является логическим XOR).
По определению (правое) нулевое пространство охватывает базисные векторы, которые матрица преобразует в 0. Вектор v окажется в нулевом пространстве, если умножить каждый j-й столбец M на j-й бит v, просуммировать их и получить результат нулевой.
Я вижу как минимум два пути решения этой проблемы.
Выполните плотное исключение Гаусса с точки зрения битовых операций, организуйте данные и напишите циклы так, чтобы компилятор все векторизовал и работал с 512-битными типами данных. Вы можете использовать Compiler Explorer на godbolt.org, чтобы легко проверить, что векторизация имеет место, и, например. Используются инструкции AVX512. Конечно, линейный выигрыш в конечном итоге проиграет при квадратичном масштабировании проблемы, но прирост производительности по сравнению с наивной реализацией на основе bool
будет огромным и может быть достаточным для ваших нужд. Разреженность добавляет возможную сложность: если матрица не помещается в памяти в плотном представлении, то необходимо разработать подходящее представление, которое обеспечит хорошую работу исключения Гаусса. Необходимо больше знать о матрицах, над которыми вы работаете. Вообще говоря, операции со строками будут выполняться с пропускной способностью памяти, если реализация правильная, порядка 1E10 элементов/с, поэтому 1E3x1E3 M должно обрабатываться не более чем за секунду.
Поскольку проблема эквивалентна набору логических уравнений, используйте решатель SAT (решатель логических задач выполнимости) для постепенного создания нулевого пространства. Исходным набором уравнений является M × v = 0 и v ≠ 0, где v — битовый вектор. Запускайте SAT, пока не найдёт какой-нибудь v, назовём его v_i. Затем добавьте ограничение v ≠ v_i и снова запустите SAT, добавляя ограничения на каждой итерации. То есть k-я итерация имеет ограничения v ≠ 0, v ≠ v1, ... v ≠ v(k-1).
Поскольку все битовые векторы, которые отличаются, также линейно независимы, ограничения неравенства заставят добавочную генерацию базисных векторов нулевого пространства.
Современный SAT превосходно справляется с разреженными задачами с большим количеством логических уравнений, чем с переменными, поэтому я полагаю, что это будет работать очень хорошо - чем разреженнее матрица, тем лучше. Задача должна быть предварительно обработана, чтобы удалить все нулевые столбцы в M, чтобы минимизировать комбинаторный взрыв. Решатели SAT с открытым исходным кодом могут легко справляться с задачами с 1 млн переменных, поэтому для разреженной задачи вы могли бы реально решить 100 000–1 млн столбцов в M и около 10 «единиц» в каждой строке. Таким образом, разреженная матрица 1Mx1M с 10 «единицами» в каждой строке в среднем была бы разумной задачей для обычных SAT-решателей, и я полагаю, что современный уровень техники может работать с матрицами 10Mx10M и выше.
Более того, ваше приложение идеально подходит для инкрементных решателей: вы находите одно решение, останавливаетесь, добавляете ограничение, возобновляете и так далее. Поэтому я полагаю, что вы можете получить очень хорошие результаты, и есть несколько хороших решателей с открытым исходным кодом на выбор.
Поскольку вы уже используете Eigen, проблема, по крайней мере, будет соответствовать представлению SparseMatrix
с элементами размером в байт, так что это не очень большая проблема с точки зрения SAT.
Интересно, является ли это обнаружение базиса нулевого пространства случаем проблемы покрытия, возможно, смягченной. Для этого есть несколько хороших алгоритмов, но всегда вопрос в том, будет ли специализированный алгоритм работать лучше, чем простое SAT и, так сказать, ожидание.
Как правило, SVD и QR-преобразования относятся к кубическому времени выполнения. С точки зрения точности, есть несколько многообещающих подметодов для обоих из них. Какой алгоритм следует предпочесть, зависит от фактического разреженного типа ваших матриц. Например, для разреженных матриц полос вращение Гивенса является рекомендуемым быстрым и точным методом здесь - в зависимости от количества полос вы даже можете достичь здесь линейного времени выполнения в сомнении. Исключение Гаусса требует поворота, чтобы быть приемлемым здесь.