数学の基礎


55.p 進小数と数値計算

  p1 より大きい任意の自然数とします。
 有理数のうち、ある自然数 n と整数 q によって qp-n と書けるものを p進有限小数といい、その全体を Qp と書くことにします。
 また、実数 x のうち、

(55-1)  "rÎQp : [ x £ r  Ú  x ³ r ]

が成り立つものを p進小数といい、その全体を Rp と書くことにします(排中律を仮定する古典論理では、明らかに Rp = R です)。
 明らかに、有理数と無理数は p進小数であり、従って代数的数又は超越数であるような実数は p進小数です。

 整数 m と点列 { ak | kÎZ , k £ m } Ì Np { 0, 1 ,¼, p - 1 } が任意に与えられたとき、無限和:

(55-2)  a m
å
k=-¥
ak pk

は収束しますが、このようにして定義される実数 a ³ 0p進小数です。
 実際、任意の自然数 n ³ - m に対して

(55-3a)  0 £ -n-1
å
k=-¥
ak pk £ ( p - 1) -n-1
å
k=-¥
pk = ( p - 1) p-n-1 1 
———
1 - p-1
= p-n 

(55-3b)   m
å
k=-n
ak pk = lp-n       æ
è
 l m+n
å
k=0
ak-n pkÎZ  ö
ø

ですから、

(55-4)  lp-n £ a £ (l + 1)p-n

となります。ゆえに、任意の rqp-n ÎQp に対し、q £ l なら r £ a となり、q ³ l + 1 なら a £ r となるので a(55-1) を満たします。

 逆に、任意の p進小数 a ³ 0 は、(55-2) の形に書くことができます。
 その証明のために、まず任意の自然数 n に対して

(55-5)  $i, jÎN : [ i <  j  Ù  ip-n £ a £  jp-n ]  Þ  $lÎ {i, i + 1 ,¼,  j - 1} : [ lp-n £ a £ (l + 1)p-n ]

が成り立つことを確かめましょう。
 実際、任意に自然数 k を取り、 j - i = k である場合には (55-5) が成り立つと仮定します。
 そこで  j - i = k + 1 であるような i ,  j に対して (55-5) の左辺が成り立つとすると、(55-1) により a £ (i + 1)p-n 又は a ³ (i + 1)p-n が成り立ちます。
 前者なら ip-n £ a £ (i + 1)p-n が成り立つので li とすればよく、後者なら (i + 1)p-n £ a £  jp-n が成り立ち、 j - (i + 1) = k なので、帰納法の仮定により (55-5) の右辺が成り立ちます。
 ゆえに k に関する帰納法により、(55-5) は証明されました。

 そこで、まず n = 0 とすると、0 £ a £ N となる自然数 N が存在しますから、(55-5) の前提が成り立ちます。ゆえに l0 £ a £ (l0 + 1) を満たす自然数 l0 が存在します。これを p進表示(第12節の最後参照)したものを

(55-6)  l0 = m
å
k=0
ak pk

とします。以下、自然数 n に対し、

(55-7)  ln p-n £ a £ (ln + 1)p-n

を満たす ln が求まったものと仮定します。これは

(55-8)  (ln p)p-n-1 £ a £ {(ln + 1)p}p-n-1

と書けるので、(55-5) により

(55-9)  ln p £ ln+1 < (ln + 1)p

を満たし、(55-7)nn + 1 に置き換えたものが成り立つような自然数 ln+1 が存在します。
 そこで a-n-1ln+1 - ln p と置けば、これは整数で、しかも 0 £ a-n-1 < p が成り立ち、しかも a - p-n £ ln p-n £ a ですから

(55-10)  a =  
lim

n ® ¥
ln p-n = l0 + ¥
å
n=0
( ln+1 p-n-1 - ln p-n ) = l0 + ¥
å
n=0
a-n-1 p-n-1 = m
å
k=-¥
ak pk

