開平法
出典: フリー百科事典『ウィキペディア(Wikipedia)』
開平法(かいへいほう, extraction of square root) あるいは開平算(かいへいざん)とは、正の実数の平方根の小数による近似値を求めるアルゴリズムの一つである。
目次 |
[編集] 数式による開平法
開平法というと筆算を用いた計算が多いが、ここでは原理的な事も含めて数式で説明する。十進法を用いるが、他の位取り記数法でも同様に計算できる。ここで述べるのと似たような方法で、立方根を求める開立法や、もっと一般に n 乗根を求める事も可能である。
- 単に筆算による手順を知りたいだけの場合は、筆算による開平法の計算例を参照するだけでよい。
[編集] 帰納的方法
正の実数 x に対し、その平方根 √x が次のように表現されているとする。
ここで、各 ak は 0 から 9までの整数とする。
- n は十分大きな整数で構わないが、大きな k に対して ak = 0 が続くだけであまり意味は無いので、大抵は、 an ≠ 0 となるような最大の n すなわち、 102n ≤ x < 102(n+1) を満たすような n を選ぶ。
ある整数 m があって、 k > m となる ak の値は分かっているとする。
と置いて
- √x = 10m (10 pm + am + bm)
と表記する。 pm , am は整数、bm は小数である。また、 pn = 0 である。
- x = 102m (10 pm + am + bm)2
- 10−2m x − 100 pm2 = (20 pm + am + bm) (am + bm)
0 ≤ bm < 1 なので、
- (20 pm + am) am ≤ 10−2m x − 100 pm2 < (20 pm + (am + 1)) (am + 1)
であり、この式を満たすような am を見つければよい。
- この段階では、am の値を、地道に探す必要があるが、am は 0 から 9 までの整数のいずれかなので、多くても 10通りの値を考えればよい。
- 20 pm am ≤ (20 pm + am) am ≤ 10−2m x − 100 pm2 < (20 pm + (am + 1)) (am + 1) ≤ (20 pm + 10) (am + 1)
- pm ≠ 0 であれば
- am ≤ (10−2m x − 100 pm2)/(20 pm) < (1 + (1/(2 pm))) (am + 1)
- なので、 (10−2m x − 100 pm2)/(20 pm) という割り算によって、 am がどのくらいかという見当をつけることはできる。
このようにして am が求まれば、次は
- pm−1 = 10 pm + am
- bm−1 = 10 bm − am−1
なので
- √x = 10m−1 (10 pm−1 + am−1 + bm−1)
を考えることにより、am と同様に am−1 の値が求まる。
[編集] 計算の簡略化
計算を簡略化するために
- qm = 2pm
- rm = (10 qm + am) am
- ym = 10−2m x − 100 pm2
とおくと
- qm−1 = 10 qm + 2am
- ym−1 = 10−2(m−1) x − 100 pm−12 = 100(10−2m x − pm−12)
- =100(10−2m x − 100 pm2 − (20 pm + am) am) =100(ym − rm)
となり、 am−1 を求めるための不等式は
- (10 qm−1 + am−1) am−1 ≤ ym−1 < (10 qm−1 + (am−1 + 1)) (am−1 + 1)
となる。
- 左辺は、rm−1 に等しいが、 am−1 を探しにくくなるので、この不等式では rm−1 に置き換えない。
この不等式は、両辺が整数なので実際の計算においては、 ym−1 の小数部分は無視してよい。ym の小数部分は 10−2m x の小数部分に等しく、これを βm とし、ym の整数部分を zm とすれば
- ym = zm + βm
- zm−1 = ym−1 − βm−1 = 100(zm − rm) + 100 βm − βm − 1
となる。最後の部分の 100 βm − βm − 1 は、βm の小数第一位、小数第二位を取り出し、それぞれ十の位、一の位とする演算である。
xi を 0から 9までの整数として
と表されているとすると
- 100 βm − βm − 1 = 10 x2m−1 + x2m−2
- 例えば βm = 0.743 であれば、100 βm − βm − 1 = 74 である。zm を用いることにより m が大きいうちは、x の上の方の桁だけの計算で済む。
ym−1 の代わりに zm−1 を用いた不等式
- (10 qm−1 + am−1) am−1 ≤ zm−1 < (10 qm + (am−1 + 1)) (am−1 + 1)
を考えれば十分である。
[編集] 計算例
計算例として x = 5630738.132 の平方根を求める。ここで使う式は
- rm = (10 qm + am) am
- zm−1 = 100(zm − rm) + 10 x2m−1 + x2m−2
- (10 qm + am) am ≤ zm < (10 qm + (am + 1)) (am + 1)
初期値として
- qn = 0
- k>n のとき ak = 0
- zn = 10 x2n+1 + x2n
まず、x の値から、 x6 = 5, x5 = 6, x4 = 3, x3 = 0, x2 = 7, x1 = 3, x0 = 8, x−1 = 1, x−2 = 2, x−3 = 3 となる。これ以外の xj の値は全て 0 とする。
107 < x < 108 なので、 n = 3 が、an ≠ 0 となるような最大の n であり、
の係数 ak を調べていく。
初期値より、q3 = 0, a4 = 0, z3 = x7 + x6 = 5
- a32 ≤ z3 < (a3 + 1)2
となるような a3 を探すと、a3 = 2 が見つかる。
- r3 = (10 q3 + a3) a3 = 4
- q2 = 2 a3 = 4
- z2 = 100(z3 − r3) + 10 x5 + x4 = 163
- (10 q2 + a2) a2 ≤ z2 < (10 q2 + (a2 + 1)) (a2 + 1)
となるような a2 を探すと、a2 = 3 が見つかる。
- r2 = (10 q2 + a2) a2 = 129
- q1 = 10 q2 + 2 a2 = 46
- z1 = 100(z2 − r2) + 10 x3 + x2 = 3407
- (10 q1 + a1) a1 ≤ z1 < (10 q1 + (a1 + 1)) (a1 + 1)
となるような a1 を探すと、a1 = 7 が見つかる。
このような計算を繰り返すと、各変数の値は次の表のようになる。
m | qm | am | rm | zm | |
---|---|---|---|---|---|
3 | 0 | 2 | 4 | 5 | |
2 | 4 | 3 | 129 | 163 | |
1 | 46 | 7 | 3269 | 3407 | |
0 | 474 | 2 | 9484 | 13838 | |
−1 | 4744 | 9 | 427041 | 435413 | |
−2 | 47458 | 1 | 474581 | 837220 | |
−3 | 474582 | 7 | 33220789 | 36263900 | |
−4 | 4745834 | 6 | 284750076 | 304311100 | |
−5 | 47458352 | 4 | 1898334096 | 1956102400 | |
… | … | … | … | … |
am の列から
- √5630738.132 ≒ 2372.91764 …
と分かる。
[編集] 筆算による開平法
開平法は、筆算を用いるとさらに簡単に計算できる。
[編集] 筆算を用いた略記
rm と qm−1 の式を比べると、形がとてもよく似ていることがわかる。
- rm = (10 qm + am) am
- qm−1 = 10 qm + 2 am = (10 qm + am) + am
例えば 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−1 を求める式は、 qm を 1桁ずらして、 2 am を加えるという演算を繰り返し行うものである。
例えば 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 を並べる作業を、一連の筆算として繰り返すことで、記述を簡略化できる。
[編集] 計算例
- この節では、以上の節で定義された変数も用いて開平法の筆算の手順を説明をするが、変数を用いた説明は飛ばしても差し支えないように書いたので、手順を知るためだけであれば、これまでの節を読む必要は無い。
計算例として x = 5630738.132 の平方根を求める。
まず、 x の値を書き、小数点を基準にして 2つずつの桁に区切る。
√5 63 07 38.13 2 |
説明の便宜上、分けた一つ一つのかたまりをブロックと呼ぶことにする。
- これは、漸化式
- zm−1 = 100(zm − rm) + 10 x2m−1 + x2m−2
- の最後の 2項において行われる x から 2桁ずつ取り出して最後尾に付加する操作を見やすくするために、分けている。
二乗しても(左端のブロックの) 5を超えない最大の整数を探すと 2であるので、右側の方に 2を縦に 2つ並べて書く。それを足し算の筆算と思って計算し、すぐ下に結果の 4を書く。この筆算を足し算ではなく、かけ算と思って計算した場合の結果(この場合は足し算と同じ 4)を 5の下に書く。左の筆算で引き算を行い、その結果の 1をすぐ下に記入する。
2 | 2 |
√5 63 07 38.13 2 | 2←かけ算が5を超えない最大の整数2 |
4←右の筆算をかけ算として計算 | 4 ←足し算の筆算として計算 |
1 ← 引き算の筆算として計算 |
- z3 = 5で、それを元に a3 = 2 を探した。それから r3 = 4 を計算し、左側の筆算に書き、引き算を行った。さらに q2 = 4 を計算し、右側の筆算に記述した。
次のブロックをおろし、右の筆算のかけ算が 163を超えないように右端の数を探すと 3である。63のブロックの上に 3と書き、右の筆算に 3を縦に 2つ並べる。さらに、右の筆算のかけ算と足し算の結果を、左右の筆算に書き加え、左の筆算では引き算を行う。
2 3 | 2 |
√5 63 07 38.13 2 | 2 |
4 ↓次のブロックをおろす | 43 |
1 63 | 3←かけ算が163を超えない最大の整数3 |
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 2 | 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 |
などと計算する。
- 左側の筆算において、おろしてくる数が無くなった場合は 0 をおろしてくる。小数点の位置は、 x の小数点の位置にそろえる。
以上により
- √5630738.132 ≒ 2372.91764 …
と分かる。
得られた値を平方してみると
- 2372.917642 = 5630738.1262231696
- 2372.917652 = 5630738.1736815225
なので
- 2372.91764 < √5630738.132 < 2372.91765
であることが分かる。
[編集] 関連項目
- ネイピアの骨:ネイピアの骨を使った場合の開平法