球の半径Rと次元Dの中の点の数を数える効率的なアルゴリズムを書こうとしています。球は常に原点です。半径Rと次元Dの球の内部の整数点を数える
私の戦略は、第1象限内にすべての可能な点を生成することです。上の例では、(1,2)が円の中にあることがわかりますが、単に次元の二乗であるその点のすべての+/- の組み合わせでなければならない。したがって、n次元球の単一象限内にある各点に対して、総数に2次元を追加します。
この問題のはるかに効率的な解決策があるかどうかは分かりませんが、これはこれまでのところ実装の面でこれがあります。
int count_lattice_points(const double radius, const int dimension) {
int R = static_cast<int>(radius);
int count = 0;
std::vector<int> points;
std::vector<int> point;
for(int i = 0; i <= R; i++)
points.push_back(i);
do {
for(int i = 0; i < dimension - 1; i++)
point.push_back(points.at(i));
if(isPointWithinSphere(point, radius)) count += std::pow(2,dimension);
point.clear();
}while(std::next_permutation(points.begin(), points.end()));
return count + 3;
}
私はこの状況で何が改善できますか? 2次元の場合について
原点が常に(0、0)か(0、0、0)であると仮定していますか?あなたの現在の推論がそのような制約なしに機能するようには見えません。 –
@JamesAdkisonはい、球は常にOriginにあります –
コードスニペットの出力は、2次元の予想される結果を与えません。[The Integer Sequenceのオンライン百科事典](http://oeis.org/A000328)を参照してください。 )。私はいくつかの問題を見る。ポイントは私の座標を 'dimension'としなければなりませんが、2番目の' for'ループの 'i