と書け、a(55-2) の表示を持つことがわかりました。
  p進小数 a に対する (55-2) の形の表示を ap進小数展開といい、特に断らない場合は p = 10 :º 9 + 1 の場合を単に小数展開とよびます。
 また、0 から 9 までの数字をいくつか並べ、その次に小数点とよばれる記号“ . ”を置き、更にいくつかの数字を並べたとき、この記号列は、並んでいる数字を小数点から左に向かって順に ak ( k = 0, 1 ,¼ ) とし、小数点から右に向かって順に a-k ( k = 1, 2 ,¼ ) としたときの (55-2)a を意味するものと約束します。
 ただし、これでは有限小数しか表せないので、その数字列 rm ¼ r0 . r-1 ¼ r-n の最後に“ ¼ ”という記号を書くことにより、便宜的に、すべての k ³ - n に対して ak = rk であるような任意の小数 (55-2) を表すことにします。

 次に有理数 n/m ( n, N ; m > 0 )p進小数展開を考えてみましょう。帰納的に

(55-11a)  l0 = n/p

(55-11b)  pln = mkn + ln+1       ( kn , ln+1ÎN  ;  0 £ ln+1 < m )

によって { ln | nÎN } , { kn | nÎN } を定義すると

(55-12)  n = l0 p = ¥
å
n=0
( ln p-n+1 - ln+1 p-n ) = ¥
å
n=0
mkn p-n

(55-13)  kn =  pln - ln+1
————–
 m 
£  pln
——
 m 
< p       ( n ³ 1 )

 ゆえに k0p進展開して

(55-14)  k0 = m
å
k=0
ak pk

とし、a-n :º kn ( n ³ 1 ) と置けば、n/mp進展開:

(55-15)  n/m = m
å
k=-¥
ak pk

が得られます。ところで (55-11b) により、knln+1 は共に ln の関数です:

(55-16a)  kn = j(ln )

(55-16b)  ln+1 = y(ln )

 しかも、ym 個の元からなる有限集合 Nm への写像ですから、{ ln | 1 £ n £ m + 1 } = { y(ln ) | 0 £ n £ m } の中には必ず重複があります(このような論法を鳩ノ巣原理とよぶことがあります)。
 例えば ln = ln' ( 1 £ n < n' £ m + 1 ) とすると、(55-16b) により、任意の kÎN に対して ln+k = ln'+k となり、従って (55-16a) により kn+k = kn'+k となります。言い換えると、{ ak | k £ m } は途中から繰り返しが生じています。このような p進小数を循環小数といい、

(55-17)  am ¼ a0 . a-1 ¼ a-n+1  ·
a-n
a-n-1 ¼ a-n'+2  ·
a-n'+1

と書きます。ただし、n' = n + 1 のときは、ドット付きの数字は一個だけになります。

 さて、これとは逆に、任意の循環小数は有理数です。
 実際、(55-17)p進循環小数 a は、有理数:

(55-18a)  b  m
å
k=-n+1
ak pk

(55-18b)  c n'-1
å
k=n
a-k p-k

により

