确定NxN整数矩阵的行列式是偶数还是奇数

时间:2017-04-30 04:15:10

标签: algorithm math matrix linear-algebra

对于给定的NxN(0,1)矩阵,其值都是整数,我想确定矩阵的行列式是偶数(mod2 = 0)还是奇数(mod2 = 1)。

有没有有效的算法? N大到100,所以蛮力O(N!)溶液太慢了。

如果我进行高斯消除并且天真地计算行列式,则行列式将最多为200位,因此我必须进行200位乘法和除法。

2 个答案:

答案 0 :(得分:2)

工作模式2非常容易。以下是基于以下内容的递归方法:

  1. 如果第一列全为0,则行列式为0。

  2. 如果第一列在第一行中为1且在下面为0,那么行列式与通过删除第一行和第一列获得的矩阵的行列式相同。

  3. 交换两行对mod-2行列式没有影响。如果你没有使用mod 2,你会乘以-1,但-1(mod 2)= 1.

  4. 用行和另一行的总和替换行对行列式没有影响。

  5. 当您添加第一个条目为1然后是mod-2的两行时,您会得到第一个条目为0的行。

  6. Python 3实现:

    def det2(mat):
        matrix = [[a%2 for a in row] for row in mat]
        n = len(matrix)
        if n == 1: return matrix[0][0]
        #first find a nonzero element in first column
        i = 0
        while i < n and matrix[i][0] == 0: i += 1
        if i == n:
            return 0 #since a column of zeros
        else:
            if 0 < i: matrix[0],matrix[i] = matrix[i],matrix[0] 
        #clear rest of column:
        for i in range(1,n):
            if matrix[i][0] == 1:
                matrix[i] = [a+b for a,b in zip(matrix[i],matrix[0])] 
        rest = [row[1:] for row in matrix[1:]]
        return det2(rest)
    

    测试如下:

    import random
    
    def randMatrix(n,k):
        return [[random.randint(0,k+1) for i in range(n)] for j in range(n)]
    
    A = randMatrix(100,100) #a 100x100 random matrix with entries in 0,1,...,100
    
    det2(A) #takes less than a second
    

    以上代码主要是概念验证。即使Python是一种解释语言,它也相当快。如果您使用@mcdowella的想法并将条目打包在64位整数变量中并使用逐位操作,则上述代码可以修改为在C之类的内容中非常快速地工作。此外,它当然很容易编写它以迭代而非递归的形式出现:

    def det2(mat):
        matrix = [[a%2 for a in row] for row in mat]
        n = len(matrix)
        for i in range(n):
            #first find a nonzero element in column i in row i or below:
            j = i
            while j < n and matrix[j][i] == 0: j += 1
            if j == n:
                return 0 #since a zero will be on final diagonal
            else:
                if i < j: matrix[i],matrix[j] = matrix[j],matrix[i] 
            #clear rest of column:
            for j in range(i+1,n):
                if matrix[j][i] == 1:
                    matrix[j] = [(a+b) % 2 for a,b in zip(matrix[i],matrix[j])] 
    
        #if you get to this stage without returning 0:
        return 1
    

答案 1 :(得分:0)

将奇数替换为 1,将偶数替换为 0。如果新行列式的值为奇数,则母行列式的值为奇数,否则为偶数