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