contribute by < kdnvt
>
11
雖然教授問答的時候是從二進位的角度去想,但我第一次看到類似的原理其實是從十進位的直式開方法。不過直式開方法所有進位都適用,所以從十進位的想法轉成二進位也沒有很難。
直式開方法是把要開方的數拆成二的冪相加(如果是十進位就是十的冪),就可以拆成以下的形式:
上面的 為 bits pattern 。
為最高位的 1 ,
寫成數學式如下:
最後的形式為 的相加,而這每一項其實就是程式中每一輪迴圈
要判斷並可能減掉的 b
。
以下大致講解原理:
迴圈從 0 開始。
為每個第 個迴圈一開始的 y
值。
為每個第 個迴圈一開始的 m
值。
為 。
因為確定 是最高位不為零,所以
而每經過一輪 會右移兩位,他的平方根 就等於右移一位:
如果此時 的結果小於當前的 ,代表 的展開式中 這項不為零,也就是 。將 右移一位後加上 ,就會變成
而如果此時 的結果大於當前的 x ,代表 的展開式中 這項等於零,也就是 。將 右移一位後就會變成
照同樣的原理推下去可以發現, 其實就等於 。因為不是所有的 ,所以我用另一個變數 來表達原式中的部份, ,如果 也就是 ,則 會等於 而且下圖的 會等於 :
每一輪迴圈就是判斷 有沒有 並更新 ,
到了最後的 , 會先往右移變成 ,在加上最後的 ,變成 ,就是我們要求的平方根。