九州大学理学部数学科
新入生九重合宿研修
2006年5月20日~21日

「計算可能実数とは?」
コンピュータで近似値でなく
厳密な実数値を扱えるのか?
溝 口 佳 寛
(みぞぐち よしひろ)
ym@math.kyushu-u.ac.jp
soln1=NDSolve[{
x‘[t]=-3 (x[t]-y[t]),
y‘[t]=-x[t]z[t]+26.5 x[t]-y[t],
z‘[t]=x[t] y[t]-z[t],
x[0]=z[0]=0.506127,
y[0]=1
},{x,y,z},{t,0,20},MaxSteps->3000];
plot1=ParametricPlot3D[Evaluate[{x[t],y[
t],z[t],Red}/.soln1],{t,0,20}];
soln2=NDSolve[{
x‘[t]=-3 (x[t]-y[t]),
y‘[t]=-x[t]z[t]+26.5 x[t]-y[t],
z‘[t]=x[t] y[t]-z[t],
x[0]=z[0]=0.5,
y[0]=1
},{x,y,z},{t,0,20},MaxSteps->3000];
plot2=ParametricPlot3D[Evaluate[{x[t],y[
t],z[t],Green}/.soln2],{t,0,20},PlotPoints>1000];
Show[plot1,plot2];
Nature (Vol.406) 31 August 2000

Warwick Tucker, Dept. Math. Cornell Univ., (C. R. Acad. Sci. Vol.328, 1197-1202, 1999.)
x2 -6.13995 x + 3π=0 は実数解を持つか?

Plot[3π-6.13995x + x2, {x,1,5}, PlotStyle->Red];
判別式 D=b2-4*a*c を π=3.14 で計算すると正
6.139952-4*3*3.14 = 0.018986
6.139952-4*3*3.14159 = -0.0000939975
数の集合
R: 実数
Q: 有理数
Z: 整数

π
2/3
√2

-3

N: 自然数
0, 1, 2, 3, …

計算可能実数
可算集合と非可算集合
• 可算(無限)集合
(数えられる無限 = Nと1対1対応が存在する)
N={0,1,2,3,…..}
Z={0,1,-1,2,-2,3,-3,4,-4,….}
Q={0,1,-1,1/2,2,-2,-1/2,1/3,2/3,3,-2/3,-1/3,…}
Z×Z={(x,y) | x ∈Z, y∈Z}
{0,1}*={w | wは0と1の有限長の文字列}
={ε(空列), 0, 1, 00, 01, 10, 11, 000, 001, …}
計算可能実数= あとで定義します! (πも√2も含む!)
• 非可算集合
(数えられない無限 = Nと1対1対応が存在しない)
R={π,√2, …}
2N={X| XはNの部分集合}
={φ, {0}, {1}, {0,1}, {1,0}, {0,1,2}, ….}
計算可能実数(1)
コンピュータ
出力
3.14159265……

命令= プログラム
メモ帳

入力
6.2831852……

(記憶領域)

• 入力は無限長の文字列(厳密には, Nから文字集合(有限集合とする)への関数)
• 出力も無限長の文字列
• コンピュータへの命令は有限の文字列(プログラム)で事前に与えておく.
• コンピュータ中のメモ帳は無限長だが一時に蓄えられる量は常に有限
• コンピュータは命令とメモ帳と入力の最初の文字だけを読んで動作する.
• コンピュータは一度出力した数を書き換えられない.
計算可能実数(2)
コンピュータ
出力

入力

命令= プログラム

3.14159265……

メモ帳

ε(空列)

(記憶領域)
あるプログラムに対して, 空の入力に対して出力される数を計算可能実数という
•  有理数は出力可能
1/3 = 0.333333……
•  π=3.1415… を出力するプログラムを作ることが出来る.
π= 4 – 4/3 + 4/5 – 4/7 + 4/9 - ……
と無限級数で表されるので十分先の項まで計算して,
上の桁に影響がなくなったところで, その桁を出力すれば良い.
•  √2 =1.4142… を出力するプログラムを作ることが出来る.
プログラムは有限の文字列なので, プログラム全体は可算集合である,
従って, 計算可能実数の全体も可算集合である.
計算可能実数(3)
1が出れば f(x)=0 の解が存在,

