求出以原点为中心、半径为 R、尺寸为 D 的球内整数点的数量

Finding the number of integer points inside a sphere of radius R and dimension D centered at the Origin

我正在编写一台计算机 program/algorithm 来计算以原点为中心的半径 R 和维度 D 的球体内整数点的数量。本质上,如果我们有一个维度为 2(圆)且半径为 5 的球体,我正在确定不等式 X^2+Y^2 ≤ 25 的所有整数解。不是计算每个可能的整数点,有没有一种有效的方法算点数?使用对称性 ?

好吧,使用对称性,您总是可以只计算正侧的所有整数解,然后反转分量。所以,对于你的 Circle (D=2, R=5),你只需要找到
{ X,Y ∈ N: X²+Y² ≤ R}。然后创建组合 (X,Y), (X,-Y), (-X,Y), (-X,-Y)
这让您只剩下 (1/2)D 个解决方案。

此外,您可以将半径为 R 的圆近似为半径为 R/√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 满足 |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;
}