開平法

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

開平法(かいへいほう, extraction of square root)とは、平方根小数表示を求めていくアルゴリズムである。開平とも。平方根を求めることを開平するという。開法の一種。

目次

数式による開平法 [編集]

開平法は筆算を用いる方法が効率的でよく使われるが、ここでは原理も含めて数式による求値法を説明する。以下は十進法表記の場合だが、他の位取り記数法でも同様な計算で求められる。ここで述べるのと基本的には同じ方法で、立方根を求める開立法や、もっと一般に n 乗根を求めることも可能である。

単に筆算による手順を知りたいだけの場合は、筆算による開平法の計算例を参照するだけでよい。

帰納的方法 [編集]

x > 0 に対し、√x が次のように表されているとする。

\sqrt{x} =\sum_{k\le n} 10^k a_k =10^n a_n +10^{n-1} a_{n-1} +\cdots +10^2 a_2 +10a_1 +a_0 +10^{-1} a_{-1} +10^{-2} a_{-2} +\cdots

ここで、各 ak は 0 から 9 までの整数とする。

n は十分大きな整数で構わないが、knak = 0 が続くだけで意味がないので、nan ≠ 0 すなわち 102nx を満たす最大の整数とする。

ある整数 m があって、ak (k > m) の値、すなわち

p_m =\sum_{k=m+1}^n 10^{k-m-1} a_k =10^{n-m-1} a_n +10^{n-m-2} a_{n-1} +\cdots +10a_{m+2} +a_{m+1}

は分かっているとする。

am の満たすべき条件は、

10m+1pm + 10mam ≤ √x < 10m+1pm + 10m(am + 1)

すなわち

(20pm + am)am ≤ 10−2mx − 100pm2 < {20pm + (am + 1)}(am + 1)

である。これを満たす am を見つける。

この段階では、am の値を地道に探す必要があるが、am は 0 から 9 までの整数のいずれかなので、多くても 10 通りの値を考えればよい。
m = n のとき、pn = 0 より
an2 ≤ 10−2nx
m < n のとき、
20pmam ≤ (20pm + am)am ≤ 10−2mx − 100pm2 < {20pm + (am + 1)}(am + 1)
pm ≠ 0 より
a_m \le \frac{10^{-2m} x-100{p_m}^2}{20p_m} <\left( 1+\frac{1}{2p_m} \right) (a_m +1)
右辺の計算値により、am のおよその値の見当を付けることができる。
正方形ABCD の面積は 10−2mx, 青い正方形の面積は 100pm2 で、橙色と桃色の部分の面積の和が (20pm + am)am = rm である。 pm の値はすでに決まっていて、 am をどこまで大きく取れるのかが問題である。

これにより am が求まれば、次は、

pm−1 = 10pm + am

の値が分かるので、

(20pm−1 + am−1)am−1 ≤ 10−2(m−1)x − 100pm−12

を満たす最大の am−1 を見つければよい。

このようにして、帰納的に ak (kn) の値が求まる。

計算の簡略化 [編集]

計算の簡略化のために、

qm = 2pm
ym = 10−2mx − 100pm2
rm = (10qm + am)am

とおき、漸化式を立てて求めていくことを考える。

qm = 10qm+1 + 2am+1
ym = 10−2mx − 100pm2 = 100{10−2(m+1)xpm2}
      = 100{10−2(m+1)x − (10pm+1 + am+1)2}
      = 100{10−2(m+1)x − 100pm+12 − (20pm+1 + am+1)am+1}
      = 100(ym+1rm+1)

am, rm を求めたいが、am の満たすべき条件は

(10qm + am)amym < {10qm + (am + 1)}(am + 1)

である。

左辺は rm に等しいが、am, rm を探しにくくなるので、この不等式では rm に置き換えない。

この不等式の左辺は整数なので、条件としては ym の小数部分は無視してよい。

ym の整数部分を zm とすると、zm は 100(ym+1rm+1) の整数部分に等しい。

x=\sum_{i\le j} 10^i x_i \ (0\le x_i \le 9)

と表されているとすると、100ym+1 = 10−2mx − 10000pm+12 の整数部分は 100zm+1 + 10x2m+1 + x2m である。したがって

zm = (100zm+1 + 10x2m+1 + x2m) − 100rm+1
      = 100(zm+1rm+1) + 10x2m+1 + x2m

が成り立つ。

am を求めるには、ymzm に代えた不等式

(10qm + am)amzm < {10qm + (am + 1)}(am + 1)

で考えればよい。これから

rm = (10qm + am)am

が求まる。

計算例 [編集]

計算例として x = 5630738.132 の平方根を求める。ここで使う式は

  • x=\sum_{i\le j} 10^i x_i
  • \sqrt{x} =\sum_{k\le n} 10^k a_k
  • qm = 10qm+1 + 2am+1
  • zm = 100(zm+1rm+1) + 10x2m+1 + x2m
  • (10qm + am)amzm < {10qm + (am + 1)}(am + 1)
  • rm = (10qm + am)am