(55-19)  a = b + c ¥
å
k=0
 p-(n'-n) k = b +  c 
———–
 1 - pn-n'

と書け、これは明らかに有理数です。以上で有理数と循環小数は同じものであることがわかりました。

 次に、aÎRp \\ Qpp進小数展開は一意的であることを証明しましょう。
 実際、この場合、任意の整数 n に対し、(55-4) を満たす l が存在しますが、このとき aQp のすべての元と異なることから

(55-20)  lp-n < a < (l + 1)p-n

が成り立つので、このような l は一意的に定まることがわかります。ゆえにこれを ln と書けば、(55-3b) の括弧の中により

(55-21)  ln p-n = m
å
k=-n
ak pk

が成り立つので、これを逆に解けば、

(55-22)  a-n = pn ( ln p-n - ln-1 p-n+1 ) = ln - pln-1

と一意的に解けますから、これで p進表示の一意性は証明されました。

 さて、前節で超越数であることがわかった epp進小数展開できることがわかりましたから、これらを実際に十進小数展開してみましょう。

 まず e ですが、(46-31a) により

(55-23)  0 < e - n
å
k=0
1
—–
 k!
= ¥
å
k=n+1
1
—–
 k!
< 1
—–
 n!
¥
å
k=1
 
———–
 (n + 1)k
= 1
——
 n! n

という評価が得られますが、この式で n = 13 とすれば、

(55-24)  e
= 13
å
k=0
1
—–
 k!
+ d       æ
è
 0 < d < 1
———
13! · 13
= 1
——————
80951270400
£ 13 · 10-12  ö
ø

= 1 + 1 + 1
—–
2
+ 1
—–
6
+ 1
—–
24
+ 1
—–
120
+ 1
—–
720
+ 1
——–
5040
+ 1
———
40320
+ 1
———
362880
+ 1
———–
3628800
+ 1
————
39916800
+ 1
————–
479001600
+ 1
—————
6227020800
+ d

= 1 + 1 + 0.5 + 0.166666666666 + 0.041666666666 + 0.008333333333 + 0.001388888888 + 0.000198412698 + 0.000024801587

      + 0.000002755731 + 0.000000275573 + 0.000000025052 + 0.000000002087 + 0.000000000160 + d + e       ( 0 £ e £ 11 · 10-12 )

 = 2.718281828441 + d + e       ( 0 £ d + e £ 24 · 10-24 )

 = 2.7182818284¼

という e の小数展開が得られます。
 ただし e は、11個の有理数を小数展開したときに、小数点以下12桁まででカットしたことによる誤差の合計で、その評価は、それぞれの誤差が最大 10-12 であることによるものです。

 次は p です。
 既に (47-25)(48-44)p の級数及び無限積による表示が得られていますが、これらの収束は遅いので、実際の計算には適しません。
 そこで以下のような工夫をします。(47-22a) の右辺は、x > 0 のとき、n が偶数であるか奇数であるかにより、それぞれ正又は負になりますから、

(55-25)  2n-1
å
k=0
(- 1)k x2k+1
—————
2k + 1
< arctan x < 2n
å
k=0
(- 1)k x2k+1
—————
2k + 1

という不等式の評価が成り立ちます。
 一方、任意の実数 x , y に対して a :º arctan x , b :º arctan y と置くと、tan a = x , tan b = y となりますから、(47-6c) により

(55-26)  tan(a + b) =  tan a + tan b
——————
 1 - tan a tan
b
= x + y
———
1 - xy

となるので

(55-27)  arctan x + y
———
1 - xy
= arctan x + arctan y

という公式が得られます。ここで左辺の arctan の中が 1 になるように、x + y = 1 - xyy について解けば、y = (1 - x)/(1 + x) となるので、

(55-28)  p
—–
4
= arctan 1 = arctan x + arctan  1 - x
——–
 1 +
x

 ゆえに例えば x = 1/2 と置けば、(1 - x)/(1 + x) = 1/3 となるので

(55-29)  p
—–
4
= arctan 1
—–
2
+ arctan 1
—–
3

が得られます。この右辺を (55-25) によって評価すれば、(47-25) よりはるかに早い収束で数値計算ができますが、更に効率の良い式を探してみましょう。(55-27)y = x と置いて両辺を入れ替えると

(55-30)  2 arctan x = arctan 2x
——–
1 -
x²

 ここで x = 1/5 と置けば、

(55-31)  2 arctan 1
—–
5
= arctan 2/5
——–
24/25
= arctan 5
—–
12

 更に (55-30)x = 5/12 を代入すれば、

(55-32)  2 arctan 5
—–
12
= arctan 5/6
——————
(144 - 25)/144
= arctan 120
——
119

 そこで (55-28)x = 120/119 と置けば、(1 - x)/(1 + x) = - 1/239 となるので

(55-33)  p
—–
4
= arctan 120
——
119
- arctan 1
——
239
= 4 arctan 1
—–
5
- arctan 1
——
239

が得られます。これはMachinの公式とよばれ、この右辺を (55-25) によって評価した式は収束が早いので、昔から計算機による p の計算によく用いられています。
 そこで、このMachinの公式を使って p を実際に小数展開してみましょう。
 まず (55-25) によって arctan(1/5) を計算すれば、

(55-34a)  16 arctan 1
—–
5
= 7
å
k=0
(- 1)k · 16
——————
(2k + 1) ·
52k+1
+ d       æ
è
 0 < d <  16 
———
17 · 517
= 16
———————
12969970703125
£ 2 · 10-12  ö
ø

= 16
—–
5
- 16
——
375
+ 16
——–
15625
- 16
———
546875
+ 16
————
17578125
- 16
————–
537109375
+ 16
—————–
15869140625
- 16
——————
457763671875
+ d

= 3.2 - 0.042666666666 + 0.001024 - 0.000029257142 + 0.000000910222 - 0.000000029789

      + 0.000000001008 - 0.000000000034 + d + e       ( - 4 · 10-12 £ e £ 2 · 10-12 )

 = 3.158328957599 + d + e       (  - 4 · 1012 £ d + e £ 4 · 10-12  )

 次に (55-25) によって arctan(1/239) を計算すれば、

(55-34b)  4 arctan 1
——
239
= 1
å
k=0
(- 1)k · 4
———————
(2k + 1) ·
2392k+1
+ d'       æ
è
 0 < d' <  4 
———–
5 · 2395
= 4
——————–
3899056325995
£ 2 · 10-12  ö
ø

= 4
——
239
- 4
————
40955757
+ d'

 = 0.016736401673 - 0.000000097666 + d' + e'       ( - 10-12 £ e' £ 10-12 )

 = 0.016736304007 + d' + e'       (  - 1012 £ d' + e' £ 3 · 10-12 )

 従って、- 7 · 1012 £ d + e - d' - e' £ 5 · 10-12 に注意すれば、Machinの公式 (55-33) により

(55-35)  p = 16 arctan 1
—–
5
- 4 arctan 1
——
239
= 3.141592653592 + d + e - d' - e' = 3.1415926535¼

という p の小数展開が得られます。

 次に、一般の無理数 a に対し、a連分数展開について考察します。
 一般に、無理数 b に対し、すべての自然数 n に対して b ¹ n + 1/2 ですから、b との差の絶対値が最小値を取る自然数が唯一つ存在します。これを b と書くことにし、実数列 an

(55-36a)  a0 = a

(55-36b)  an+1 = 1
———
 an -
an

で定義します。帰納法により、an は無理数であることがわかるので、(55-36b) の右辺の分母は 0 になりません。また、明らかに | an - an | < 1/2 ですから | an+1 | > 2 、従って | an+1 | ³ 2 が成り立ちます。

 逆に、整数 n0 と、絶対値が 2 以上の整数からなる列 { nk | k ³ 1 } が与えられたとき、各自然数 n ごとに、整数の有限列 { x(n)k | 0 £ k £ n } を“逆から”次のように定義します:

(55-37a)  x(n)n = nn

(55-37b)  x(n)k = nk + 1 
——–
  x(n)k+1

 このとき、1 £ k £ n に対して

(55-38)  | x(n)k | ³ n - k + 2
————
n - k + 1

が成り立ちます。実際、k = n のときは (55-37a)| nn | ³ 2 により明らかで、kk + 1 に置き換えたものが成り立つと仮定すると、

(55-39)  | x(n)k | ³ | nk | - 1 
———–
| x(n)k+1
|
³ 2 - n - k
————
n - k + 1
= n - k + 2
————
n - k + 1

となって、降順の帰納法により証明されました。特に (55-37b) の右辺に出てくる分数の分母は 0 にならないことがわかります。
 ゆえに、1 £ k £ n < m なら、(55-37b)(55-38) により

(55-40)  | x(m)k - x(n)k | = |
|
|
|
1 
——–
  x(n)k+1
- 1 
——–
  x(m)k+1
|
|
|
|
= | x(m)k+1 - x(n)k+1 |
———————
| x(n)k+1 | | x(m)k+1 |
£ n - k
————
n - k + 1
m - k
————
m - k + 1
| x(m)k+1 - x(n)k+1 |

 ゆえに、

(55-41)  | x(m)k - x(n)k | £ 1
————
n - k + 1
m - n + 1
————
m - k + 1
| x(m)n - x(n)n | = 1
————
n - k + 1
m - n + 1
————
m - k + 1
1 
———–
| x(m)n+1
|
£ 1
————
n - k + 1
m - n
————
m - k + 1
£ 1
————
n - k + 1

 これは、各 k に対して { x(n)k | n ³ k } がコーシー列になっていることを意味するので、ある xk に収束し、(55-37b),(55-38)n ® ¥ とすれば

(55-42)  xk = nk +
——
  xk+1

(55-43)  | xk | ³ 1       ( k ³ 1 )

が成り立つことがわかります。そこで、このときの x0 のことを

(55-44)  x0 = n0 +  1

 n1 +
 1

 n2 +
 1

 n3 + ¼

と書いて、これを(分子が 1 の)連分数といいます。

 さて、任意の無理数 a から (55-36) によって an を作り、nnan と置いて、(55-44) の連分数を作ると、これが a に一致することが証明できます。
 実際、(55-36b)(55-42) から

(55-45)  xk - ak = nk + 1 
——
  xk+1
- ak - 1 
——
  ak+1
= 1 
——
  xk+1
- 1 
——
  ak+1

ですから

(55-46)  | xk - ak | £ 1 + 1
—–
2
= 3
—–
2

および

(55-47)  | xk - ak | £ | xk+1 - ak+1 |
——————
| xk+1 | | ak+1 |
£ | xk+1 - ak+1 |
——————
 2 

がすべての k ³ 1 について成り立ち、これは xk = ak ( k ³ 1 ) であること、従って a = a0 = a0 + 1/a1 = n0 + 1/x1 = x0 であることを意味します。

 以上の議論を a = p の場合に適用してみましょう。(55-35) により

(55-48a)  a0 = p = 3.141592653591 ± 6 · 10-12

(55-48b)  a0 = 3

(55-49a)  a1 =  1 
———
a0 - 3
=  1 
———————————
0.141592653591 ± 6 · 10-12
= 7.062513306 ± 10-9

(55-49b)  a1 = 7

(55-50a)  a2 =  1 
———
a1 - 7
=  1 
————————
0.062513306 ± 10-9
= 15.9965944 ± 3 · 10-7

(55-50b)  a2 = 16

(55-51a)  a3 =  1 
———
a2 - 16
= -  1 
————————–
0.0034056 ± 3 · 10-7
= - 293.6¼

(55-51b)  a3 = - 294

 ただし、上記の a ± b は、a - ba + b の間にある数を表す便宜的な表記です。従って

(55-52)  p = 3 +  1

 7 +
 1

16 -
  1
—–
294 + ¼

という p の連分数展開を得ます。

 もしこれを有限項で切れば、p を近似する分数として

(55-53a)  p' :º 3 + 1
—–
7
= 22
—–
7
= 3.142857¼

(55-53b)  p" :º 3 +  1

 7 +
 1

16
= 3 + 1
———–
7 + 1/16
= 3 + 16
——
113
= 355
——
113
= 3.14159292¼

が得られ、特に p" の方は、小数点以下 6 桁まで一致する、ずば抜けてよい p の近似値を与えることがわかります。

 さて、次に p を数値計算するための、全く別の方法を考えてみましょう。
 | a | < b であるような実数 a , b の組に対して

(55-54a)  x0a

(55-54b)  y0b
(55-55a)  xn+1 xn + yn
———
 2 
(55-55b)  yn+1    ________
Ö xn+1 yn

によって数列 { xn | nÎN } , { yn | nÎN } を定義します。このとき両数列は同一の極限値に収束することを証明しましょう。
 実際、まず

(55-56a)  c    _______
Öb² - a²

(55-56b)  q :º arccos  a
—–
 b

(55-57a)  cn  c
—–
 2n

(55-57b)  qn q 
—–
 2
n

と置くと、0 < q < p ですが、

(55-58a)  xncn cot qn

(55-58b)  yncn csc qn

が成り立つことを n に関する帰納法で証明します。
 まず、(55-56b) により a/b = cos q で、しかも b > 0 , sin q > 0 ですから、(55-56a) により c = b    __________
Ö1 - cos²q
= b sin
q
となります。
 ゆえに b = c csc q 及び a = b cos q = c csc q cos q = c cot q が得られ、これで n0 のときは証明されました。
 次に n について成り立つと仮定し、f :º qn+1 , k :º cn+1 と置くと、qn = 2f , cn = 2k となり、帰納法の仮定により
(55-59a)  xn+1 = xn + yn
———
 2 
= k {cot(2f) + csc(2f)} = k{cos(2f) + 1}/sin(2f) = k{2 cos² f}/{2 sin f cos f} = k cot f
(55-59b)  yn+1 =    ________
Ö xn+1 yn
=    ____________________
Ök cot f ·2k csc(2f)
= k    _________________________________
Ö(cos f / sin f) 2 /(2 sin f cos f)
= k /    _____
Ösin²f
= k csc
f

となって、帰納法が完成しました。

 さて、(55-57),(55-58) により

(55-60a)  xn = cn
—–
qn
qn cot qn =  c
—–
q
qn
——–
tan q
n

(55-60b)  yn = cn
—–
qn
qn csc qn =  c
—–
q
qn
——–
sin q
n

と表すことができます。一方、t < 0 < p/2 に対して

(55-61)  sin t < t < tan t

が成り立ちます。実際、j(t) t - sin t , y(t) tan t - t と置くと、j'(t) = 1 - cos t > 0 , y'(t) = sec² t - 1 = tan² t > 0 ですからいずれも単調増加で、しかも j(0) = y(0) = 0 なので j(t), y(t) > 0 となるからです。
 また、

(55-62a)   
lim
t ¯ 0
sin t
——
 t
= sin' 0 = cos 0 = 1

(55-62b)   
lim
t ¯ 0
tan t
——
 t
= tan' 0 = sec² 0 = 1

ですから、n ® ¥ のとき qn ® 0 であることに注意すれば、(55-60),(55-61),(55-62) により

(55-63)  xn <  c
—–
q
< yn 

及び

(55-64)   
lim
n ® ¥
xn =  
lim
n ® ¥
 yn =  c
—–
q

が成り立つことがわかります。
 従って、例えば初期値として a = 0 , b = 1/2 を与えると、c = 1/2 , q = arccos 0 = p/2 となるので、

(55-65)   
lim
n ® ¥
xn =  
lim
n ® ¥
 yn = 1
—–
p

が得られ、このことを利用すると、この数列を使って p の値を計算することができます。

 さて、この初期値のもとで数値計算するときの工夫の一つとして、加速法という方法があるのでそれを解説しましょう。

(55-66)  sn 1 
——
 yn-1
= 2n sin  p 
—–
 2
n
= 2n ¥
å
k=0
(- 1)k p2k+1
——————
(2k + 1)!
22nk+n
= p + ¥
å
k=1
(- 1)k p2k+1
—————
 (2k + 1)!
4nk

と表すと、右辺第2項が snp の誤差になります。そこで、順次

(55-67)  s(1)n 4sn+1 - sn
————–
 4 - 1 
= 1
——–
4 - 1
æ
è
4p + ¥
å
k=1
(- 1)k p2k+1
——————–
(2k + 1)!
4nk+k-1
- p - ¥
å
k=1
(- 1)k p2k+1
—————
 (2k + 1)!
4nk
ö
ø
= p + ¥
å
k=2
(- 1)k p2k+1
—————
 (2k + 1)!
4nk
41-k - 1
———–
 4 - 1 

(55-68)  s(2)n 4²s(1)n+1 - s(1)n
——————
 4² - 1 
= 1
———
4² - 1
æ
è
4²p + ¥
å
k=2
(- 1)k p2k+1
——————–
(2k + 1)!
4nk+k-2
- p - ¥
å
k=2
(- 1)k p2k+1
—————
 (2k + 1)!
4nk
ö
ø
41-k - 1
———–
 4 - 1 
= p + ¥
å
k=3
(- 1)k p2k+1
—————
 (2k + 1)!
4nk
42-k - 1
———–
 4² - 1 
41-k - 1
———–
 4 - 1 

と定義していくと、誤差項の和の初項の冪が上がっていき、収束が早くなります。これを加速法といいます。

INDEX   BACK   NEXT