2 x 2矩阵的行列式
a b
c d
由给出ad - bc
。
给定尺寸为2 n x 2 n的数字矩阵,n≥1,输出通过递归计算每个2 x 2子块的行列式获得的结果,直到获得单个数字为止。
例如,给定输入
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
第一步之后,我们获得:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
再次迭代,我们得到:
(22*-57 - 22*8) = -1430
因此,输出应为-1430
。
规则
- 矩阵的元素将始终是一位整数,即0到9。
- 您可以采用任何方便的列表或字符串格式的输入,只要不对数据进行任何预处理即可。由于矩阵始终是正方形,因此您可以根据需要将输入作为单个1D列表而不是2D列表。
- 输入可以通过函数输入,STDIN,命令行参数或最接近的替代方法进行。
- 输出应为函数输出,STDOUT或最接近替代值的单个整数。您可能不会在列表或矩阵中输出单个整数。
- 如果您的语言碰巧支持它们,则可以使用内置的行列式和矩阵处理方法。
- 理论上,您的算法必须对任何有效输入均有效。
- 适用标准代码高尔夫球规则。
测试用例
以下测试用例以Python样式列表给出:
[[1,0],[0,1]] -> 1
[[1,9],[8,4]] -> -68
[[0,1,2,3],[4,5,6,7],[8,9,0,1],[2,3,4,5]] -> 40
[[3,1,4,1],[5,9,2,6],[5,3,5,8],[9,7,9,3]] -> -1430
[[9,0,0,9],[0,9,9,0],[9,0,9,0],[0,9,0,9]] -> 13122
[[1,0,0,0,0,0,0,0],[2,1,0,0,0,0,0,0],[3,2,1,0,0,0,0,0],[4,3,2,1,0,0,0,0],[5,4,3,2,1,0,0,0],[6,5,4,3,2,1,0,0],[7,6,5,4,3,2,1,0],[8,7,6,5,4,3,2,1]] -> 1
[[7,1,0,5,8,0,1,5],[9,9,6,6,1,2,4,8],[4,8,7,3,8,7,4,7],[4,6,1,9,7,0,1,7],[7,6,7,1,9,4,1,6],[8,0,0,8,5,5,9,9],[4,6,4,8,9,4,8,6],[9,0,8,7,6,2,1,5]] -> 2937504
[[1,2,3,4,5,6,7,8],[2,3,4,5,6,7,8,1],[3,4,5,6,7,8,1,2],[4,5,6,7,8,1,2,3],[5,6,7,8,1,2,3,4],[6,7,8,1,2,3,4,5],[7,8,1,2,3,4,5,6],[8,1,2,3,4,5,6,7]] -> -10549504
[[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,1,0,1,1,1,1,1,1,0],[1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1],[1,0,1,0,1,1,1,0,0,1,1,1,1,0,1,0],[0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0],[1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1],[1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1],[1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1],[0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1],[1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,0],[1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,0,1,0,0,1,0,1,0,1,1,1,1,1,0,1],[1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1]] -> -8
(感谢@MartinBüttner帮助您解决此挑战)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
。它的完整行列式为零,因为它具有两个相同的行。因此,该矩阵是奇异的(表示不可逆的)4×4矩阵,因此A055165不会对其进行计数。但是,此处讨论的“递归”行列式为1*1-1*0==1
。在相反的方向上,矩阵[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
具有“递归”行列式0*0-0*0==0
。但是,它的完整行列式必须为非零,因为它的行只是身份矩阵中其他顺序的行;并由A055165计数。