平方根アルゴリズム

平方根アルゴリズムは、正の実数非負平方根を計算します。 自然数の平方根は完全平方数を除き、すべて無理数であるため、[1]平方根は通常、有限の精度でしか計算できません。これらのアルゴリズムは通常、精度が徐々に上がっていく一連の近似値を構築します。

ほとんどの平方根計算法は反復的です。適切な初期推定値 を選択した後、何らかの終了基準が満たされるまで反復的な改良が行われます。改良法の一つに、ニュートン法の特殊なケースであるヘロン法があります。除算が乗算よりもはるかにコストがかかる場合は、代わりに逆平方根を計算する方が望ましい場合があります。

平方根を桁ごとに計算する方法やテイラー級数を用いる方法もあります。平方根の有理近似値は、連分数展開を用いて計算できます。

採用される方法は、必要な精度、利用可能なツール、そして計算能力によって異なります。これらの方法は、暗算に適したもの、通常は少なくとも紙と鉛筆を必要とするもの、そしてデジタル電子計算機やその他の計算装置で実行されるプログラムとして実装されたものに大別されます。アルゴリズムは、収束性(指定された精度を達成するために必要な反復回数)、個々の演算(例えば除算)または反復の計算複雑性、そして誤差伝播(最終結果の精度)を考慮する場合があります。

紙と鉛筆による合成除算や級数展開など、いくつかの方法では初期値は必要ありません。一部の応用では、整数の平方根、つまり平方根を最も近い整数に丸めたり切り捨てたりした値が必要になります(この場合は、手順を修正する必要があります)。

歴史

平方根(特に2の平方根)を求める手順は、少なくとも紀元前17世紀の古代バビロニア時代から知られていました。 バビロニアの数学者たちは、1の後に60進法で3桁の数字を使って2の平方根を計算していましたが、その正確な方法は分かっていません。彼らは斜辺を(例えば、高さがロッド、幅がロッドの門の対角線を)近似する方法を知っていました。そして、同様の手法を用いて[2]の近似値を求めていた可能性があります。

1世紀エジプトのヘロン法は、平方根を計算するための最初の確認可能なアルゴリズムでした。[3]

現代の分析手法は、ルネサンス初期に西ヨーロッパにアラビア数字が導入されてから開発され始めました。 [要出典]

現在、ほぼすべてのコンピューティング デバイスには、プログラミング言語構造、コンパイラの組み込み関数またはライブラリ関数、あるいは説明した手順のいずれかに基づくハードウェア演算子として、高速かつ正確な平方根関数が備わっています。

初期見積もり

多くの反復平方根アルゴリズムでは、初期のシード値 が必要です。シードは 0 でない正の数値で、1 から (平方根を求める数)までの範囲でなければなりません。平方根はその範囲内になければならないからです。シードが平方根から大きく離れている場合、アルゴリズムはより多くの反復を必要とします。(または) で初期化すると、平方根の大きさのオーダーを取得するだけで、おおよそ 回の反復が無駄になります。したがって、精度は限られるかもしれませんが計算しやすい大まかな推定値を持つことは有用です。一般に、初期推定値が優れているほど、収束は速くなります。ニュートン法では、平方根よりいくらか大きいシードは、平方根よりいくらか小さいシードよりもわずかに速く収束します。

一般に、推定は根を含むことが分かっている任意の区間( など)に従います。推定は、区間 に対する関数近似の特定の値です。より良い推定値を得るには、区間のより厳しい境界を得るか、 に対するより良い関数近似を見つける必要があります。後者は通常、近似においてより高次の多項式を使用することを意味しますが、すべての近似が多項式であるとは限りません。一般的な推定方法には、スカラー、線形、双曲線、対数などがあります。暗算または紙と鉛筆による推定には、通常、10進法が使用されます。コンピュータによる推定には、2進法がより適しています。推定では、数値が科学的記数法で表されるため、 指数と仮数は通常別々に扱われます。

小数点推定

通常、数値は科学的記数法表されnは整数で、可能な平方根の範囲はです

スカラー推定

スカラー法では、範囲を区間に分割し、各区間の推定値は単一のスカラー値で表されます。範囲を単一の区間とみなす場合、算術平均(5.5)または幾何平均()の時間は妥当な推定値となります。これらの絶対誤差と相対誤差は異なります。一般的に、単一のスカラー値は非常に不正確です。より正確な推定値を得るには、範囲を2つ以上の区間に分割しますが、スカラー推定値は本質的に精度が低くなります。

2つの区間を幾何学的に分割した場合、平方根は次のように推定できる[注1]

この推定値は、a = 100 で最大絶対誤差が になり、a = 1 で最大相対誤差が 100% になります。

たとえば、 を として因数分解すると、推定値は となり、絶対誤差は 246、相対誤差はほぼ 70% になります。

線形推定

より良い推定値、そして標準的な方法は、小さな弧上の関数の線形近似です。上記のように、底のべき乗を数から因数分解し、区間を まで縮約した場合、弧を張る割線、または弧上のどこかにある接線を近似値として使用できますが、弧と交差する最小二乗回帰直線の方がより正確です。

最小二乗回帰直線は、推定値と関数の値の平均差を最小化します。その式は です。並べ替え、。計算を容易にするために係数を四捨五入します。

これは、区間 における関数 y=x 2の単一部分線形近似によって得られる平均的に最良の推定値である。a=100 において最大絶対誤差は1.2、S=1および10において最大相対誤差は30%である。[注 2]

10で割るには、 の指数から1を引くか、比喩的に小数点を1桁左に移動します。この定式化では、任意の加法定数1に小さな増分を加えることで十分な推定値が得られるため、正確な数値を覚えておくことは負担になりません。範囲を1本の直線で結んだ近似値(四捨五入の有無にかかわらず)は、有効桁精度1桁未満です。相対誤差は1/2 2より大きいため、得られる情報は2ビット未満です。範囲が2桁と、この種の推定値としては非常に大きいため、精度は大幅に制限されます。

