Как мне вычислить нулевое пространство прямоугольной разреженной матрицы над GF (2) в C/C++?

ОБНОВЛЕНИЕ: в итоге я не использовал Eigen и реализовал собственное матричное представление GF(2), где каждая строка представляет собой массив целых чисел, а каждый бит целого числа представляет собой одну запись. Затем я использую модифицированное исключение Гаусса с битовыми операциями для получения желаемых векторов.

В настоящее время у меня есть (большая) прямоугольная разреженная матрица, которую я храню с помощью Eigen3, которую я хочу найти (правильное) нулевое пространство над GF (2). Я исследовал и нашел несколько возможных подходов к этому:

  • (Измененное) Исключение по Гауссу

Это означает простое использование некоторой формы исключения Гаусса, чтобы найти сокращенную форму матрицы, которая сохраняет нулевое пространство, а затем извлечь нулевое пространство из него. Хотя я знаю, как бы я сделал это вручную, я совершенно не знаю, как бы я это реализовал.

  • Разложение СВД
  • QR-разложение

Я не знаком с ними, но, насколько я понимаю, (ортонормированные) базисные векторы нулевого пространства могут быть извлечены из разложенной формы матрицы.

Теперь мой вопрос: какой подход я должен использовать в моем случае (т.е. прямоугольную разреженную матрицу над GF (2)), который не включает преобразование в плотную матрицу? А если подходов много, что бы порекомендовали с точки зрения производительности и простоты реализации?

Я также открыт для использования других библиотек, помимо Eigen.

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

Как правило, SVD и QR-преобразования относятся к кубическому времени выполнения. С точки зрения точности, есть несколько многообещающих подметодов для обоих из них. Какой алгоритм следует предпочесть, зависит от фактического разреженного типа ваших матриц. Например, для разреженных матриц полос вращение Гивенса является рекомендуемым быстрым и точным методом здесь - в зависимости от количества полос вы даже можете достичь здесь линейного времени выполнения в сомнении. Исключение Гаусса требует поворота, чтобы быть приемлемым здесь.

Secundi 14.12.2020 11:17

Eigen изначально не поддерживает GF(2) — это недавно обсуждалось, но пока ни у кого не было времени/интереса реализовать это. Для этого вы можете создать собственный тип. Я предполагаю, что любая форма разложения LU подходит лучше всего - стоит ли использовать SparseLU, действительно зависит от размера и структуры разреженности вашей матрицы.

chtz 14.12.2020 11:36

Каков ожидаемый максимальный размер матрицы и каково отношение ненулевых элементов к нулевым? Используете ли вы SparseMatrix для хранения своей матрицы или используете плотное представление?

Kuba hasn't forgotten Monica 14.12.2020 15:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
507
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обновленный ответ - спасибо Гарольду: QR-разложение вообще не применимо для вашего случая.

См. например

https://math.stackexchange.com/questions/1346664/how-to-find-orthogonal-vectors-in-gf2

Я ошибочно предположил, что QR здесь применим, но это не теоретически.

Если вас все еще интересуют подробности о QR-алгоритмах, откройте новую тему.

Вы приняли во внимание часть GF (2)?

harold 14.12.2020 12:12

Как я уже говорил в своих ответах, я ответил только на общие вопросы с упором на QR. Эти точки действительны независимо от GF(2)

Secundi 14.12.2020 12:29

Ну, я бы так не сказал, они действительны в R и C, но разложение QR по GF (2) имеет странные проблемы и часто невозможно (вектор с четным числом единиц в нем имеет "длину" ноль и не может быть нормализована)

harold 14.12.2020 12:53

@harold Спасибо за подробности! Поэтому я хочу сформулировать это более точно: мой ответ имеет отношение только к действительности предпосылки ОП, что QR в целом применим к его случаю.

Secundi 14.12.2020 13:13

@Secundi: Вы продолжаете говорить, что это «относится к предпосылке ОП». Это? Вы уверены? Гарольд поднимает важный вопрос.

gspr 14.12.2020 13:36

@gspr Я обновил свой ответ. Я предположил, что предположение ОП будет правильным, что QR применим (для его случаев). Мой ответ следует рассматривать в этом контексте. Таким образом, вопрос ОП, возможно, придется изменить, чтобы отличить это.

Secundi 14.12.2020 13:40
Ответ принят как подходящий

Назовем рассматриваемую матрицу М. Тогда (поправьте меня, если я ошибаюсь):

  1. GF(2) подразумевает, что M эквивалентна битовой матрице — каждый элемент может иметь одно из двух значений.

  2. Арифметика на GF(2) аналогична целочисленной арифметике с неотрицательными числами, но выполняется по модулю 2, поэтому сложение — побитовое XOR, а умножение — побитовое AND. Неважно, какие именно элементы содержит GF(2) — все они эквивалентны битам.

  3. Векторы в GF(2) линейно независимы, пока они не равны, или пока они отличаются хотя бы на один бит, или v_1 + v_2 ≠ 0 (поскольку сложение в GF(2) является логическим XOR).

По определению (правое) нулевое пространство охватывает базисные векторы, которые матрица преобразует в 0. Вектор v окажется в нулевом пространстве, если умножить каждый j-й столбец M на j-й бит v, просуммировать их и получить результат нулевой.

Я вижу как минимум два пути решения этой проблемы.

  1. Выполните плотное исключение Гаусса с точки зрения битовых операций, организуйте данные и напишите циклы так, чтобы компилятор все векторизовал и работал с 512-битными типами данных. Вы можете использовать Compiler Explorer на godbolt.org, чтобы легко проверить, что векторизация имеет место, и, например. Используются инструкции AVX512. Конечно, линейный выигрыш в конечном итоге проиграет при квадратичном масштабировании проблемы, но прирост производительности по сравнению с наивной реализацией на основе bool будет огромным и может быть достаточным для ваших нужд. Разреженность добавляет возможную сложность: если матрица не помещается в памяти в плотном представлении, то необходимо разработать подходящее представление, которое обеспечит хорошую работу исключения Гаусса. Необходимо больше знать о матрицах, над которыми вы работаете. Вообще говоря, операции со строками будут выполняться с пропускной способностью памяти, если реализация правильная, порядка 1E10 элементов/с, поэтому 1E3x1E3 M должно обрабатываться не более чем за секунду.

  2. Поскольку проблема эквивалентна набору логических уравнений, используйте решатель 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.

  3. Интересно, является ли это обнаружение базиса нулевого пространства случаем проблемы покрытия, возможно, смягченной. Для этого есть несколько хороших алгоритмов, но всегда вопрос в том, будет ли специализированный алгоритм работать лучше, чем простое SAT и, так сказать, ожидание.

Другие вопросы по теме