(ビット)加算とシフトをプリミティブとして使用して平方根を計算する


8

質問:ビットの自然数与えられた、(ビット)の加算とシフトのみを使用してを計算する方法は?nNNO(n)

ヒントは、バイナリ検索を使用することです。しかし、必要な複雑さを実現できませんでした(を取得しました)。O(n2)


それはどういう意味ですかusing only $O(n)$ (bit) additions and shifts

これはアルゴリズムブックの練習問題です。
私の意見では、それは2を追加し、言うことを意味しビットは、自然数は、コストとシフトする、と言うビットは、自然数もコスト。次に、そのような操作を回しか使用できません。 比較のコストについては触れられていません。私はそれを無視することができると思います、または2つ、たとえばビットの自然数を比較することもを要すると仮定することができます。nO(1)nO(1)O(1)O(n)
nO(1)


私のアルゴリズムO(n2)

  1. ビットの数の範囲を決定の: したがって、 t_1 \ triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ triangleq t_2。tN
    2n12N2n22n12N2n2
    t1n12+1tn2+1t2.
  2. バイナリ検索:バイナリ検索を使用して、2 ^ {t_1}2 ^ {t_2}の間のNを検索します。各数値xについて、加算とシフトをプリミティブとして使用してx ^ 2を計算し、それをNと比較します。2t12t2xx2N

したがって、複雑さはであり、バイナリ検索と計算回に対して、それぞれが加算とシフトを行います。O n O(n×n)=O(n2)O(n)x2O(n)

回答:


7

反復アルゴリズムはうまくいくようです。

レッツ。我々は知っていると仮定し整数近似である、すなわち、、我々はの値を知っていると仮定し(先に得られました)。X M=N/4x X=MX2x=Mx2

ここで、を検索します。の可能な値は何ですか?可能な値はまたはのみであると確信しています。そして、両方を試して、どちらが正しいかを確認するのは簡単です。特に、場合、2つの左シフト(時間)によってから取得できるがあります。以下のために、我々はから得ることができ、及び 4左シフト二つの追加(と時間)。次に、これら2つの値をと比較します。YY=2、X、Y=2、X+1、Y=2、X、Y2=4、X2、X2O1Y=2、X+1、Y2=4X2+4、X+1、X2、XO1Ny=Nyy=2xy=2x+1y=2xy2=4x2x2O(1)y=2x+1y2=4x2+4x+1x2xO(1)N どちらが正しいかを確認します。

このようにして、回の反復を行い、各反復に時間かかる反復アルゴリズムを取得します。合計実行時間は、必要に応じてです。O 1 O n n/2O(1)O(n)

これはバイナリ検索を使用していなかったことに気づきました。しかたがない。


いいね!ありがとう。バイナリサーチを使わなくても大丈夫です。つべこべ:撮影、我々は、、及び。ただし、です。したがって、またはます。さらに、アルゴリズムでを計算するときにを再利用するという重要なアイデアは、アルゴリズムの番目のステップにも適用できます。私はこれを1日か2日開いたままにしておきます。、Y = N=9、M=N/4=2、X=y=N=3M=N/4=2、Y=2、X-1、Y=2、X、Y=2、X±1、X2、Y2ON2x=M=2y=2x1y=2xy=2x±1x2y2O(n2)
hengxin 2014

3

ここで整数を話しているのですか?Nはnビット長ですか?

A = 2(n/2), B = A  and C = A2
Step: B = B/2
     If C > N,  
         C = C - 2AB + B2    // too high - make smaller
         A = A - B
     Else 
         C = C + 2AB + B2   // keep this bit
         A = A + B                 
Repeat until B = 0                  // =1 on last loop

ループはn / 2回実行され、O(n)パフォーマンスが得られます

編集:それはどのように機能し、なぜですか?
これは、CORDICアルゴリズムでも使用される逐次近似のバージョンです。
最大の単一ビット(N未満の正方形)から始めて、一度に1ビットを設定し、新しい正方形を計算します。
新しい正方形がまだN未満の場合は、ビットをセットのままにします。
新しい正方形が大きすぎる場合は、ビットをクリアし、追加した効果を元に戻し、次のビットに進みます。

例: N = 441(1 1011 1001バイナリ)、n = 9

Start:  A = 24 = 16 (1 0000)  B = 16 C = 256 (100 0000)

1   B = 8 (1000) C = 256 + 2(16)(8) + (8)(8) = 576 (10 0100 0000) {high}
    A = 16 + 8 = 24
2   B = 4  (100) C = 576 - 2(16)(4) + (4)(4) = 400 (1 1001 0000) {low}
    A = 24 - 4 = 20
3   B = 2   (10) C = 400 + 2(20)(2) + (2)(2) = 484  (1 1110 0100) {high}
    A = 20 + 2 = 22
4   B = 1    (1) C = 484 - 2(20)(1) + (1)(1) = 441  (1 1011 1001) {keep this}
    A = 22 - 1 = 21
5   B = 1/2 or 0 in integer math; end

コンピュータサイエンスへようこそ!ここでLaTeXを使用すると、より読みやすい方法で数学をタイプセットできます。簡単な紹介はこちらをご覧ください。
FrankW 2014

説明、このアルゴリズムがなぜ(そしてどのように)機能するかがいいでしょう。
FrankW 2014

0

主な方法は、ビットを左から右に入力しながら、推定値をその下に維持するか、下に推定値の2乗を入力することです。各ビットは2の累乗であるため、別の数値の2乗または乗算は常にビットシフトです。 NbbNNbb

現在の推定値が、でありすでにわかっいる場合、が得られ、2番目と3番目の項を書き換えることができますと。次に、それをすべて追加してテストし(はできると思います)、正方形がまだ未満の場合はビットを設定します。B = 2 、I 2+のB 2 = 2 + 2 、B + B 2 A < < I + 1 1 < < I < < 1 < I Nab=2ia2(a+b)2=a2+2ab+b2a<<(i+1)1<<(i<<1)<iN

ループを開始し、とを維持しながらゼロまでカウントダウンします。これは一種のバイナリ検索ですが、境界が単一ビットの差異にマッピングされるものです。2i=n/2=n>>1aa2


-3

私はアランキャンベルの答えが好きです。以前の推測を注意深く追跡することで、新しい減算は毎回簡単で、バイナリシフト加算平方根はバイナリシフト加算除算とほぼ同じくらい高速です。

しかし、次の推測を1つの2進数字にする代わりに、「Ab」x「Ab」アルゴリズムを使用して、次の推測を以前の推測の平均値にして、元の数を除算することにより、より高速になる可能性があります。以前の推測で。それは長くはかからないように聞こえます。ただし、分割は正確である必要はありません。したがって、除算が残りの桁数の平方根までしか実行されない場合は、実際に時間を節約できます。さらに、除算にフレンチメソッドを使用する場合、略式除算の場合、実際には非常に大きな除算の計算速度が多少低下する可能性があります。

さて、答えが見つかる前に予備的な修正可能な結果が得られる計算を並行して追加すると、何か問題が発生する可能性があります。


1
これらすべては非常に投機的に聞こえます。より明確な答えはありますか?
Yuval Filmus

これは長いコメントのように読みます。
ラファエル

@ラファエルまあ、それは部分的な答えです。それは非常に投機的であるため、良いものではありませんが、それはアランの答えの批評以上のものです。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.