我正在寻找一种算法来测试非负dxd整数矩阵是否是不可分解的。如果它不能写成两个非负dxd整数矩阵的乘积,我称之为不可分解的矩阵,它们都不是排列矩阵(即在非负整数矩阵SLmd的半环中不可逆) (N))。我最感兴趣的是具有行列式1的3x3矩阵的情况。注意1x1矩阵的情况对应于问一个正整数是素数。对于具有行列式1的2×2矩阵的情况,众所周知,唯一不可分解的矩阵是置换矩阵和基本矩阵(这是因为基本矩阵生成整个SL_2(N))。在SL_3(N)中有无数多个已知的不可分解矩阵的例子(J. Rivat“维度3中的不可分解矩阵”附录中的Pytheas Fogg“动态,算术和组合中的替代”,Springer LNM)。
有一种天真的算法,其包括查看具有B a d x k矩阵和C a k x d矩阵的形式BC = A的更一般的因子分解。这样我们就可以开始递归构造了。我们用B0填充B的第一列,用C0填充C的第一行,使得B0 * C0 <= A(这里我的意思是所有系数都更小)。然后,足以找到尺寸分别为d x(k-1)和(k-1)x d的B'和C',使得B'* C'= A-B0 * C0。这个算法比较慢!
与问题相关的方程是二次的,有2 d ^ 2个变量(对于A为d ^ 2,对于B为d ^ 2),我想用非负整数求解它们。由于方程是非常特殊的形式,我想可能有更好的方法来解决它们,或者至少使递归构造更有效。
答案 0 :(得分:0)
好吧我试着按照我的意思写出问题:
M = A x B
矩阵的乘法:
M[i][j] = sum(k=0,1,...,N-1)A[i][k]*B[k][j]
好了,现在让我写一个3x3的例子,为了清晰起见:
M[3][3]=A*B
i j i k k j i k k j i k k j
M[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0]+A[0][2]*B[2][0]
M[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1]+A[0][2]*B[2][1]
M[0][2]=A[0][0]*B[0][2]+A[0][1]*B[1][2]+A[0][2]*B[2][2]
M[1][0]=A[1][0]*B[0][0]+A[1][1]*B[1][0]+A[1][2]*B[2][0]
M[1][1]=A[1][0]*B[0][1]+A[1][1]*B[1][1]+A[1][2]*B[2][1]
M[1][2]=A[1][0]*B[0][2]+A[1][1]*B[1][2]+A[1][2]*B[2][2]
M[2][0]=A[2][0]*B[0][0]+A[2][1]*B[1][0]+A[2][2]*B[2][0]
M[2][1]=A[2][0]*B[0][1]+A[2][1]*B[1][1]+A[2][2]*B[2][1]
M[2][2]=A[2][0]*B[0][2]+A[2][1]*B[1][2]+A[2][2]*B[2][2]
// usage of B[i][j]
M[0][0]=A[0][0]*B[0][0]+...
M[1][0]=A[1][0]*B[0][0]+...
M[2][0]=A[2][0]*B[0][0]+...
M[?][j]=A[?][i]*B[i][j]+...
// usage of A[i][j]
M[0][0]=A[0][0]*B[0][0]+...
M[0][1]=A[0][0]*B[0][1]+...
M[0][2]=A[0][0]*B[0][2]+...
M[i][?]=A[i][j]*B[j][?]+...
当您仔细观察时,解决方案非常简单。找到所有:
A[i][j]=GCD(M[i][0],...,M[i][N-1])
然后从M,A或B = M *逆(A)
导出B. 如果存在至少单个A [i] [j]&gt;,则M是可分解的。 1你也可以把B作为GCD并从M,B,......中衍生出来。
这就是全部,希望它有所帮助......