区分線形近似(複数の線分で、それぞれが元の円弧の一部を近似する)を用いることで、はるかに正確な推定値を得ることができます。使用する線分の数が多いほど、近似値は向上します。最も一般的な方法は接線を用いることですが、重要なのは円弧をどのように分割するか、そして接線をどこに配置するかです。y  = 1からy = 100 までの円弧を分割する効果的な方法 は、幾何学的に分割することです。2つの区間の境界は、元の区間の境界である 1×100 の平方根、つまり [1, 2100 ] と [ 2100 ,100] となります。 3つの区間の場合、境界100の立方根、すなわち[1, 3√100 ]、[ 3√100 ,( 3√100)2]、[(3√100) 2,100 ]などです。2区間の場合、2√100 = 10となり、非常に便利な数です。接線は簡単に導出でき、x = √1 * √10およびx = √10 * √10にあります。これらの式は、 およびです。これを反転すると、平方根は、およびですしたがって場合

絶対誤差の最大値は区間の最大値であるa =10および100で発生し、それぞれ0.54および1.7です。相対誤差の最大値は区間の両端であるa =1、10、100で発生し、どちらの場合も17%です。17%、つまり0.17は1/10より大きいため、この方法では小数点以下の精度しか得られません。

双曲線推定

場合によっては、双曲線推定が有効な場合があります。双曲線も凸曲線であり、直線よりもy  =  x 2の円弧に沿っている可能性が高いためです。双曲線推定は浮動小数点除算を必要とするため、計算が複雑になります。区間x 2の近似最適双曲線近似は、y = 190/(10−x) − 20です。転置すると、平方根はx  = 10 − 190/(y+20)です。したがって

除算の精度は小数点1桁までで十分です。なぜなら、全体的な推定値はその精度しかなく、暗算で行うことができるからです。この双曲線推定値は、スカラー推定値や線形推定値よりも平均的に優れています。絶対誤差はa  = 100で最大1.58、相対誤差はa  = 10で最大となり、推定値3.67は3.16のルートより16.0%高くなります。ニュートン・ラプソン法を推定値10から開始して実行すれば、双曲線推定値と一致する3.66に到達するまでに2回の反復が必要です。75のようなより一般的なケースでは、双曲線推定値8.00はわずか7.6%低いだけであり、より正確な結果を得るには75から5回のニュートン・ラプソン法の反復が必要になります。

算術推定

区分線形近似に似ていますが、代数方程式ではなく算術演算のみを使用する方法では、掛け算表を逆に使用します。1から100までの数の平方根は1から10までの範囲にあります。したがって、25が完全な平方数(5 × 5)、36が完全な平方数(6 × 6)であることが分かっている場合、25以上36未満の数の平方根は5で始まります。他の平方数の間の数についても同様です。この方法では最初の桁は正しく計算されますが、1桁まで正確ではありません。例えば、35の平方根の最初の桁は5ですが、35の平方根はほぼ6です。

より良い方法は、範囲を正方形の中間で区切ることです。つまり、25から36の中間値である30.5までの数を5と推定し、30.5より大きく36までの数を6と推定します。[注3] この手順では、九九から2つの積の中間の境界値を求めるのに少し計算をするだけで済みます。境界値の参照表を以下に示します。