正ならば1, 負なら0を
出力するプログラム

0が出れば f(x)=0 の解は存在しない.
X

6.139952 を出力する
プログラム

X -Y を計算するプログラム

Y

4*3 倍する

πを出力する

プログラム

プログラム

先の例の判別式 D=6.139952-4*3*π > 0 を
厳密に判定できるプログラムを作ることが出来る.
(近似計算ではない!) 
早く答えがでるか、遅いかは、プログラマー(数学者?)の腕次第!!
計算可能実数(4)
コンピュータ
出力

3倍するプログラム

1.000…?

メモ帳

0.999…?

入力
0.333…..

(記憶領域)

10進数表現で定義した計算可能実数は掛け算に対して閉じていない。
すなわち, 計算可能実数の積を計算できない!
区間表現と区間演算
実数を10進表現ではなく, 表現する実数を含む有理数の区間の縮小列で,表現することを考える.
有理数は, 整数の対(分数)で表現する.
[31/10, 32/10][314/100, 315/100][3141/1000, 3142/1000]……
π∈[31/10, 32/10], π∈[314/100, 315/100], π∈[3141/1000, 3142/1000], ….
31/10 ≦ 314/100 ≦ 3141/100 ≦ → π
32/10 ≧ 315/100 ≧ 3142/100 ≧ → π
•

有理数については区間を1つ出力すれば良い

•

πについて, このような列を出力するプログラムを作ることが出来る

•

√2について, このような列を出力するプログラムを作ることが出来る

•

区間列の加減乗除算をするプログラムを作ることが出来る.
[a, b] + [c, d] = [a+c, b+d]
[a, b] – [c, d] = [a-d, b-c]
[a, b] * [c, d] = [min{a*c, a*d, b*c, b*d}, max{a*c, a*d, b*c, b*d}]
[a, b] / [c, d] = [min{a/c, a/d, b/c, b/d}, max{a/c, a/d, b/c, b/d}]

※ 区間表現で定義された計算可能実数は四則演算について閉じている!
計算結果の区間を小さくする工夫
区間[a,b]に対して, 区間f([a,b])を計算したいとき,
f(x)の定義式の通りに区間演算を行うと区間が
大きくなってしまうことがある.
f(x)の定義通りの区間計算をf([a,b])と書くことにする.
(例) f(x) = x – x とするとき,
f([a,b])=[a,b] – [a,b] = [a-b, b-a]
f(x)が(数式処理で)微分可能なとき,
F([a,b])=f([c,c])+f’([a,b])([a,b]-[c,c])
c = (a+b)/2
とすると平均値の定理より, f([a,b]) ⊆F([a,b]) であり,
多くの場合, F([a,b])⊆f([a,b]) である.
※ f のプログラムを作るより, F のプログラムを作った方が収束が早く効率が良い!
まとめ
• コンピュータが扱える厳密な実数を計算可能実数という.
• 計算可能実数は可算集合であり, 実数全体よりは遥かに小さ
いが, 物理や工学の方程式の係数に出てくる数で計算可能実
数でないものは知られていない.
• 計算可能実数を使うことでプログラムにより解の存在証明をす
ることが出来る.
• 方程式の解が計算可能実数であれば任意精度の解を得るプロ
グラムを構築出来る.
• 多くの場合, 解の存在証明のプログラムそのものが解を任意精
度で与えるプログラムとなる.
• プログラムが早く答えを出すか否かはプログラマー(数学者?)の
腕次第である.
– 誤差が大きくならない等価な式が必要.
– 収束の早い計算式が必要!

計算可能実数とは