我正在编写一个计算机程序/算法来计算半径为R的球体内的整数点数和以原点为中心的尺寸D.本质上,如果我们有一个维度为2(圆)和半径为5的球体,我正在确定不等式X ^ 2 + Y ^2≤25的所有整数解。而不是计算每个可能的整数点,是否有一种有效的方法算点数?使用对称性?
答案 0 :(得分:2)
假设尺寸为3,R为半径。对于z = 0,可能的x,y坐标是半径为R的圆内的点,对于任何z,x,y是半径为sqrt的圆内的点(R * R-z * z); z的可能值是-r,.. 0,1,.. r其中r是小于R的最小整数。注意z和-z的计数将是相同的。
当我们得到维度1时,我们问的是我满足了多少个整数| i | < R,这是1 + 2 * r
所以:
int ncip( int dim, double R)
{
int i;
int r = (int)floor( R);
if ( dim == 1)
{ return 1 + 2*r;
}
int n = ncip( dim-1, R); // last coord 0
for( i=1; i<=r; ++i)
{ n += 2*ncip( dim-1, sqrt( R*R - i*i)); // last coord +- i
}
return n;
}
答案 1 :(得分:0)
好吧,使用对称性,您可以始终只计算正面的所有整数解,然后反转组件。所以,如果你的圈子(D = 2,R = 5),你只需要找到
{X,Y∈N:X 2 + Y2≤R}。然后创建组合(X,Y),(X,-Y),( - X,Y),( - X,-Y)
这使您只需要(1/2) D 解决方案即可找到。
此外,您可以将半径为R的圆近似为半径为R /√2的正方形,因此可以自动添加小于或等于该整数的所有整数组合。