1つの最も近い正方形EST(東部基準時。
1
1 (= 1 2 )1
2.5
4 (= 2 2 )2
6.5
9 (= 3 2 )3
12.5
16 (= 4 2 )4
20.5
25 (= 5 2 )5
30.5
36 (= 6 2 )6
42.5
49 (= 7 2 )7
56.5
64 (= 8 2 )8
72.5
81 (= 9 2 )9
90.5
100 (= 10 2 )10
100

最後の演算は推定値kに10の累乗を2で割った値を掛けることです。つまり、

この方法では、最適な最初の桁に丸められるため、暗黙的に 1 桁の精度が得られます。

この方法は、ほとんどの場合、被演算子を囲む最も近い正方形間の補間によって3桁まで拡張できます。 の場合はおおよそ k に分数を加えた値となり、ak 2の差を2つの正方形の差で割った値となります。ここで

最終的な演算は、上記のように、結果に 10 の累乗を 2 で割って掛けることです。

kは小数で、Rは小数に変換する必要がある分数です。通常、分子は1桁、分母は1桁か2桁なので、小数への変換は暗算で行うことができます。

例: 75 の平方根を求めます。75 = 75 × 10 · 0なので、aは 75、nは 0 です。九九から、仮数の平方根は 8 の小数点何位でなければなりません。なぜなら、 aは 8×8 = 64 と 9×9 = 81 の間にあるため、 kは 8 です。何位はRの小数表現です。 分数Rは、分子が75 − k 2 = 11、分母が 81 − k 2 = 17 です。 11/17 は、 12/18 = 2/3 = .67 より少し小さいので、.66 と推測します (ここでは推測しても問題ありません。誤差は非常に小さいです)。最終的な推定値は8 + .66 = 8.66です。75を 3 桁有効にすると 8.66 なので、推定値は 3 桁有効で適切です。この方法を使用した推定値はすべて正確になるわけではありませんが、近い値になります。

バイナリ推定

コンピュータ内部で二進法で作業する場合、表すと、平方根はのように推定できる。

これは、3桁の係数を持つ最小二乗回帰直線です。最大絶対誤差は=2 で0.0408、最大相対誤差は=1 で3.0%です。係数が2のべき乗であるため、計算上都合の良い丸め推定値は以下のとおりです。

[注4]

最大絶対誤差は2で0.086、最大相対誤差はa = 0.5およびa = 2.0で6.1%となります。

の場合、2進近似は となるため推定値の絶対誤差は19、相対誤差は5.3%となります。相対誤差は1/2 4よりわずかに小さいため、推定値は4ビット以上まで良好です。

8ビットまでのの推定値は、の上位8ビットをテーブル参照することで得られます。ただし、ほとんどの浮動小数点表現では上位ビットは暗黙的に指定され、8ビットの下位ビットは丸められる必要があることに注意してください。テーブルは、256バイトの事前計算された8ビット平方根値です。例えば、1.8515625 10を表すインデックス 11101101 2の場合、エントリは 10101110 2で、これは 1.8515625 10の平方根である 1.359375 10を表します(8ビット精度(2桁以上の小数点以下桁数))。

ヘロン法

近似値を求める最初の明示的なアルゴリズムは、 1世紀ギリシャの数学者アレクサンドリアのヘロンにちなんでヘロン法と呼ばれ、彼は西暦60年の著書『メトリカ』でこの方法を説明しました[3]この方法はバビロニア法とも呼ばれます(斜辺を近似するバビロニア法と混同しないでください)が、この方法がバビロニア人に知られていたという証拠はありません

正の実数 が与えられたときx 0 > 0を任意の正の初期推定値とする。ヘロン法は、 所望の精度が達成されるまで繰り返し計算を行う。この式で定義される数列は、次のように収束する。

これはニュートン法を用いてを解くことと同等である。このアルゴリズムは二次収束性があり、 の正しい桁数は反復ごとにほぼ倍増する。[4]

導出

基本的な考え方は、正の実数の平方根に対して が過大評価されている場合は過小評価され、その逆もまた同様であるため、これら2つの数値の平均はより正確な近似値を提供すると合理的に期待できるというものです。(この主張の正式な証明は、算術平均と幾何平均の不等式に依存しており、平方根に関する記事で述べたように、この平均は常に平方根に対して過大評価され、収束が保証されることを示しています。)

より正確には、が の初期推定値でありが推定値の誤差である場合、二項式を次のように展開することができます。 そして、誤差項を解くと、

もし仮に

したがって、誤差を補正し、以前の推定値を次のように更新することができます 。計算された誤差は正確ではないため、これは実際の答えではありませんが、次回の補正で使用する新しい推定値となります。この更新プロセスは、所望の精度が得られるまで繰り返されます。

このアルゴリズムはp進数でも同様に機能しますが、実数の平方根をp進平方根と同一視するためには使用できません。たとえば、この方法を使用すると、実数では+3に収束しますが、 2 進数で は-3に収束する有理数のシーケンスを構築できます。

小数点以下のインポートDecimal localcontext getcontext     NumberType  =  int  |  float  |  Decimalデフsqrt_Heron (  s : 数値型 精度:  int  | なし = なし 推測:  NumberType  | なし = なし)  -> 小数点: 「」 任意の精度でヘロン・ニュートン法を使用して sqrt(s) を計算します。 パラメータ ---------- s : int | float | 小数点 平方根を計算する非負数。 精度: int、オプション 有効桁数。デフォルトは現在の小数点コンテキストです。 サポートされる最小精度は 2 です。 (精度 = 1 は、丸めの異常を回避するために許可されません。) 推測: int | float | Decimal、オプション 初期推測値。デフォルトは s / 2 です。 返品 ------- 小数点 指定された精度に丸められた sqrt(s) の近似値。 「」  s  ==  0 の場合:  小数点0 を返す s  = 小数( s )  s  <  0 の場合:  ValueErrorを発生させます( 「sqrt(s) は負の数に対して定義されていません。」)  精度  None の場合: precision  =  getcontext () . prec  # 指定されていない場合は現在のグローバルコンテキストを使用する # 最小精度を暗黙的に強制する  精度 ==  1 の場合: 精度 =  2 guess  =  Decimal ( s  /  2  if  guess  None  else  guess ) guard  =  25  # 内部の安定性のための一時的な追加桁 最大反復回数 =  10_000 # ローカルコンテキスト: 精度の変化を分離する  localcontext ()を ctxとして 使用: ctx . prec  = 精度 + ガード 推測 =  (推測 +  s  / 推測)  /  2  _が 範囲 ( max_iter )の場合: 次の推測 =  (推測 +  s  / 推測)  /  2 # 改善が十分に小さければ停止する  推測値 -  next_guess  <  Decimal ( f "1e- { precision } " )の場合: 壊す 推測 = 次の推測 それ以外  ArithmeticErrorが発生します( f "Heron法は{ max_iter }回の反復で収束しませんでした" ) # 目標精度に丸める(ガードを外す) ctx . prec  = 精度 戻り値 +次の推測

計算例

次の例は、sqrt_Heronさまざまな入力で関数 を実行する方法を示しています。

print ( f "1) { sqrt_Heron ( 125348 ,精度= 7 ,推測値= 600 ) } " ) print ( f "2) { sqrt_Heron ( Decimal ( '3.1415926535897932384626433832795028841971693993' )) } " ) print ( f "3) { sqrt_Heron ( 2 , 1_000_157 ) } " ) print ( f "4) { sqrt_Heron ( 2 , 10_000_005 , 1.414 ) } " ) print ( f "5) { sqrt_Heron ( 2 , 100_000_000 , 1 ) } "        

これにより、次の出力が生成されます。

1) 354.04522) 1.7724538509055160272981674833) 1.4142135623730950488016887242 ... 2697320257318491414938800048567428924) 1.4142135623730950488016887242 ... ... 8724805080541235727278721315897142625) 1.4142135623730950488016887242 ... ... ... 023678977744844723443287604232894971

広告1)

を7 桁の有効数字で計算する手順は次のとおりです。

したがって、有効数字は 7 桁(四捨五入)になります。

2)デフォルトの精度での計算(6回の反復ステップ) 。 [注 5]

3) 1,000,157桁までの計算(22回の反復ステップ) 。 [5]

4) 10,000,005桁までの計算(23回の反復ステップ) 。 [6]

広告 5) 1億桁までの計算(28回の反復ステップ) 。 [引用が必要]

妥当な初期推測であれば、それほど多くの反復は必要ないようです。

注記

49行目と54行目の説明

ヘロン法には次のような特性があります。

簡単に言うと、反復処理によって より大きい値が生成されると( の場合は直ちに、 の場合は 1 ステップ後に発生します)、後続の推定値はすべて を上回ったまま、毎回小さくなっていきます。つまり、シーケンスは に向かって「滑り落ち」、収束します。

プログラムの49行目では、guessは値 に設定されています。そしてコードの54行目では、は負の値にはなりません。

停止基準の正当性

連続推定値の差を利用することで、

停止基準として、この方法は近似値の列が真の値に向かって収束することを保証する。連続する差が十分に小さくなると、与えられた目標が達成される。重要な洞察は、絶対誤差

は、逐次改善の大きさに直接関係している。具体的には、線形収束または二次収束する反復法の場合、次のような定数が存在する。

この関係は、が減少するにつれて絶対誤差も小さくなることを意味します。したがって、が所定の閾値を下回った時点で反復処理を停止することで、実際の誤差が最大でもその閾値内に収まることが保証されます。

収束

100の平方根を求めるヘロン法の収束速度を、初期推定値を変えて比較した片対数グラフです。負の推定値は負の平方根に収束し、正の推定値は正の平方根に収束します。平方根に近い値ほど収束が速く、近似値はすべて過大評価されていることに注意してください。SVGファイルでは、グラフにマウスポインターを合わせると、その点が表示されます。

と仮定すると、任意の自然数に対して、相対誤差が 次のように定義され

すると、

したがって、収束が保証され、二次方程式となります。

