查找半径为 R 且维度为 D 的球体内以原点为中心的整数点数
Finding the number of integer points inside a sphere of radius R and dimension D centered at the Origin
我正在编写一个计算机程序/算法来计算半径为R和以原点为中心的维度D的球体内的整数点数。本质上,如果我们有一个维度为 2(圆)和半径为 5 的球体,我正在确定不等式 X^2+Y^2 ≤ 25 的所有整数解。与其计算每个可能的整数点,有没有一种有效的方法来计算点?使用对称性?
假设维度为 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|
所以:
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;
}
好吧,使用对称性,您始终可以只计算正侧的所有整数解,然后反转分量。所以,在你的圆圈(D = 2,R = 5)的情况下,你只需要找到
{ X,Y ∈ N: X²+Y² ≤ R }.然后创建组合 (X,Y)、(X,-Y)、(-X,Y)、(-X,-Y)
这只剩下 (1/2)D 解决方案可供查找。
此外,您可以将半径 R 的圆近似为半径为 R/√2 的正方形,因此可以自动添加小于或等于该值的所有整数组合。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为"adjacent"变量赋值时出现问题
- C++为构建时间获取QDateTime的可靠方法
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何将 StretchDIBits 的原点设置为左上角?
- 查找半径为 R 且维度为 D 的球体内以原点为中心的整数点数
- 将以Windows为中心的控制台I/O移植到Linux
- QT QGraphicsScene将原点设置为左下角
- 如何在 OpenGL 中为 3D 对象设置原点
- 如何使中心区域调整为 QDockWidgets 位置
- C++中的设计问题:以界面为中心的设计中的代码重用
- 将矩形定义为两点或原点/大小
- 如何使QWidget(或QDialog)以其父窗口小部件为中心
- 当显示为对话框时,派生的Widget不以父级为中心
- 以C++为中心帕斯卡三角形输出
- 如何将平面设计为在任何窗口大小的视口中心
- Q对话框不以父级为中心
- 围绕世界0,0,0旋转,而不是以物体为中心