Ввод: n times m
матрица A
с целочисленными значениями.Например, рассмотрим матрицу
A = [[2,1,0],[0,1,2]]
Вывод: целое число для ядра / пустого пространства A
.Например, для вышеуказанной матрицы целочисленный базис равен
[[1,-2,1]]
. Я использую идеи из этого сообщения stackoverflow , чтобы сначала вычислить рациональный базис, а затем вычислить целочисленный базис путем умножения насм3 знаменателей со следующим (Python 2.7
) кодом:
import numpy as np
from sympy import Matrix,lcm
from fractions import Fraction
def ker_int_basis(B):
BKer = 1.0*np.array(Matrix(B).nullspace())
Bk =[]
for basis in BKer:
l = lcm(map(lambda x: Fraction(x).limit_denominator().denominator,map(str,basis)))
basis = map(int,l*basis)
Bk.append(basis)
Bk = np.array(Bk)
return Bk
Работает на небольших примерах.Но приведенный выше код утомительно медленный и у меня есть матрицы 10000 times 500
или больше.Приведенный выше код не выводится даже после нескольких часов работы.
Как сделать код быстрее? Я бы предпочел реализацию на GPU, учитывая, что матрицы очень очень большие.Многоядерный процессор также будет улучшением.Также приветствуются предложения по более эффективному использованию циклов и структур данных в приведенном выше коде.