簡體   English   中英

求解XOR方程組的最優算法

[英]Optimital algorithm for solving XOR equation systems

我正在嘗試解決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秒),在此處顯示
  • 第二種方法是對模矩陣A(取模2)求反,然后XOR與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其稱為numpy.int32 )存儲一行的32個連續元素。 在足夠大的輸入上,這將使行減少速度加快近32倍,並且可能對適度輸入上的運行時間造成重大影響。

在您的特定代碼中,有許多事情需要您專門研究一下mod-2情況。 在代碼中搜索%inversemodp並處理所有這些; 多余的,毫無意義的操作肯定不會幫助您的運行時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM