gpt4 book ai didi

python - 求解异或方程组的最优算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:26:31 35 4
gpt4 key购买 nike

我正在尝试求解 XOR 方程组。例如:

A = [[1, 1, 1, 0, 0], [0, 1, 1, 1, 0], [0, 0, 1, 1, 1], [0, 1, 1, 0, 1], [0, 1, 0, 1, 1]]
s = [3, 14, 13, 5, 2]
m = 5 # len(s)
Ax = s => x = [12, 9, 6, 1, 10]

我尝试了两种方式:

  • 第一种方法是显示的高斯消元法(~2.5 秒)here
  • 第二种方法是反转模矩阵 A(模数为 2),然后与 A_invert 和 s 相乘。 (~7.5 秒)

你能告诉我有没有办法或 python 库来加速。即使我尝试使用 gmpy2 库,但它不能减少太多。下面我描述了 python 代码,以便您可以轻松理解。

使用高斯消元法:

def SolveLinearSystem (A, B, N):
for K in range (0, N):
if (A[K][K] == 0):
for i in range (K+1, N):
if (A[i][K]!=0):
for L in range (0, N):
s = A[K][L]
A[K][L] = A[i][L]
A[i][L] = s
s = B[i]
B[i] = B[K]
B[K] = s
break
for I in range (0, N):
if (I!=K):
if (A[I][K]):
#M = 0
for M in range (K, N):
A[I][M] = A[I][M] ^ A[K][M]
B[I] = B[I] ^ B[K]

SolveLinearSystem (A, s, 5)

使用反转

def identitymatrix(n):
return [[long(x == y) for x in range(0, n)] for y in range(0, n)]

def multiply_vector_scalar (vector, scalar, q):
kq = []
for i in range (0, len(vector)):
kq.append (vector[i] * scalar %q)
return kq

def minus_vector_scalar(vector1, scalar, vector2, q):
kq = []
for i in range (0, len(vector1)):
kq.append ((vector1[i] - scalar * vector2[i]) %q)
return kq

def inversematrix(matrix, q):
n = len(matrix)
A =[]
for j in range (0, n):
temp = []
for i in range (0, n):
temp.append (matrix[j][i])
A.append(temp)

Ainv = identitymatrix(n)

for i in range(0, n):
factor = gmpy2.invert(A[i][i], q) #invert mod q
A[i] = multiply_vector_scalar(A[i],factor,q)
Ainv[i] = multiply_vector_scalar(Ainv[i],factor,q)
for j in range(0, n):
if (i != j):
factor = A[j][i]
A[j] = minus_vector_scalar(A[j], factor, A[i], q)
Ainv[j] = minus_vector_scalar(Ainv[j], factor, Ainv[i], q)
return Ainv

def solve_equation (A, y):
result = []
for i in range (0, m):
temp = 0
for j in range (0, m):
temp = (temp ^ A[i][j]* y[j])
result.append(temp)
return result

A_invert = inversematrix(A, 2)
print solve_equation (A_invert, s)

最佳答案

您提供的两种方法都可以让您进行三次位运算。有些方法在渐进和实践中都更快。

第一步(这对你来说可能就足够了)是使用一个 32 位整数(我相信它们在 Python 中称为 numpy.int32)来存储 a 的 32 个连续元素排。这将在输入足够大的情况下将行减少速度提高近 32 倍,并且可能会显着缩短输入适度的运行时间。

在您的特定代码中,有许多东西可以让您简单地专注于 mod-2 的情况。在您的代码中搜索 %inversemodp 并处理所有这些;额外的、毫无意义的操作肯定不会帮助您的运行时间。

关于python - 求解异或方程组的最优算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729351/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com