Я хочу найти уменьшенную эшелонную строку (в поле F_q) большой матрицы. Я пробовал следующий код. Хотя я использовал библиотеку gmpy2 для ускорения работы, программа по-прежнему была не в памяти. потому что моя входная матрица очень велика (100 x 2^15), а p также очень велика (| p | = 256 бит). Может кто-то предложить, как уменьшить сложность этого alg.Python: уменьшенная форма эшелона строки (mod p) очень большой матрицы
Спасибо
def invmodp(a, p):
return gmpy2.invert(a,p)
def division_mod(a, b, p): #a/b mod p
invert = invmodp(b, p)
return (a * invert) %p
def row_echelon_form(M, p):
lead = 0
rowCount = len(M)
columnCount = len(M[0])
for r in range(rowCount):
if lead >= columnCount:
return
i = r
while M[i][lead] == 0:
i += 1
if i == rowCount:
i = r
lead += 1
if columnCount == lead:
return
M[i],M[r] = M[r],M[i]
lv = M[r][lead]
M[r] = [ division_mod(mrx, lv, p) for mrx in M[r]]
for i in range(rowCount):
if i != r:
lv = M[i][lead]
M[i] = [ (iv - lv*rv)%p for rv,iv in zip(M[r],M[i])]
lead += 1
return M