蛮力不适合这个矩阵

时间:2014-04-05 19:59:16

标签: algorithm matrix

在2X2矩阵中,我们如何找到矩阵的数量,使得迹线为N,行列式为正,所有条目也为正。因此,如果矩阵是如此d = N-a并且对于行列式是正的,我们如何有效地计算对的数量(a,b)使得a * b <= n,其中n的范围从1到N-1?

1 个答案:

答案 0 :(得分:0)

假设我们有一个矩阵m={{a,b},{c,d}},那么我们有:

  • trace(m) = N => a+d = N => d = N - a
  • det(m) >= 0 => a*d - b*c >= 0 => a*(N-a) >= b*c

因此,对于任意但固定的a < N,我们可以计算d=N-aq:=a*(N-a),并且只剩下约束b*c <= q

现在,如果元素可以是实数,则可以通过选择b > 0和计算c = q/b来获得无限的解决方案。

如果元素应该是整数,则必须找到(b,c)对,b*c <= q。您可以找到以下所有解决方案:

  • 选择0 < b <= q
  • 计算cmax=floor(q/b)(地板向下舍入)
  • 所有对(b,1), ..., (b,cmax)都是可能的解决方案

总计:

for(int a=1; a<N; a++) {
     int q = a*(N-a);
     for(int b=1; b<=q; b++) {
         int cmax = floor(q/b);
         for(int c=1; c<=cmax; c++) {
             std::cout << "(a,b,c,d)=" << a << "," << b << "," << c << "," << N-a << std::endl;
         }
     }
 }
相关问题