回答:
Davidの答えが明確でない場合:10,000の整数があるとしましょう およびk = 1,000,000。以下の浮動小数点演算を使用して、n個の整数の平方根を簡単に追加できます。。結果が999,999.537または1,000,000.214である場合は、答えがあります。結果が1,000,000に近い場合は、浮動小数点の丸めエラーを非常に注意深く分析できます。合計が999,999.999999999であれば、おそらく答えが得られます。合計がkに近すぎる場合は、より高い精度で演算を実行できます。そのため、正確な実装に応じて定数cがあり、正しい答えを次の場所で見つけることができます すべてのケースの大多数の時間(nが本当に大きい場合、含まれる数が膨大になるため少し時間がかかりますが、いずれにしても、寿命は寿命より長くなります)。
問題は、kに非常に近い値になる平方根の合計があることです。たとえば、f(x)=選択肢の数を定義できます 平方根の合計が≤xになるように、2f '(k)* epsの選択肢を期待します したがって、平方根の合計はkからeps以内です。平方根の合計がeps≥1 / 2f '(k)の場合、kからepsの範囲内にある1つの組み合わせを期待します。このepsの推定値を計算し、正しい答えを得るために必要な計算の精度と、この精度で結果を得るのにかかる時間を把握できます。これは、epsがどの程度小さいかによって、多項式である場合とそうでない場合があります。
しかし、それはもっと悪いことです。私が上で言ったのは、合計がkにどれだけ近いと期待するかです。しかし、偶然ではもっと近いかもしれません。それがひどく近づくことはできないことを証明することは非常に、非常に難しいでしょう。したがって、ほとんどの場合(> 99.9999999999%)は線形時間で答えが見つかる場合があり、すべての場合(またはそうでない場合)で多項式時間で答えが見つかると予想されますが、いずれの場合も(簡単に)はできません。これを証明し、誰もまだそうしていません。
合計を計算せずに質問に答えることができるかもしれませんが、Davidの言うところによると、多項式時間でそれを行う方法も誰も示していません。
平方根の合計が整数にどれほど近づくと予想されるかを誰かが計算した場合は、私は喜んでお知らせします。ところで。整数の平方根の合計は、すべての平方根が整数である場合にのみ整数に等しいため、簡単に除外できます。
PS。概算:それぞれ1,000,000未満の整数の10,000平方根を追加するとします。それはの平方根です 整数であり、それらの順序は関係がないため、約 合計。それ以上です合計。したがって、これらの合計の1つが 整数までの距離。80,000桁を超える精度の計算が必要です。
PS。与えられた整数a、b、c、d、k、およびIEEE 754倍精度演算を使用して、sqrt(a)+ sqrt(b)+ sqrt(c)+ sqrt(d)<kの最初のケースは、数学的に正しいものは、a、b、c、d = 4640、5397、3001、3222、およびk = 254の場合です。この場合、合計は、数学的な結果が254未満の場合、厳密に254として計算されます。浮動小数点の結果は整数に等しいため、切り上げられたのか切り捨てられたのかわからないため、この場合、結果は信頼されるべきではありません。
a、b、c、d = 6222、8801、14431、8132、およびk = 383の場合、計算された合計はkより大きく、数学的な結果は小さくなります。14431が3番目の番号でなければならないことを除いて、番号の順序は重要ではありません。
(sqrt(a)+ sqrt(b))+(sqrt(c)+ sqrt(d))(括弧が追加されていることに注意)を追加して演算の順序を変更すると、丸め誤差が変更され、減少する傾向があります、次に、a、b、c、d = 12558、407、16501、18308およびk = 396は、計算された合計がkより大きく、数学的な結果が小さい最初のケースです。
平方根の問題の複雑さは、長年にわたる未解決の問題です。問題は、平方根を効率的に計算する方法はわかっていますが、次のことを判断できるかどうかはわからないということです。 各平方根のビットの多項式数のみを評価する。
質問で提案するアルゴリズムの特定の問題は、「各値の平方根を計算する」という語句が十分に指定されていないことです。非合理的な平方根(たとえば、)は、無限のビット数を計算する必要があるため、使用している精度を示す必要があります。