初期値として、

  • x6 = 5, x5 = 6, x4 = 3, x3 = 0, x2 = 7, x1 = 3, x0 = 8, x−1 = 1, x−2 = 3, x−3 = 2, これら以外の xj の値は全て 0
  • 106x < 108 より、an ≠ 0 を満たす最大の nn = 3
  • k > 3 のとき ak = 0
  • q3 = 0
  • y4 = 0 より z4 = 0
\sqrt{x} =\sum_{k\le 3} 10^k a_k =10^3 a_3 +10^2 a_2 +10a_1 +a_0 +10^{-1} a_{-1} +10^{-2} a_{-2} +\cdots

の各位 ak (k ≤ 3) を求めていく。

初期値より、q3 = 0, z3 = 10x7 + x6 = 5

a32z3 < (a3 + 1)2

を満たす a3 を探すと、a3 = 2 が見つかる。

r3 = (10q3 + a3)a3 = 4
q2 = 2a3 = 4
z2 = 100(z3r3) + 10x5 + x4 = 163
(10q2 + a2)a2z2 < {10q2 + (a2 + 1)}(a2 + 1)

を満たす a2 を探すと、a2 = 3 が見つかる。

r2 = (10q2 + a2)a2 = 129
q1 = 10q2 + 2a2 = 46
z1 = 100(z2r2) + 10x3 + x2 = 3407
(10q1 + a1)a1z1 < {10q1 + (a1 + 1)}(a1 + 1)

を満たす a1 を探すと、a1 = 7 が見つかる。

同様の計算を繰り返すと、各項の値は次の表のようになる。

m qm zm am rm
3 0 5 2 4
2 4 163 3 129
1 46 3407 7 3269
0 474 13838 2 9484
−1 4744 427041 9 435413
−2 47458 474581 1 837220
−3 474582 33220789 7 36263900
−4 4745834 284750076 6 304311100
−5 47458352 1898334096 4 1956102400

am の列から

5630738.132 = 2372.91764…

である。

筆算による開平法 [編集]

開平法は、筆算を用いるとさらに簡単に計算できる。

筆算を用いた略記 [編集]

rmqm−1 の式を比べると、式の形が似ていることが分かる。

  • rm = (10qm + am)am
  • qm−1 = 10qm + 2am = (10qm + am) + am

rmqm−1 は 10qm + amam のそれぞれかけ算と足し算である。

例えば、q−1 = 4744, a−1 = 9 ならば、

47449 47449
×        9 +        9
r−1 = 427041 q−2 = 47458

と計算できる。

この2つの筆算を1つにまとめて

47449
                                9
r−1 = 427041  q−2 = 47458

と書き、r−1 の値は、z−2 の計算に用いるので他の所へ書く。

さらに、qm−1qm を左に1桁ずらして 2am を加えた値である。

例えば q3 = 0, a3 = 2, a2 = 3, a1 = 7, a0 = 2 ならば、

2
2   a3 を縦に2つ並べる
43
  3   a2 を右端に縦に2つ並べる
467
    7   a1 を右端に縦に2つ並べる
4742
      2 a0 を右端に縦に2つ並べる
4744

このように、am を縦2つに並べ足し算を行う作業を一連の筆算として繰り返すことで、記述を簡略化できる。

計算例 [編集]

本節では、先述の漸化式を踏まえて筆算による開平法の説明をするが、筆算の手順を知るだけであれば漸化式による説明を飛ばしても差し支えなく、これまでの節を読む必要もない。

計算例として x = 5630738.132 の平方根を求める。

まず、x の値を書き、小数点から2桁ずつに区切る。

5  63  07  38. 13  2

分けて得られた2桁(1桁)の数をブロックと呼ぶことにする。

これは、漸化式
zm = 100(zm+1rm+1) + 10x2m+1 + x2m
の最後の2項を末位に付加しやすくするために分けている。

2乗しても(左端のブロックの)5 を超えない最大の整数を探すと 2 であるので、他の所に 2 を縦に2つ並べて書く。それらを足し算の筆算として計算し、その下に計算結果の 4 を書く。この筆算を、足し算ではなくかけ算とした場合の計算結果(この場合は足し算と同じ 4)を 5 の下に書く。引き算の筆算を行い、計算結果の 1 をその下に書く。

  2  2
5  63  07  38. 13  2  2←かけ算が5以下の最大整数
  4←右の筆算のかけ算の計算結果  4←足し算の計算結果
  1←引き算の計算結果
z3 = 5 で、それを基に a3 = 2 を探した。それから r3 = 4 を計算し、左側の筆算に書き、引き算を行った。さらに q2 = 4 を計算し、右側の筆算に記述した。

次のブロックを下ろし、右の筆算の右端の縦2つに等しい数を書くとき、かけ算が 163 を超えない最大の数を探すと 3 である。63 のブロックの上に 3 と書き、右の筆算に 3 を縦に2つ並べる。さらに、右の筆算のかけ算と足し算の結果を、左右の筆算に書き加え、左の筆算では引き算を行う。

  2    3  2