収束の最悪のケース

上記の大まかな推定をバビロニア方式で使用する場合、最も精度の低いケースは昇順で次のようになります。

いずれにせよ、

丸め誤差は収束を遅くします。大きな丸め誤差を避けるため、計算する値の望ましい精度よりも少なくとも1桁多く残しておくことをお勧めします。

ハレー法

上記のプログラムでは、推定値(強調表示された行49と51)は、

推測 =  (推測 +  s  / 推測)  /  2# ... 次の推測 =  (推測 +  s  / 推測)  /  2

推測 *=  (推測 * 推測 +  3  *  s )  /  ( 3  * 推測 * 推測 +  s )# ... next_guess  =  guess  *  ( guess  *  guess  +  3  *  s )  /  ( 3  *  guess  *  guess  +  s )

この関数はハレー法のsqrt_Heron実装に変換され

ハレー法では推定値が必ずしも一方向に動くわけではないので、54行目は

 abs (推測値 - 次の推測値)  <  Decimal ( f "1e- {精度} " )の場合:

ハレー法は反復ごとに収束速度が速く(根への収束速度は3乗で、2乗よりも速い、反復ごとに5回の乗算(除算は3回の乗算としてカウント)が必要になります。5つの例の計算はそれぞれ4、14、15、19回の反復ステップで完了します。一方、ヘロン法では除算が1回、つまり乗算が3回で済むため、長期的にはヘロン法の方がわずかに優れています。

バクシャリ法

平方根の近似値を求めるこの方法は、バクシャーリ写本と呼ばれる古代インドの写本に記載されています。これは代数的にはヘロン法の2回の反復に等価であり、したがって4乗収束します。つまり、反復ごとに近似値の正しい桁数はほぼ4倍になります。[7]現代の記法を用いた元の表現は次のとおりです。 を計算するにはを の初期近似値とします。次に、次のように繰り返します。

と の値はヘロン法で計算される値と全く同じです。これを確認するには、ヘロン法の2番目のステップで と を計算します。と の定義を用いて分子を次のように並べ替えます。

これを用いて、整数から始めて平方根の有理近似値を構築することができます。がに近い整数でが絶対値が最小となる差である場合、最初の反復は次のように表すことができます。

バクシャリ法は分数根を含む任意の根の計算に一般化できる。[8]

バクシャリ法の後半部分は、ヘロン反復法のより簡略化された形式として繰り返し使用できると考える人もいるかもしれない。例えば、 である。しかし、これは数値的に不安定である。元の入力値 を参照しない場合、精度は の元の計算の精度によって制限され、すぐに不十分になってしまう。

ヘロン法の例と同じ例を用いると、最初の反復では次のようになる。

同様に、 2 回目の反復では が得られます。ヘロン法とは異なり、の式では の誤差が修正されないため、 は 8 桁で計算する必要があります

桁ごとの計算

これは、数列中の平方根の各桁を求める手法です。この手法は、1600年頃に発表されたフランソワ・ヴィエトの研究に由来しています。 [9]この手法は二項定理に基づいており、本質的には逆アルゴリズムで を解くものです。バビロニア法よりも時間がかかりますが、いくつかの利点があります。

  • 手動で計算する方が簡単になります。
  • 見つかったルートのすべての数字は正しいことがわかっているため、後で変更する必要はありません。
  • 平方根の展開が終了している場合、アルゴリズムは最後の桁が見つかった時点で終了します。したがって、与えられた整数が平方数であるかどうかを確認するために使用できます。
  • このアルゴリズムはどの基数でも機能しますが、当然、その進行方法は選択された基数によって異なります。

デメリットは次のとおりです。

  • 上位のルートでは管理できなくなります。
  • この方法では、不正確な推測や部分計算は許容されません。このようなエラーがあると、近似エラーを自己修正するニュートン法とは異なり、結果の次の桁がすべて間違ってしまいます。
  • 桁ごとの計算は理論上は十分効率的ですが、ソフトウェア実装にはコストがかかりすぎます。反復処理ごとに大きな数値が処理されるため、より多くのメモリを必要としますが、正解の桁は1桁分しか進みません。そのため、アルゴリズムは桁が増えるごとに時間がかかります。

ネイピアの骨には、このアルゴリズムの実行を支援する機能が含まれています。n乗根シフトアルゴリズムはこの手法の一般化です。

基本原則

まず、数Sの平方根を求めるケースを考えてみましょう。これは、10を底とする2桁の数XYの平方です。ここで、Xは十の位、Yは一の位です。具体的には、 S は3桁または4桁の小数点で構成されます。

桁ごとのアルゴリズムを開始するために、Sの桁を右から始めて 2 桁の 2 つのグループに分割します。つまり、最初のグループは 1 桁または 2 桁になります。次に、Xの値を、 X 2が最初のグループ以下となる 最大の桁として決定します。次に、最初のグループとX 2の差を計算し、それに 2 番目のグループを連結して 2 回目の反復を開始します。これは、 Sから減算することと同じで、 が残ります。 S' を10 で割り、さらに2Xで割って整数部分を保持し、Y を推測します。 2X を仮のYと連結し、それにYを掛けます。推測が正しければ、これは次を計算することと同じです。したがって、 S'と結果の差である剰余は0 になります。結果がS'より大きい場合は、推測値を 1 下げて、余りが 0 になるまで再試行します。これは答えが完全な平方根XYである単純なケースなので、アルゴリズムはここで停止します。

同じ考え方は、任意の平方根計算にも適用できます。Sの平方根をnの正の数の和として表すと、

基本的な恒等式を繰り返し適用することで、 右辺の項は次のように展開できる。

この式を使うと、s の値を順に推測することで平方根を求めることができます。数値が既に推測されていると仮定すると、上記の和の右辺のm番目の項は次のように与えられます。ここで、 はこれまでに求められた平方根のおおよその値です。ここで、新しい推測は それぞれ、以降のすべての項の合計、つまり剰余であり、すべての に対してとなるよう に初期化されます。正確な平方根が求められている場合は、s の合計が平方根の適切な近似値となり、 は近似誤差となります。

例えば、10進法では、 は プレースホルダー、係数 となります。平方根計算の任意のm番目の段階では、これまでに求められた近似根と総和項は次のように与えられます。

ここで の位の値は10の偶数乗なので、任意のm番目の段階において、剰余 の最上位桁のペア(その第1項は )のみを処理すればよい。以下のセクションでは、この手順を体系化する。

同様の方法を使用して、10 進数以外の記数法で平方根を計算できることは明らかです。たとえば、2 進数で桁ごとの平方根を求めることは、 の値が {0,1} のより小さな 2 進数セットから検索されるため、非常に効率的です。これにより、各段階で の値が の場合またはの場合のいずれかになるため、計算が高速になります。 の可能な選択肢が 2 つしかないという事実は、計算のm番目の段階での値を決定するプロセスも容易にします。これは、についてかどうかを確認するだけでよいためです。この条件が満たされている場合は を取り、そうでない場合は をとります。また、2 による乗算が左ビットシフトによって行われるという事実も、計算に役立ちます。

10進数(10進数)

元の数を小数で書きましょう。数字は長除法のアルゴリズムに似ており、長除法と同様に、根号は上の行に書きます。次に、小数点から始めて左右に数字を2つに分けます。根号の小数点は平方数の小数点の上に来ます。根号の1桁は平方数の各桁の上に来ます。

左端の数字のペアから始めて、各ペアに対して次の手順を実行します。

  1. 左から始めて、まだ使われていない最上位(左端)の2桁の数字を下ろし(すべての桁が使われている場合は「00」と書きます)、前のステップの余りの右側に書きます(最初のステップでは余りはありません)。つまり、余りに100を掛け、2桁を足します。これが現在の値cになります。
  2. 次のようにpyxを求めます
    • これまでに求めた根の一部をp、小数点を無視します。(最初のステップではp = 0です。)
    • となる最大の数字xを決定します。新しい変数y = x (20 p + x )を使用します。
      • 注: 20 p + xは単にp を2 倍して、右側に数字xを追加したものです。
      • 注: x は、 c /(20· p ) を推測し、 yを試算して、必要に応じてx を上下に調整することで求めることができます。
    • その数字を根号の次の数字、つまり先ほど下ろした平方根の2つの数字の上に置きます。つまり、次のp は元のpに10を掛けたものにx を加えたものになります
  3. cからyを引いて新しい剰余を作成します。
  4. 余りがゼロで、下げる桁がもうない場合、アルゴリズムは終了します。そうでない場合は、ステップ1に戻って次の反復処理に進みます。

152.2756 の平方根を求めます。

  1 2. 3 4 / \/ 01 52.27 56 01 1*1 <= 1 < 2*2 x=1 01 y = x*x = 1*1 = 1 00 52 22*2 <= 52 < 23*3 x=2 00 44 y = (20+x)*x = 22*2 = 44 08 27 243*3 <= 827 < 244*4 x=3 07 29 y = (240+x)*x = 243*3 = 729 98 56 2464*4 <= 9856 < 2465*5 x=4 98 56 y = (2460+x)*x = 2464*4 = 9856 00 00 アルゴリズム終了: 答え=12.34

二進法(基数2)

このセクションでは、上記の桁ごとの計算セクションの形式論を使用しますが、わずかに異なり、 または 各 について としますからまですべての を反復し、値が決定されたすべての の合計である近似解 を構築します。 が または に等しいかどうかを判断するために、 とします(つまり、 を含む近似解の平方が対象の平方を超えない)場合は、そうでない場合は、 です。各ステップで平方することを避けるために、差を保存し、で を設定することで増分的に更新します。最初は、最大の を設定します



追加の最適化として、がゼロでない場合の 2 つの項である と を別々の変数、に格納します

各ステップで効率的に更新できます。

注意してください:これは以下の関数で返される最終結果です。

実装

Pythonプログラムは を計算します。このアルゴリズムは整数平方根を桁ごと(ビットごと)に計算する方法です。[10]

def isqrt ( x : int ) -> int : assert x >= 0 , "sqrt 入力は非負である必要があります"          op :  int  =  x  # X_(n+1)  res :  int  =  0  # c_n # d_n は 4 の最大の累乗 <= n から始まります one :  int  =  1  while  one  <=  op :  one  <<=  2  # これで 'one' が 4 の最大の累乗になります <= x  one  >>=  2 # dₙ … d₀ の 場合、  one  !=  0 の場合:  op >= res + one の場合: # X_(m+1) ≥ Y_m の場合、a_m = 2^m op -= res + one # X_m = X_(m+1) - Y_m res += 2 * one # c_m = c_m + 2*d_m res //= 2 # c_(m-1) = c_m / 2 one //= 4 # d_(m-1) = d_m / 4                           # c_(-1) 戻り 

2進数や10進数、その他の基数を用いたより高速なアルゴリズムは、ルックアップテーブルを使用することで実現できます。これは、実質的に、より多くのストレージスペースと引き換えに実行時間を短縮することになります[11]

指数関数的恒等式

ポケット電卓には通常、指数関数自然対数を計算するための優れたルーチンが実装されており、対数( )と指数関数の性質を用いて得られる恒等式を用いてSの平方根を計算します分数の分母はn乗根に対応します。上記の例では分母が2であるため、この式は平方根を求めることを示しています。対数表計算尺を用いて平方根を計算する場合も、同じ恒等式が使用されます

2変数反復法

この方法は の平方根を求めるのに適用でき、 は に対して最もよく収束します。しかし、これはコンピュータベースの計算では実際の制限にはなりません。2 を基数とする浮動小数点数および固定小数点数表現では、指数を変更するかシフトすることにより、それぞれ 4 の整数乗、したがって対応する 2 の累乗を乗算するのは簡単です。したがって、 はの範囲に移動できます。さらに、以下の方法では一般的な除算は使用せず、2 の累乗による加算、減算、乗算、除算のみを使用します。これらも簡単に実装できます。この方法の欠点は、バビロニア法などの単一変数反復法とは対照的に、数値誤差が蓄積することです。

このメソッドの初期化ステップは、反復ステップが次に(while ) を読み取りながら行われます。

の収束は2 次式です。したがって の収束も2 次式です。

この方法の証明は比較的簡単です。まず、 の反復定義を と書き直します。すると、 が であることが帰納法によって簡単に証明できます 。したがって、 が目的の結果に収束することは、 が 0 に収束することによって保証され、これは から導かれます

この手法は1950年頃にMVウィルクスDJホイーラーS.ギル[12]によって、世界初の電子計算機の一つであるEDSACで使用するために開発されました[13]この手法は後に一般化され、平方根以外の計算も可能になりました。[14]

逆平方根の反復法

以下は、Sの逆平方根を求めるための反復法です。逆平方根が求められたら、単純な乗算でを求めます。これらの反復処理では乗算のみが行われ、除算は行われません。そのため、バビロニア法よりも高速です。ただし、安定していません。初期値が逆平方根に近くない場合、反復処理は逆平方根に収束するのではなく、そこから発散してしまいます。したがって、これらの方法を適用する前に、バビロニア法の反復処理を大まかな推定値に対して実行することが有利な場合があります。

  • ニュートン法をこの方程式に適用すると、ステップごとに 3 回の乗算を使用して二次収束する方法が生成されます。
  • もう1つの反復は、ハレー法(ハウスホルダー法の2次の方法)によって得られる。これは3次収束するが、反復ごとに5回の乗算が必要となる。[注6]
  • 固定小数点演算を行う場合、3倍と8除算はシフトと加算を用いて実装できます。浮動小数点を使用する場合、ハレー法は、他のすべての定数を事前に計算して調整することで、反復ごとに4回の乗算に削減できます

ゴールドシュミットのアルゴリズム

ゴールドシュミットのアルゴリズムは、ロバート・エリオット・ゴールドシュミットにちなんで名付けられたゴールドシュミット除算の拡張であり、 [15] [16]平方根の計算に使用できます。一部のコンピュータでは、ゴールドシュミットのアルゴリズムを使用して、とを同時に計算します。ゴールドシュミットのアルゴリズムは、融合積和命令とパイプライン型浮動小数点ユニットまたは2つの独立した浮動小数点ユニットを備えたコンピュータ上で、ニュートン・ラプソン反復法よりも高速に計算を実行します。[17]

ゴールドシュミットのアルゴリズムの最初の書き方は

(通常はテーブル検索を使用)

が1に十分近づくまで、あるいは一定回数の反復処理を繰り返します 。反復処理は と に収束します。計算からと のいずれかを省略することも可能です。また 、両方が必要な場合は、各反復処理で を計算するのではなく、最後に を使用します。

2番目の形式は、融合乗算加算演算を使用して始まります。

(通常はテーブル検索を使用)

が0に十分近づくまで、あるいは一定回数の反復を繰り返す 。これは収束し

テイラー級数

Nが の近似値である場合、平方根関数のテイラー級数を使用することでより良い近似値を求めることができます

反復法であるため、収束の次数は使用される項の数に等しくなります。項が2つの場合、バビロニア法と同等です。項が3つの場合、各反復はバクシャーリ近似とほぼ同じ演算数を必要としますが、収束速度はより遅くなります。[要出典]したがって、これは特に効率的な計算方法ではありません。収束速度を最大化するには、Nを可能な限り小さくするように選択します。

連分数展開

実数の連分数表現は、その 10 進数または 2 進数展開の代わりに使用できます。この表現には、有理数 (完全な平方数ではない) の平方根が、10 進数表記法で有理数が繰り返し展開されるのと同様に、周期的な繰り返し展開を持つという特性があります。

二次無理数( abcが整数である形の数)、特に整数の平方根は、周期的な連分数を持つ。平方根の数値を求めるのではなく、連分数展開、つまり有理数近似を求めることが必要な場合もある。平方根を求める正の数をSとする。a初期推定値、rを剰余項とすると、次のように書ける。となるので、 Sの平方根は次のように 表せる。

この式を分数の分母に適用すると、次のようになります。

コンパクト記法

連分数の分子・分母展開(上記)は、記述もテキストフォーマットシステムへの埋め込みも面倒です。そこで数学者は、次のような いくつかの代替表記法を考案しました一般化連分数 § 表記法 を参照) 。

全体を通すと、さらに簡潔な表記は次のようになります。[注 7]連分数の繰り返し(非完全平方の平方根はすべて繰り返します)の場合、繰り返し部分は1回だけ表され、上線は上線部分の終わりのない繰り返しを示します。[注 8]

√2場合、 の値は1なので、その表現は次のようになります。

この方法を続けると、平方根の一般化された連分数は次のように表せる。

このような分数[18]を評価して根を求める最初のステップは、根を求める数と選択した分母の数を数値的に代入することです。例えば、標準形ではは1であり、√2 の場合は1なので、分母が3つの場合の数値連分数は次のようになります。

ステップ2では、連分数を一つずつ下から上へ約分し、分子と分母が整数である有理分数にします。約分は次のように行われます(最初の3つの分母を取ります)。

最後に (手順 3)、有理分数の分子を分母で割って、根のおおよその値を取得します。これは 3 桁の精度に丸められます。

√2の実際の値は有効数字3桁で1.41です。相対誤差は0.17%なので、有理分数はほぼ3桁の精度で計算できます。分母の数を増やすほど、より正確な近似値が得られます。分母を4つにすると分数 となり、ほぼ4桁の精度で計算できます。

以下は、平方根、その単純な連分数、および分母 99 までの 最初の項 (収束項と呼ばれる) の例です。

