私が尋ねているのは、この非常に人気のある質問の重複ではありません。ランダムに選択された入力に対して、いくつかの簡単なテストを実行できます。「正方形ではない」と言わない場合は、平方根の計算を実行する必要があります (私自身も解決策を試しました)。
テストする数値が単純な数列に由来する場合、前の (近似) 平方根を使用できるため、状況は異なります。自明なシーケンスの場合、それも自明です。たとえば、
long sqrt = 1;
for (long i=1; i<limit; ++i) {
if (sqrt*sqrt == i) {
handleSquare(i);
++sqrt;
}
}
私の質問は、次のようなより複雑なシーケンスに対して何ができるかです
x[i] = start + i*i;
また
x[i] = start - i*i*i;
ニュートンの方法を考えていますが、高速にする方法がわかりません (除算はかなり高価な操作であるため)。