5  63  07  38. 13  2  2  
  4   ↓ 次のブロックを下ろす  43
  1  63    3←かけ算が163以下の最大整数
  1  29←右の筆算のかけ算の計算結果  46←足し算の計算結果
      34←引き算の計算結果
z2 = 163 で、それを基に a2 = 3 を探した。それから r2 = 129 を計算し、左側の筆算に書き、引き算を行った。さらに q1 = 46 を計算し、右側の筆算に記述した。

同様の計算を繰り返すと、

  2    3    7    2.   9    1    7    6    4            2
5  63  07  38. 13  20  00  00  00  2  
  4        43
  1  63    3  
  1  29       467
      34  07      7  
      32  69        4742
        1  38  38        2  
            94  84        47449
            43  54  13          9  
            42  70  41        474581
                  83  72  20            1  
                  47  45  81       4745827
                  36  26  39  00              7  
                  33  22  07  89        47458346
                    3  04  31  11  00                6  
                    2  84  75  00  76        474583524
                        19  56  10  24  00                  4
                        18  98  33  40  96  474583528
                              57  76  83  04

のようになる。

計算結果の小数点の位置は x の小数点の位置と揃える
下ろすブロックが無くなった場合は 00 を下ろす

以上により

5630738.132 = 2372.91764…

である。

これが正しいことを検証してみると、

2372.917642 = 5630738.1262231696
2372.917652 = 5630738.1736815225

となり

2372.91764 < √5630738.132 < 2372.91765

が確かに成り立つ。

珠算による開平法 [編集]

珠算による開平法として次の方法がある。

  • 倍根法
  • 半九九法

根の定位 [編集]

根の定位の仕方は次のようになる。

  • 平方が整数のとき:平方の1の位から左へ2桁ずつ区分して、その区分できた回数が、根の桁数となる。
  • 平方が帯小数のとき:平方の1の位から左へ2桁ずつ区分して、その区分できた回数が、根の整数の桁数となる。
  • 平方が小数のとき:平方の小数点以下の0を2桁ずつ区分して、その区分できた回数が、根の小数点以下の0の桁数となる。

倍根法 [編集]

例: √4225 = 65

Soroban 4 c.svg Soroban 2.svg Soroban 2.svg Soroban 5 cc.svg
平方の1の位から左へ2桁ずつ区分して、根の桁数が2桁であることを調べる。(根の定位による。)
Soroban 6.svg Soroban 0.svg Soroban 4 c.svg Soroban 2.svg Soroban 2.svg Soroban 5 cc.svg
最後の区分された数42に含まれている平方根6を求めて、初根6を置き、初根6の2乗 (62 = 36) を42から引く。
Soroban 1 c.svg Soroban 2.svg Soroban 0.svg Soroban 0 cc.svg Soroban 6.svg Soroban 0.svg Soroban 0 c.svg Soroban 6.svg Soroban 2.svg Soroban 5 cc.svg
初根6の2倍の12を、左に置き、その12で残りの平方を割って、次根5を初根の隣りに置く。
Soroban 1 c.svg Soroban 2.svg Soroban 0.svg Soroban 0 cc.svg Soroban 6.svg Soroban 5.svg Soroban 0 c.svg Soroban 0.svg Soroban 2.svg Soroban 5 cc.svg
次根5の2乗 (52 = 25) を引く。
Soroban 6.svg Soroban 5.svg Soroban 0 c.svg Soroban 0.svg Soroban 0.svg Soroban 0 cc.svg
平方根は65である。

半九九法 [編集]

例: √4225 = 65

Soroban 4 c.svg Soroban 2.svg Soroban 2.svg Soroban 5 cc.svg
平方の1の位から左へ2桁ずつ区分して、根の桁数が2桁であることを調べる。(根の定位による。)
Soroban 6 cc.svg Soroban 0.svg Soroban 0.svg Soroban 4 c.svg Soroban 2.svg Soroban 2.svg Soroban 5 cc.svg
最後の区分された数42に含まれている平方根6を求めて、初根6を置き、初根6の2乗 (62 = 36) を42から引く。
Soroban 6 cc.svg Soroban 0.svg Soroban 0.svg Soroban 0 c.svg Soroban 6.svg Soroban 2.svg Soroban 5 cc.svg
残りの平方625を2で割る。(初根の2乗を引いたあと、いつも残りの平方を2で割る。)
Soroban 6.svg Soroban 0.svg Soroban 3 c.svg Soroban 1.svg Soroban 2.svg Soroban 5 cc.svg
2で割った平方の残りを、初根6で割って次根5を求める。
Soroban 6.svg Soroban 5.svg Soroban 0 c.svg Soroban 1.svg Soroban 2.svg Soroban 5 cc.svg
次根5の半九九12.5を引く。
Soroban 6.svg Soroban 5 cc.svg
平方根は65である。

関連項目 [編集]