√S~小数点連分数収束
√21.41421
√31.73205
√52.23607
√62.44949
√103.16228
1.77245
1.64872
1.27202

一般に、有理分数の分母が大きいほど、近似値は良くなります。また、連分数を切り捨てると、その分母が分母以下の分数の根に最も近似する有理分数が得られることも示されています。例えば、分母が70以下の分数は、99 /70ほど√2に近似できません。

浮動小数点表現に依存する近似値

数値は浮動小数点形式で表され、これは科学的記数法とも呼ばれます。その平方根は で、立方根や対数にも同様の公式が適用されます。一見すると、これは簡潔さの向上にはならないように見えますが、近似値のみが必要な場合を考えてみましょう。その場合、 は1桁まで適切です。次に、いくつかのべき乗pが奇数になることを認識してください。つまり、3141.59 = 3.14159 × 10です。3底の分数乗を扱うのではなく、仮数部に底を掛け、その乗数から1を引いて偶数にします。調整された表現は31.4159 × 102なので平方根は√31.4159 × 10となる。1 .

調整仮数の整数部を取る場合、値は1から99までしか取れません。これは、99個の事前計算された平方根の表へのインデックスとして使用し、推定値を完成させることができます。16進数のコンピュータではより大きな表が必要になりますが、2進数のコンピュータでは3つのエントリしか必要ありません。調整仮数の整数部の可能なビットは01(べき乗が偶数なのでシフトは発生しません。正規化された浮動小数点数は常に上位桁が0以外の値を持つことを覚えておいてください)または、べき乗が奇数の場合は10または11で、これらは元の仮数の最初の2ビットです。したがって、6.25 = 110.01 は 2 進数で 1.1001 × 2 2に正規化されて偶数累乗になり、仮数部のペアビットは 01 になります。一方、.625 = 0.101 は 2 進数で 1.01 × 2 −1の奇数累乗に正規化されるため、調整は 10.1 × 2 −2になり、ペアビットは 10 になります。累乗の下位ビットがペア仮数の上位ビットに反映されることに注意してください。偶数累乗の下位ビットは 0 で、調整された仮数は 0 で始まりますが、奇数累乗の下位ビットは 1 で、調整された仮数は 1 で始まります。したがって、累乗が半分になると、下位ビットがシフトされてペア仮数部の最初のビットになるかのようになります。

3つのエントリしかないテーブルは、仮数部のビットを追加することで拡張できます。しかし、コンピュータでは、テーブルに補間を計算するよりも、同等の結果をもたらすより単純な計算を見つける方が多くの場合効果的です。すべては、表現形式の正確な詳細と、数値の各部分にアクセスして操作するためにどのような演算が利用可能かに依存します。例えば、Fortranにはべき乗を求める関数がありますEXPONENT(x)。良好な初期近似値を求めるために費やされた労力は、粗悪な近似値を求めるために必要となるであろう改良プロセスの追加の反復を回避することで回収されます。これらの反復は少ないため(1回の反復で除算、加算、2分の1が実行される)、制約は厳格です。

多くのコンピュータはIEEE(または十分に類似した)表現に従っており、ニュートン法の出発点として平方根の近似値を非常に高速に得ることができます。ここで説明する手法は、浮動小数点形式(2を底とする)が2を底とする対数を近似するという事実に基づいています。つまり、

したがって、IEEE形式の32ビット単精度浮動小数点数(特に、表現された形式では累乗に127のバイアスが加えられている)の場合、そのバイナリ表現を32ビット整数として解釈し、それを でスケーリングし、127のバイアスを除去することで、近似対数を得ることができます。

例えば、1.0 は16進数 0x3F800000 で表されますが、これを整数にすると となります。上記の式を用いると、 から期待される が得られます。同様に、1.5 (0x3FC00000) から 0.5 が得られます。

平方根を求めるには、対数を2で割り、その値を元の値に戻します。次のプログラムはこの考え方を示しています。指数の最下位ビットは意図的に仮数部に伝播するようにしています。このプログラムの手順を正当化する一つの方法は、指数バイアスを 、仮数部に明示的に格納されているビット数を と仮定し、次の式を示すことです。

/* float は IEEE 754 単精度浮動小数点形式であると想定します */ #include <stdint.h> ユニオンFloatUInt { float f ; uint32_t i ; }      float sqrtapprox ( float z ) { union FloatUInt val = { z }; // ビット パターンを維持しながら型を変換します/*  * 次のコードを正当化するには、次の式を証明してください。 *  * ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2) * 2^m)  *  * ここで 、 *  * b = 指数バイアス * m = 仮数ビット数 */ val . i -= 1 << 23 ; // 2^m を減算します。val . i >>= 1 ; // 2 で割ります。val . i += 1 << 29 ; // ((b + 1) / 2) * 2^m を加算します。                   // float として再度解釈しますreturn val . f ; } 

上記の関数の中核を成す3つの数学演算は、1行で表現できます。さらに調整を加えることで、最大相対誤差を低減できます。したがって、キャストを除く3つの演算は、次のように書き直すことができます。

val.i = ( 1 << 29 ) + ( val.i >> 1 ) - ( 1 << 22 ) + a ;              

ここで、 aは近似誤差を調整するためのバイアスです。例えば、a = 0 の場合、2の偶数乗(例:1.0)では正確な結果が得られますが、他の数値では結果がわずかに大きくなります(例:2.0の場合、1.414ではなく1.5となり、誤差は6%になります)。a = −0x4B0D2 の場合最大相対誤差は±3.5%に最小化されます。

近似値を方程式に対するニュートン法の初期推定値として使用する場合は、次のセクションに示す逆数形式が推奨されます。

平方根の逆数

上記のルーチンの派生版を以下に掲載します。これは平方根の逆数を計算するために使用できます。つまり、グレッグ・ウォルシュによって書かれたものです。整数シフト近似により相対誤差は4%未満となり、次の行でニュートン法を1回反復することで誤差はさらに0.15%まで減少しました。 [19]コンピュータグラフィックスにおいて、これはベクトルを正規化する非常に効率的な方法です。

ユニオンFloatInt { float x ; int i ; };      float inv_sqrt ( float x ) { float xhalf = 0.5f * x ; union FloatInt u ; u . x = x ; u . i = 0x5f375a86 - ( u . i >> 1 ); // 次の行は、精度を上げるために任意の回数繰り返すことができますu . x = u . x * ( 1.5f - xhalf * u . x * u . x ); return u . x ; }                                    

一部のVLSIハードウェアでは、2次多項式推定とそれに続くゴールドシュミット反復法を使用して逆平方根を実装しています[20]

負の平方または複素平方

S < 0の場合 、その主平方根は

S  =  a + biabは実数、b ≠ 0)とすると 、その主平方根は

これはルートを二乗することで検証できる。[21] [22]ここで

はSである。複素数の主平方根は、実部が非負である根として定義される。

参照

注記

  1. ^ 係数 2 と 6 は、指定された桁数で可能な最小値と最大値の幾何平均を近似するため使用ます
  2. ^ 四捨五入していない推定値の最大絶対誤差は100で2.65、最大相対誤差はy=1、10、100で26.5%である。
  3. ^ 数字が2つの平方数のちょうど中間、例えば30.5の場合は、大きい方の数字を推測します。この場合は6です。
  4. ちなみに これは、 y = 1におけるy  =  x 2の接線の方程式です 。
  5. ^ デフォルトの精度は1からdecimal.MAX_PREC
  6. ^ 上記参照。
  7. ^ 参照:連分数#表記法
  8. ^ 参照:周期連分数

参考文献

  1. ^ ジャクソン 2011.
  2. ^ ファウラー&ロブソン 1998.
  3. ^ ab Heath 1921より。
  4. ^ ジョンソン 2015.
  5. ^ ネミロフ&ボネル 1994.
  6. ^ ネミロフ&ボネル 1994a.
  7. ^ ベイリー&ボーウェイン 2012.
  8. ^ シンプリーキュリアス 2018.
  9. ^ Herrero Piñeyro, PJ; Linero Bas, A.; Massa Esteve, MR; Mellado Romero, A. (2023). 「Vièteの研究に基づくn根近似値に関する問題」(PDF) . MATerials MATemàtics . 5 : 1– 27. 2025年11月15日閲覧8ページをご覧ください。
  10. ^ ガイ 1985.
  11. ^ スタイナーソン、コービット、ヘンドリー、2003.
  12. ^ ウィルクス、ホイーラー、ギル 1951年、146ページ。
  13. ^ キャンベル・ケリー 2009.
  14. ^ ガワー 1958.
  15. ^ Goldschmidt, Robert E. (1964). 収束による除算の応用(PDF) (論文). 理学修士論文. MIT OCLC 34136725. 2015年12月10日時点のオリジナルより アーカイブ(PDF) . 2015年9月15日閲覧
  16. ^ 「著者」. IBM Journal of Research and Development . 11 : 125–127 . 1967. doi :10.1147/rd.111.0125. 2018年7月18日時点のオリジナルよりアーカイブ。
  17. ^ マークスタイン 2004.
  18. ^ サルディナ 2007、10頁、2.3j。
  19. ^ ロモント 2003.
  20. ^ ピニェイロ & ディアス・ブルゲラ 2002.
  21. ^ アブラモヴィッツ & ステガン 1970、p. 17、セクション 3.7.26。
  22. ^ クック2008、59ページ。

参考文献

  • アブラモウィッツ、ミルトンステガン、アイリーン・A. 編 (1970) [1964].数式、グラフ、数表付き数学関数ハンドブック. 応用数学シリーズ55(第9刷). ワシントンD.C.:ドーバー出版. ISBN 978-0-486-61272-0LCCN  64-60036。MR 0167642  。
  • ベイリー、デイビッド、ボルウェイン、ジョナサン(2012). 「古代インドの平方根:法医学的古数学の演習」(PDF) .アメリカ数学月刊誌. 第119巻第8号. 646–657頁 . 20179月14日閲覧.
  • キャンベル=ケリー、マーティン(2009年9月)「コンピューティングの起源」サイエンティフィック・アメリカン誌301 (3): 62–69 . Bibcode :2009SciAm.301c..62C. doi :10.1038/scientificamerican0909-62. JSTOR  26001527. PMID  :19708529.
  • クック、ロジャー(2008年)『古典代数学:その性質、起源、そして用途』ジョン・ワイリー・アンド・サンズ社、ISBN 978-0-470-25952-8
  • ファウラー、デイビッド;ロブソン、エレノア (1998). 「古バビロニア数学における平方根近似:YBC 7289の文脈」(PDF) . Historia Mathematica . 25 (4): 376. doi : 10.1006/hmat.1998.2209 .
  • ガワー, ジョン・C. (1958). 「根抽出のための反復法に関するノート」.コンピュータジャーナル. 1 (3): 142–143 . doi : 10.1093/comjnl/1.3.142 .
  • ガイ、マーティン (1985). 「ウー氏のアバカスアルゴリズムによる高速整数平方根」. ケント大学カンタベリー校 (UKC). 2012年3月6日時点のオリジナルよりアーカイブ。 2025年10月5日閲覧
  • ヒース、トーマス(1921年)『ギリシャ数学史』第2巻、オックスフォード:クラレンドン・プレス、323-324頁。
  • ジャクソン、テレンス (2011年7月1日). 「95.42 自然数の無理平方根 ― 幾何学的アプローチ」 . The Mathematical Gazette . 95 (533): 327– 330. doi :10.1017/S0025557200003193. ISSN  0025-5572. S2CID  123995083.
  • Johnson, SG (2015年2月4日). 「ニュートン法による平方根」(PDF) . MITコース18.335: 数値解析入門. 2025年10月12日閲覧.
  • ロモント、クリス (2003).「高速逆平方根」(PDF) .
  • Markstein, Peter (2004年11月). Goldschmidtアルゴリズムを用いたソフトウェアによる除算と平方根(PDF) . 第6回実数とコンピュータに関する会議.ドイツ、ダグストゥール. CiteSeerX  10.1.1.85.9648 .
  • ロバート・ネミロフ、ジェリー・ボンネル (1994). 「2の平方根を100万桁まで」NASA Astronomy Picture of the Day . 2025年10月21日閲覧
  • ロバート・ネミロフ、ジェリー・ボンネル (1994a). 「2から1000万桁までの平方根」NASA Astronomy Picture of the Day . 2025年10月21日閲覧
  • Piñeiro, José-Alejandro; Díaz Bruguera, Javier (2002年12月). 「逆数、除算、平方根、逆平方根の高速倍精度計算」IEEE Transactions on Computers . 51 (12): 1377– 1388. Bibcode :2002ITCmp..51.1377P. doi :10.1109/TC.2002.1146704.
  • サルディーナ、マニー (2007).「(折り畳み)連分数を用いた根の一般的な抽出法」サリー(英国)
  • Simply Curious (2018年6月5日). 「バクシャーリー写本に屈する」. Simply Curious ブログ. 2020年12月21日閲覧
  • スタイナーソン、アーン。ダン、コービット。ヘンドリー、マシュー (2003)。 「整数平方根関数」。
  • Wilkes, MV ; Wheeler, DJ ; Gill, S. (1951). 『電子デジタル計算機のためのプログラムの作成法』Oxford: Addison-Wesley. p. 262. OCLC  475783493.
  • ワイスタイン、エリック・W.「平方根アルゴリズム」。MathWorld
  • Jarvis, AF「減算による平方根」(PDF) . afjarvis.staff.shef.ac.uk . 2022年4月10日時点のオリジナル(PDF)からアーカイブ。
  • ラドヴィッチ、アンドリヤ。 「整数平方根アルゴリズム」。アンドリジャル.com 2025 年11 月 7 日に取得
  • エグバート, ウィリアム・E. (1977年5月). 「パーソナル電卓アルゴリズム I: 平方根」(PDF) .ヒューレット・パッカード・ジャーナル: 22–24 . 2025年11月7日閲覧
  • 「平方根を学ぶための計算機」. calculatorsquareroot.com . 2025年11月7日閲覧
Retrieved from "https://en.wikipedia.org/w/index.php?title=Square_root_algorithms&oldid=1322935894"