UBASIC/86 によるプログラミング入門
地蔵菩薩
1997 年度 前期
この冊子は97年○ ○ ○ 中3年生の選択授業のために,コンピュータを用いて,整 数論の入口で遊ぼうといった狙いで書かれた。
学校にコンピュータが導入されていろいろ数学を学ぶにも便利になったと考える人 は多い。しかし,実際にコンピュータを使って数学に関係のある結果を出すことは存 外に難しいのだ。
例えば,ピタゴラス数を見つけようとプログラムするにしても,if c^2=a^2+b^2 then ... という式では,丸めの誤差の関係から失敗する。if c*c=a*a+b*b then ... としなくてはいけない。場合によっては,eps=0.000000000000001などとして おいて,if abs(c*c-a*a-b*b)<=eps then ... と書かなくてはいけない。これで は,プログラミングの初心者はもう嫌になってくる。
また,桁数も倍精度にしてもわずか16桁。一般の用途には十分でも,数学で使お うとすると,19! でもオーバーフローしてしまう。もっと大きな数を扱おうとするな らば,関数はもちろん,足し算から自分でプログラミングしなければならない。ます ますコーディングは複雑になる。
これでは,プログラムの勉強になってしまい,数学の学習にはなりえない。 ところが,素晴らしいソフトが出現した。木田氏のUBASIC/86である。
2500桁までの整数計算が,まったく余計な部分に気を使わずに取り扱うことができ る。おまけにフリーソフトである。なんとも,ありがたい。
そういうわけで,いつかUBASIC/86を用いて中学生と数学をしたいと考えていた のだが,97年度に,3年生の選択数学を受け持つことになり,挑戦することにした。 しかし,毎週毎週,時間に追われての作業で,考えていたことの第1近似であるとさ えも言い難い。
テキストをこうやってまとめてみたが,結局「整数論入門」にはなれなかった。そこ でタイトルは「プログラミング入門」としてみたが,なんとも中途半端なものになっ てしまったようだ。
目 次
1 UBASIC/86 について 3
1.1 著作権など . . . 3
1.2 MS–DOS とファイル . . . 3
1.3 プログラムとは . . . 3
1.4 UBASIC/86 の起動と終了の仕方 . . . 3
2 UBASIC/86 の基礎 4
2.1 コンピュータに計算させてみる . . . 4
2.2 文章を表示させる . . . 5
2.3 プログラムを作る . . . 5
2.4 変数 . . . 6
2.5 繰り返し . . . 8
2.6 キーボードから入力する . . . 10
2.7 条件分岐 . . . 11
2.8 配列 . . . 12
3 素数をさがす 14 3.1 エラトステネスの篩い . . . 15
3.2 素数の分布を調べる . . . 18
3.3 双子素数をさがす . . . 19
4 素因数分解をする 19 4.1 素数を配列に読み込む . . . 20
4.2 素数をファイルから読みながら . . . 21
4.3 もっと大きな数の素因数分解 . . . 21
4.4 奇数で順に割って行く . . . 22
4.5 工夫してスピードアップ . . . 23
4.6 累乗を表示する . . . 24
4.7 発展問題 . . . 24
5 ピタゴラス数をみつける 25 5.1 ピタゴラスの定理 . . . 25
5.2 ピタゴラス数 . . . 26
5.3 もう一つの方法 . . . 27
5.4 ピタゴラス三角形 . . . 28
6 √2 を計算する 29 6.1 √2 は無理数である . . . 29
6.2 開平法による計算 . . . 30
6.3 連分数を利用した計算方法 . . . 32
6.4 再帰を使わずに工夫して計算 . . . 35
6.5 もっと速い方法 . . . 37
A 今後の予定 38
1 UBASIC/86 について
1.1 著作権など
UBASIC/86 Ver.8.1 は木田祐司氏が開発したソフトウェアです。著作権は木田氏が留保 していますが,その内容については複写・使用・配布が認められています。マニュアルに ついては,日本評論社から販売されています
1
。
1.2 MS–DOS とファイル
UBASIC/86 は MS–DOS の上で動きます。MS–DOS はマイクロソフト社の販売してい る基本ソフト(OS)です。MS–DOS では,プログラムもデータもキーボードやモニター, プリンターなどの機器も総て「ファイル」として統一的に扱います。
1.3 プログラムとは
プログラムとはコンピュータへの命令を集めたファイルの事です。単純な命令のことを, そのレベルによって,コマンドとかステートメントと呼びます。コンピュータに仕事をさ せるために,いちいちコマンドを打ち込んでやる事もありますが,複雑な仕事をさせるに はプログラムを書かなくてはいけません。プログラムも,その翻訳ソフトやレベルによっ て,スクリプトとかマクロとか様々な呼び方がされます。この冊子では煩雑になるので,総 てプログラムと呼ぶことにします。
1.4 UBASIC/86 の起動と終了の仕方
MS–DOS がコマンド待ちの状態であるとき, A:Y>
と表示されます。ここで, ub ✛
✄ ¡
✂ ✁と入力すれば,UBASIC/86 が起動されます。 UBASIC/86 のコマンド待ちの状態は
OK
です。ここで, system ✛
✄ ¡
✂ ✁と入力すれば,UBASIC/86 は終了し,再び MS–DOS に戻り ます。
1
「UBASIC/86 多倍長計算用 BASIC NEC PC-9801 とその互換機用第 8.1 版ユーザーズマニュア ル」
2 UBASIC/86 の基礎
2.1 コンピュータに計算させてみる
例 1
98 * 89✄✂✛¡✁と打ち込んでみてください。
OK が表示されただけで,なにも起こりませんね。
これは,コンピュータが壊れているわけではなく,ちゃんと 98 × 89 の計算はしたので す。しかし,コンピュータはこう考えています。
「計算はちゃんと命令通りしたよ。でも,その計算結果を教えろとは命令された覚えは ないな。」
かように,コンピュータは融通がきかない代物です。計算結果をモニターに表示させる 命令は print です。
なお,print の省略形として ? が使えます。なれると便利です。
例 2
print 98 * 89✄✂✛¡✁と打ち込んでみてください。
今度は,8722 と計算結果も表示されたはずです。
問1 次の計算を命令し,計算結果を表示してみましょう。 (1). 98 + 89
(2). 98 − 89 (3). 98 ÷ 89 (4). 98 + 89 × 79 (5). (98 + 89) × 79 (6). 1
2 + 1 3 (7). 1
2 × 1 3 (8). 1
2 ÷ 1 3 (9). 210 (10). √2
+ たし算
- 引き算
* かけ算
/ わり算
Y 整数の割り算の商
@ 整数の割り算の余り
^ べき乗
// 分数
sqrt(X) Xの正の平方根 int(X) Xの整数部分
rnd() 0∼1の乱数 abs(X) Xの絶対値
2.2 文章を表示させる
文章を表示するには,その文章を " でくくってやり,print "文章"✄✂✛¡✁と打ちます。
例 3
print "Hello! World!" ✄✂✛¡✁ と打ち込んでみてください。 文章には日本語も使えますが,日本語入力のためのソフト
2
が必要になります。著作権 の問題などが起きるので,みなさんのフロッピーには入っていません。
問2 (1). 「I like math.」と表示してください。
(2). 「My name is ○ ○ ○ ○ 3 」と表示してください。 (3). その他,すきな文章を表示してみましょう。
2.3 プログラムを作る
いくつかの命令をまとめて実行させるにはプログラムを書きます。UBASIC/86 の場合, プログラムは行の先頭に番号をつけることで,すぐに実行するべき命令と区別します。
次のプログラムを打ち込んでみましょう。
例 4
100 print "Hello! World!" 110 print "I like math."
120 print "My name is ○ ○ ○ ○ ." 各行で ✛
✄ ¡
✂ ✁を入力しないといけません。注意してください。
2
日本語FEP といいます。有名なのがワープロソフト「一太郎」に附属の ATOK,単体で売っている WX などです。
3
自分の名前を入れてください
auto 100 ✄✂✛¡✁と入力すると,自動的に番号を振ってくれます。その場合,プログラムの 入力を終了させるには,^c と入力してください4 。
正しく入力できたか確認するためには,list というコマンドがあります。 間違った行を修正するには,edit <line number > というコマンドがあります。 プログラムを実行するためには,run というコマンドがあります。
プログラムをフロッピーに保存するためには,asave ”<program-file name>” というコ マンドがあります。
フロッピーに保存されたプログラムを呼び出すためのコマンドは,load ”<program-file name>” です。
プログラムを消去するためのコマンドは,new です。
auto 100 100から10ずつ増やして行番号を自動的につける
list 入力されているプログラムを表示する
edit 130 130行を修正する
run 入力されたプログラムを実行する new 入力されたプログラムを消去する
asave "<file-name>" プログラムをフロッピーディスクに保存する
load "<file-name>" フロッピーディスクに保存されたプログラムを呼び出す
renum 100 プログラムを100番から順に番号をつけなおす
問3 (1). list✄✂✛¡✁と打ち込んでください。
(2). 110 行の math を English に修正してください。
(3). もう一度,list✄✂✛¡✁と打ち込んで,修正できたか,確認してください。 (4). run✄✂✛¡✁と打ち込んで,プログラムを実行してください。
(5). asave "ex3a"✄✂✛¡✁と打ち込んで,プログラムを保存してください。 (6). dir "ex*.ub"✄✂✛¡✁と打ち込んで,保存できたか確認してください。
(7). new✄✂✛¡✁と打ち込んで,プログラムを消去し,新しいプログラムを入力してくだ さい。(内容は自由)
(8). 新しいプログラムを実行した上で,ファイル名を ex3b として保存してください。 (9). 同じことを繰り返し,ex3c,ex3d,ex3e,. . . を保存してください。
(10). 最後に,load "ex3a"✄✂✛¡✁と打ち込んで,例4 のプログラムを呼び戻してください。
2.4 変数
たいていの電卓にはメモリーという数値を一時記憶する場所が一つだけあります。
✄ ¡
✂M+✁,
✄ ¡
✂M−✁,
✄ ¡
✂MR✁というキーで操作するようになっていることが多いです。
4 ✄CTRL¡
✂ ✁キーを押しながら,
✄ ¡
✂C✁を押すことです。
コンピュータでは,電卓のメモリーに当たる機能を変数と呼びます。UBASIC/86 では, 変数を一つに限らず作ることができます。変数には名前をつけなければなりません。名前 は英字で始まる16 文字以内の名前であれば OK です。
変数に数や文字列を代入するには = を用います。 a=256✄✂✛¡✁
と入力すると,変数 A に 256 が保存されます。 warukazu=128✄✂✛¡✁
と入力すると,変数 Warukazu
5
に128 が保存されます。 文章
6
も変数に入れておくことができます。 namae="Jizo Bosatsu"✄✂✛¡✁
と入力すると,変数 Namae に文字列 JizoBosatsu が保存されます。文字列は両側を " でかこってやります。x=128 は数7 を代入しており,y="128" は文字列8 を代入しています。
この = はむしろ ⇐ という意味のもので,左側の変数に右側の値を代入しなさいという 命令です。
なお,これから先は ✛
✄ ¡
✂ ✁と一々書くのを省略します。適宜,判断してください。
例 5
(1). a=256 と入力してください。
(2). warukazu=128 と入力してください。
(3). namae="(自分の名前)"と入力してください。
(4). print a と入力して記憶されていることを確認しましょう。warukazu,namae につ いても,print してみてください。
(5). print a*10000 と打ち込んでみてください。変数に対して計算することができます。 (6). print a+warukazu と打ち込んでみてください。変数同士で計算することもできます。 (7). print a/warukazu と打ち込んでみてください。
(8). c=a*a と打ち込み,さらに print c としてください。 (9). c=a^a と打ち込み,さらに print c としてください。
5
プログラムの入力は総て小文字で行ないます。内部で変数の先頭の文字は大文字に変換されます。
6
正式には「文字列」と言います。
7
ヒャクニジュウハチ
8
イチニッパ
2.5 繰り返し
1 から 100 まで表示させたいとします。このような際に, 100 print 1
110 print 2 120 print 3 ...
というプログラムを書いたのでは100 行もかかってしまい,大変です。 そこで,for∼next という命令が用意されています。
次のプログラムを打ち込んで実行してください。
例 6
1 から 100 までの和 100 for i=1 to 100110 print i 120 next i
for のある100 行と next のある 120 行の間(110 行)を繰り返し実行します。この繰り 返し部分をループといいます。
変数 i は繰り返しの回数を数えるための変数ですが,例 6 のようにループの中で通常の 変数と同様に使うこともできます。ただし,ループの中で i の値を変えないように注意し ましょう。
for <変数> = <初期値> to <終了値> 繰り返す中身 (複数行でもよい) next <変数>
上の例では,変数 i の値を 1 ずつ増やして表示していますが,増分を変えることもでき ます。
例えば100 以下の偶数を総て表示するには次のようにします。
例 7
100 以下の偶数を表示 100 for i=2 to 100 step 2 110 print i120 next i
次の問に挑戦して,for ∼ next ループの使い方に習熟してください。 問4 (1). 100 以下の 3 の倍数を総て表示してください。
(2). 10000 以下の 7 の倍数を総て表示してください。 (3). 19 の倍数を 19,38,. . . 以下 20 個表示してください。
このままでは画面が流れてしまって,困りますね。この問題に対処する,print 文のう まい使い方があります。
問5 例 7 の 110 行目を次のように変更して実行してみてください。 (1). print i,
(2). print i;
(3). print using(8),i;
なお,今後はプログラムの最後にはend という命令を付け加えることにします。これは, プログラムを終了させ,オープンしているファイルを総てクローズし
9
,未終了のfor-next ループがないかどうかをチェックする命令です。
using(8) は,8
けた
桁で表示しなさいという命令です。 問6 次のプログラムを書いて実行してみましょう。
(1). 12,22,32. . . 1002 を表示するプログラム (2). 13,23,33. . . 1003 を表示するプログラム (3). その他,いろいろやってみましょう。
それぞれのプログラムはex<問番号>の要領で保存しておきましょう。
問の中に(1),(2),...とあるときは,ex<問番号>a,ex<問番号>b,ex<問番号>c,...の 要領です。
問7 chr(i) を i が,33 から 128 まで表示するプログラムを書いてみましょう。
ヒント print using(6),i;" "+chr(i);
問8 1 × 1,11 × 11,111 × 111,1111 × 1111,11111 × 11111,...を計算して表示する プログラムを書いてみましょう。
繰り返しのループを二重にすることも可能です。 次の例は,九九の表を表示します。
例 8
九九の表 100 for i=1 to 10 110 for j=1 to 10120 print using(8),i*j; 130 next j
140 next i 150 end
9
この意味は3.1 節でわかりますので,今は読みとばしてください。
2.6 キーボードから入力する
次のプログラムは,1 から 1000 までの和を計算し,表示します。
例 9
1 から 1000 までの和 100 kotae=0110 for i=1 to 1000 120 kotae+=i 130 next i 140 print kotae 150 end
変数I の値は 1 から 1000 まで繰り返されますので,これで,1 から 1000 までの和が変 数 Kotae の中に作られます。
入力,実行し,rei9a という名前で保存してください。
120 行の kotae+=i は,変数 Kotae に変数 I の値を加えなさいという命令です10 。 このプログラムは1 から 1000 までの和を計算してくれますが,一度使ったらそれで終わ りです。答をメモしておけばよいのですから。
1 から 2000 までの和が必要になったら,110 行目を for i=1 to 2000 に変更すればい いわけです。しかし,いちいち必要になったときに修正するというのもめんどうです。実 は,うまい方法があります。プログラムを作る段階ではいくつまでの和を求めるかを決め ておかず,プログラムを走らせた時に,いくつまでの和を求めるのかを入力するようにす るのです。
例9 を基に,1 から好きな数までの和を計算・表示するプログラムを作りましょう。 キーボードから変数に値や文字列を読み込む命令は,input です。
input A 変数Aにキーボードから値を代入します。
input "イクツマデ";A モニターに「イクツマデ」と表示し,変数Aにキーボードか ら値を代入します。
input A,B 変 数 A と B に キ ー ボ ー ド か ら 値 を 代 入 し ま す。入 力 は 15,76✄✂✛¡✁のように,「,」で区切って行ないます。
それでは,プログラムを変更しましょう。 90 input "1 から いくつまで";A
と打ち込み,さらに110 行を 110 for i=1 to A
と変更してください。list で,正しく変更できたかどうかを確認します。うまく,変更で きていたら,run で実行してください。
renum 100 とすると,行番号を 100 からに整理しなおしてくれます。 rei9b という名前で保存しておきましょう。
10
この行はkotae=kotae+i と同じ事になります。
問9 1 から入力した数までの積を求めるプログラムを書いてください。 1 × 2 × 3 × · · · × n
ヒント *=を使えば簡単。kotae*=iは kotae=kotae*iと同じ意味です。
この計算を階乗といいます。
問10 1 から入力した数までの 2 乗の和を求めるプログラムを書いてください。 12+ 22+ 32+ · · · + n2
2.7 条件分岐
変数の値を見て,場合に応じて実行する内容を変更するための命令がif ∼ then ∼ else
∼ endif です。
次の例は,入力した数が偶数か奇数かを答えるプログラムです。
例 10
even or odd 100 while 1110 input "type in number = ";a
120 if a@2=0 then print "even" else print "odd" endif 130 wend
140 end
110 行の while と,130 行の wend は,for ∼ next と同じように繰り返しのループ を作る命令です。for ∼ next より一般的なループを作れますが,詳しくは後述します。 ここでは,無限の繰り返しをさせるために使っているということだけ理解しておいてくだ さい。
入力したら,run してみましょう。偶数を入力すると「even」,奇数を入力すると「odd」 と表示されるはずです。プログラムは永遠に終わりません。終了させるには,^c と入力し てください。
120 行に注目してください a@2 というのは,a を 2 で割った余りを求めていますから, a@2=0 は a が偶数の時のみ正しくなります。(奇数の時には余り 1 になる。)
a@2=0 が正しい時には then 以下の命令を,正しくない時には else 以下の命令を実 行します。
if <条件式> then <条件が正しい時>else <条件が正しくない時>endif 実行する命令がたくさんある場合は,: を使って次のように書きます。
例 11
長い if 文100 while 1
110 input "type in number = ";a 120 if a@2=0
130 :then print "even" 140 :print "偶数だよ"
150 :print "これは正しい場合" 160 :else print "odd"
170 :print "奇数です"
180 :print "これは正しくない場合" 190 :endif
200 wend 210 end
:は行がまだ続いているよという命令です。
問11 年齢を入力して,20 歳以上ならば「お酒 OK!」,20 歳未満ならば「お酒 NG!」と表 示するプログラムを書いてください。
問12 ヘロンの公式を用いて,三角形の三辺を入力すると,その面積を求めるプログラムを 書いてみましょう。
ただし,もし入力された三辺では三角形にならない場合は,入力にミスがあると表示 して終了するようにしてください。
ヒント ヘロンの公式:
三辺の長さをa,b,cとすると,まず,h =
a + b + c
2 を計算する。三角形の面積Sは, S =√h(h − a)(h − b)(h − c)
で求められる。
問13 (1). 入力した数が 7 で割り切れる場合は「Lucky!」, 割り切れない場合は 7 で割っ た余りを表示するプログラムを作ってください。
(2). 入力した数が 7 で割り切れる場合は「Lucky!」, 割り切れない場合のうち,3 なら 割り切れる場合は「Don’t mind.」,7 でも 3 でも割り切れない場合は「Unlucky!」 と表示するプログラムを作ってください。
2.8 配列
if 文を使って,次の問題を解いてみてください。
問14 1 から 12 の数を入れるとその月を英語で表示するプログラムを作ってください。 1 を入力すると「January」,12 を入力すると「December」と表示するようにします。
例 12
if 文のかたまり100 input "input number(1 to 12) = ";tuki 110 if tuki=1 then print "Junuary"
120 :elsif tuki=2 then print "February" 130 :elsif tuki=3 then print "March" 140 :elsif tuki=4 then print "April" 150 :elsif tuki=5 then print "May" 160 :elsif tuki=6 then print "June" 170 :elsif tuki=7 then print "July" 180 :elsif tuki=8 then print "August" 190 :elsif tuki=9 then print "September" 200 :elsif tuki=10 then print "October" 210 :elsif tuki=11 then print "November" 220 :elsif tuki=12 then print "December" 230 :else print "Error!"
240 :endif 250 end
上の解答例はいかにも大変です。このようなときに,配列という便利なものがあります。 dim <配列名>(添字の上限)
と命令すると,配列名(0)∼配列名 (添字の上限) という変数が確保されます。
例えば,dim month(12) と命令11 すると,month(0)∼month(12) までの13 個の変数が 確保されます
12
。
次のプログラムを入力し,実行してみましょう。
例 13
配列ですっきり 100 dim month(12)110 month(1)="Junuary" 120 month(2)="February" 130 month(3)="March" 140 month(4)="April" 150 month(5)="May" 160 month(6)="June" 170 month(7)="July" 180 month(8)="August" 190 month(9)="September" 200 month(10)="October" 210 month(11)="November" 220 month(12)="December"
11
この場合,正しくは「宣言」と言います。
12 month(0) は無駄になります。
230 for tuki=1 to 12 240 print month(tuki) 250 next tuki
260 end
230 行以下を次のように変えると,先の例とほぼ同じ機能13 をもったプログラムが完成 します。
例 14
230 input "input number(1 to 12) = ";tuki 240 print month(tuki)
250 end
3 素数をさがす
整数論の入門として,まずは素数(prime number) と戯れることにしましょう。
この冊子では,整数としては正の数だけを考えることにします。つまり自然数を研究の 対象とします。素数の定義としては,「1 とその数以外に約数を持たない数」というのが教 科書に採用されています。これで間違いではないのですが,1 は素数ではありませんので 注意してください。したがって,「約数をちょうど2 つだけもつ数」が素数であると覚えれ ばよいでしょう。
最小の素数は2 である。 偶数の素数は2 だけである。
素数は2 からはじまり,それから後は奇数ばかりになることは自明でしょう。 素数は無限に存在する。
この証明は自明ではありませんので,大筋だけ,説明しましょう。
13
厳密には,1∼12 以外の数を入力されたときのエラー処理が省略されています。 235 if or{tuki<1,tuki>12} then print "Error!":goto 230
と追加すると良いでしょう。
素数が無限にあることの証明
✓ ✏
もし,素数が2, 3, 5, 7, . . . , P までしかないとする。a ここで,
M = 2 × 3 × 5 × 7 × . . . × P + 1 という数M を考える。
このM は,どの素数よりもずっと大きいから素数ではない。
ところが,M はどの素数でもわりきれない(余り1 になる)。したがって,M は,素 数である
b
。
これはP が最大素数であることと矛盾する。 したがって,素数は無限にある。
a
すなわちP が最大素数であるとする。
b
もう少し詳しく言うと,M は素数か,もしくは合成数である。ところが合成数だとすると,それが
どの素数でも割り切れないということはおかしい。したがって,M は合成数ではない。したがって,M
は素数である。
✒ ✑
3.1 エラトステネスの篩い
素数を見つけ出しておいて,データ・ファイルとして保存しておき,いろいろなプログ ラムで利用するようにしましょう。
素数を見つけ出す方法は,さまざまありますが,ここではエラトステネスの
ふる
篩いという アルゴリズムを使用します。
(1). まずは,必要な数だけ,配列を用意します。 (2). 2 を初めの素数に選びます。
(3). 2 の倍数は全部合成数ですから,チェックします。
(4). 次の数をみます。合成数のチェックがされてなければ素数です。 (5). 見つけた素数の倍数を全部合成数にチェックします。
(6). (4)∼(5) を繰り返します。
実際にこのアルゴリズムでプログラムしてみたのが,次の例です。
例 15
1000 以下の素数90 Owari=1000 ’1000以下の素数を探します
100 print=print+"p1000.dat" ’”p1000.dat”というファイルに保存します 110 dim Kazu%(Owari) ’Kazu%()がチェック用の配列です
120 for I=1 to Owari ’はじめに全部 0 を入れておきます 130 Kazu%(I)=0 ’ 素数は1と入れ
140 next I ’ 合成数は2と入れる事にします。 150 ’
160 I=2
170 while (I<=Owari)
180 if Kazu%(I)=2 goto 250 ’選んだ数が合成数なら次に進む
190 Kazu%(I)=1 ’そうでなければ素数のチェックをします 200 J=2 ’その素数の2倍,3倍… は合成数 210 while (I*J<=Owari)
220 Kazu%(I*J)=2 230 J+=1
240 wend
250 I+=1 ’次の数を選びます
260 wend 270 ’
280 for I=1 to Owari ’ここから画面に素数を表示しながら 290 if Kazu%(I)=1 then print I ’同時にファイルに書き込みます 300 next I
310 end ’終了
上のプログラムを入力し,実行してみましょう。(後ろの’ 以下はメモなので,入力する 必要はありません。)
フロッピー・ディスクに "p1000.dat" というファイルができたはずです。 次に,先頭の
90 Owari=1000
100 print=print+"p1000.dat"
の部分を,下のように変更して,実行すると10000 以下の素数を選び出します。
"p10000.dat" にしまっておきます。 90 Owari=10000
100 print=print+"p10000.dat"
時間があれば,50000 以下の素数を,"p50000.dat" というファイルにしておきましょう。 90 Owari=50000
100 print=print+"p50000.dat"
この授業では,50,000 以下の素数までで終わりにしておきますが,もっとたくさん見つ けたいと言う場合には工夫が必要になります。それは,Kazu%() を準備する段階で,そのコ ンピュータが使えるメモリの大きさによっては,メモリが足りなくなってしまうからです。
この問題への対応としては,
• メモリを増やす。
単純ですが,簡単な方法です。ただし,今使っているMS-DOSのバージョン
14
では無意味で す。最近のコンピュータなら有効です。
• プログラムを工夫する。
例えば,2以外の偶数はすべて合成数であるのだから,はじめから奇数だけについて調べて, 最後に2を加えることにすれば,メモリは 1/2に節約される。
• 配列にとらずに,ファイルを読み書きすることに変更する。
こうすれば,メモリを増やさなくても,外部記憶装置(フロッピーディスクやハードディス ク)の容量までは,素数を調べることができます。
最近のコンピュータには1G
15
以上のハードディスクがついているのが普通ですから一番実 用的な方法でしょう。
なお,UBASIC/86ではハードディスク上に仮想的な配列を作る機能がありますからたいへ
ん簡単です。 などが考えられます。
さて,3 つの素数データファイルは完成しましたでしょうか。 それでは,ちゃんとファイルができたか,その中身を覗くプログラム
16
を書きましょう。
例 16
ファイルの中を見る100 input "open file name = ";Filename ’ファイル名を変数filenameに入れます 110 open Filename for input as #1 ’ファイルを開きます
120 Count=0
130 while not eof(1) ’ファイルの終わりまで繰り返し 140 input #1,Sosu ’一つ素数を変数Sosuに読みます 150 print Sosu, ’Sosuを表示します
160 Count+=1 ’ついでに素数の個数を数えます
170 wend
180 print:print
190 print Count;" 個の素数がありました"
200 close ’ファイルを閉じます
210 end
入力したら,実行してみましょう。ファイル名を入力するところでは,"p1000.dat"✄✂✛¡✁ のように「"」をつけるのを忘れないでください。
ファイルに書き込む時,読み込む時は,はじめにopen コマンドでファイルを開きます。 最後には close コマンドでファイルを閉じます。
14 2.11
15 1G (ギガ)=1,000M(メガ)=1,000,000k(キロ)=1,000,000,000 のこと
16
めんどうな場合は,system✛
✄ ¡
✂ ✁で MS-DOS に戻って,type コマンドを使えば簡単です。
open <file name> for
input (読み込む場合) output (書き込む場合) append (追加で書き込む場合)
as #<番号>
3.2 素数の分布を調べる
素数がどのように分布しているのか調べて見ましょう。
1 から 100 までの間には,25 個の素数があります。101 から 200 までにはいくつあるで しょう。その次の100 個の数の中にはどうでしょう。さらにその次は. . . 。
次のプログラムは,p1000.dat について,調べて表示するものです。
例 17
素数の分布 p1000.dat 用 100 dim Rank(10)110 for I=1 to 10 120 Rank(I)=0 130 next I
140 ’
150 open "p1000.dat" for input as #1 160 while not eof(1)
170 input #1,Buf ’file には文字列でしまわれて 180 Prime=val(Buf) ’ いるので val() で数に戻します。 190 Keta=int(Prime/100)+1
200 Rank(Keta)+=1 210 wend
220 close #1 230 ’
240 for I=1 to 10
250 print "∼";using(5),I*100;" : ";using(4),Rank(I) 260 next I
270 end
int() は整数部分を求める関数です。
240 行以下を下のように変えると,簡便なグラフが表示できます。
例 18
グラフ表示 240 for I=1 to 10250 print "∼";using(5),I*100;":"; 260 for J=1 to Rank(I)
270 print "*"; 280 next J
290 print using(4),Rank(I)
300 next I 310 end
問15 素数の分布には,どのような法則性がみられますか。
問16 上のプログラムを参考に,10000 以下の素数の分布,または 50000 以下の素数の分布 を調べて見ましょう。
ヒント rank(500) では,メモリに入りきらないおそれがあるので,rank%(500)にしましょう。
3.3 双子素数をさがす
素数は,2 と 3 は連続していますが,それ以外は 1 つ以上離れています。素数はだんだん とまばらに存在するようになっていきますが,ときおり,17 と 19 のように 1 つおきで現れ ることがあります。
17 と 19,29 と 31 のように,連続した 2 つの奇数がともに素数であるとき,この 2 つ の素数を 双子素数 と呼びます。
データ・ファイルの中から,双子素数を見つけ出してみましょう。
例 19
双子素数 100 Cnt=0110 input "input data file name = ";Filename 120 open Filename for input as #1
130 input #1,Buf 140 Ani=val(Buf) 150 while not eof(1) 160 input #1,Buf 170 Otouto=val(Buf)
180 if Otouto=Ani+2 then print Ani,Otouto:Cnt+=1 endif 190 Ani=Otouto
200 wend 210 close #1
230 print:print Cnt;"組の双子素数が見つかりました。" 240 end
4 素因数分解をする
素因数分解は,約数を見つけたり,最大公約数・最小公倍数を見つけるためにも活躍し ます。ひいては,分数の約分や通分にも必要になってきます。
素因数分解をするプログラムをいくつかの方法で作ってみましょう。
4.1 素数を配列に読み込む
素数データ "p1000.dat" を利用して素因数分解をするプログラムを作りましょう。 素因数分解は順に素数で割っていけばいいのですから,素数のデータをはじめに配列に 読み込み,それを利用して素因数分解をするプログラムを組んでみましょう。
例 20
素因数分解 I100 ’1000 以下の素数を配列 P() に読み込む 110 dim P(167)
120 open "p1000.dat" for input as #1 130 for I=0 to 167
140 input #1,P(I) 150 P(I)=val(P(I)) 160 next I
170 close #1
180 ’ ここから素因数分解のプログラム 190 input "自然数を入力してください = ";N 200 print N;" = ";
210 I=0
220 Owari=sqrt(N) ’√N まで調べればOK 230 while (P(I)<=Owari)
240 K=N/P(I)
250 if N=int(K)*P(I) 260 :then print P(I);
270 :if K=1 then goto 350 endif 280 :print " × ";
290 :N=K
300 :else if I=167 then goto 340 endif
310 :I+=1
320 :endif 330 wend
340 print int(N) 350 print
360 input "終了? [y/n]";yn 370 if yn<>"y" goto 180 380 end
問17 このプログラムで,正しく素因数分解できるのはだいたいいくつまででしょう。
4.2 素数をファイルから読みながら
もっと,大きな数を素因数分解するためには,素数データをたくさん用意しなければな りません。
しかし,配列に読み込むためにはメモリの限界があります。p1000.dat は読み込めます が,p50000.dat ではメモリが足りなくなってしまいます。
そこで,速度は遅くなります
17
が,ファイルから調べる素数を一つずつ読み込むプログ ラムを次に示します。
例 21
素因数分解 II100 open "p50000.dat" for input as #1 110 input "自然数を入力してください = ";N 120 print N;" = ";
130 input #1,P 140 P=val(P) 150 Owari=sqrt(N) 160 while (P<=Owari) 170 K=N/P
180 if N=int(K)*P 190 :then print P;
200 :if K=1 then goto 280 endif 210 :print " × ";
220 :N=K
230 :else if eof(1) then goto 270 endif 235 :input #1,P
240 :P=val(P) 250 :endif
260 wend
270 print int(N) 280 print
290 close 300 end
4.3 もっと大きな数の素因数分解
さらに欲を出して,UBASIC/86 の扱える数(約 2500 桁)までの範囲で素因数分解をで きるプログラムを考えてみましょう。
プログラムとしては,サブルーティンという機能が新しく出てきます。
17
小さな数だったら,むしろ速くなるかもしれません。最初にデータを全部読み込まなくても良いので。
4.4 奇数で順に割って行く
2 以外の素数はすべて奇数であるということを利用して,素因数分解するプログラムです。
例 22
素因数分解 III110 input "type in number =";Number 120 print Number;" = ";
130 ’
140 gosub *Test(&Number,2) 150 Pm=3
160 Endnum=sqrt(Number) 170 while (Pm<=Endnum)
180 gosub *Test(&Number,Pm) 190 if Number=1 goto 220 200 Pm+=2
210 wend
220 if Number<>1 then print int(Number) else print endif 230 goto 110
240 end 250 ’
260 *Test(&Kazu,Sosu)
270 if Kazu<>int(Kazu/Sosu)*Sosu return 280 print Sosu;
290 Kazu/=Sosu
300 if Kazu=1 return 310 print " × "; 320 goto 270
Pm を 2 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , . . . と変化させて,それぞれ割り切れるかどう かをテストします。
270 行が割り切れるかどうかのテストです。不合格なら,制御を戻し,合格なら 280 行 目以降で,結果を出力します。
このテストは,はじめは Pm=2 として行ないます。そのあと,いろいろな値で繰り返し ますので,260 行から 320 行にまとめて後ろの方においてあります。これをサブ・ルーティ ンといいます。
gosub でサブルーティンを呼び出します。サブルーティンから戻るための命令は return です。
このサブ・ルーティン(*Test)を140 行と 180 行で呼び出しています。
4.5 工夫してスピードアップ
奇数だけを調べるということは,結局 2 の倍数をスキップすることです。それでは,2 の倍数の次に多い 3 の倍数もスキップするようにすれば,このプログラムの動作速度が向 上するはずです。
ただif pm=int(pm/3)*3 then ... という文では割り算することに変わりはありません から,逆に遅くなってしまうことも考えられます。別の方法をさがさなくてはいけません。
2 でも 3 でも割り切れない数をすこしあげてみましょう。 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, . . .
差が 2 , 4 , 2 , 4 , . . . となっていることがわかりますね。結局,2 でも 3 でも割り切れない 数は(6 の倍数 ±1) と整理できます。このことを利用してプログラムしましょう。
例 23
素因数分解 IV110 input "type in number =";Number 120 print Number;" = ";
130 ’
140 gosub *Test(&Number,2) 150 gosub *Test(&Number,3) 160 Pm=6
170 Endnum=sqrt(Number) 180 while (Pm<=Endnum)
190 gosub *Test(&Number,Pm-1) 200 gosub *Test(&Number,Pm+1) 210 Pm+=6
220 wend
230 if Number<>1 then print int(Number) else print endif 240 end
250 *Test(&Kazu,Sosu)
260 if Kazu<>int(Kazu/Sosu)*Sosu return 270 print Sosu;
280 Kazu/=Sosu
290 if Kazu=1 return 300 print " × "; 310 goto 260
問18 いくつか,試しに大きな数を素因数分解してみましょう。
大きな数を試してみた時,もう結果が出ているのに,プログラムが終了しないことがあ ります。
その原因は,途中で素因数分解が終わっても,180 while (Pm<=Endnum) という条件 をみたすまではループを抜け出さないからです。UBASIC/86 にはループを抜け出す break というコマンドはないので,goto を使ってしまいましょう。
次の2 行を付け加えると,改良できます。
例 24
212 if Number=1 goto 230 214 Endnum=sqrt(Number)
問19 なぜ,この 2 行で改良されたか,それぞれの行について考えてみましょう。
4.6 累乗を表示する
スピードの向上はこの程度にして,今度は結果の表示を改良してみましょう。 問20 サブルーティン(*Test)を改良して,
36 = 2 × 2 × 2 × 2 × 3 × 3 ではなく,
36 = 24× 32 の形で表示できるようにしてみましょう。
解答の例を示します。
例 25
累乗表示 290 *Test(&Kazu,Sosu) 300 Cnt=0310 if Kazu<>int(Kazu/Sosu)*Sosu goto 360 320 Cnt+=1
330 Kazu/=Sosu
340 if Kazu=1 goto 360 350 goto 310
360 if Cnt=0 then return 370 :elseif Cnt=1 then print Sosu; 380 :else print Sosu;"^(";Cnt;")"; 390 :endif
400 if Number<>1 then print " × "; 410 return
4.7 発展問題
プログラムに慣れてきた人のために,いくつか発展問題を出題しておきます。
問21 この素因数プログラムを利用して,1 から 1000 までの素因数分解の結果を表にして みましょう。
問22 さらに,素因数分解の結果から約数をすべてだしてみましょう。その上で, 数 素因数分解 約数 約数の個数
2 2 1, 2 2
3 3 1, 3 2
4 22 1, 2, 4 3
5 5 1, 5 2
6 2 × 3 1, 2, 3, 6 4 ... ... ... ... という表を作ってみましょう。
問23 (1). その数自身以外の約数の和を求めてみます。例えば,4 の約数は 1 , 2 , 4 です から,4 以外の約数の和は 1 + 2 = 3 ,5 の場合は 1, 6 の場合は 1 + 2 + 3 = 6 となります。
この最後の 6 のように,この和がもとの数と一致する数を完全数といいます。 6 以外の完全数を見つけてください。
(2). またA の(その数自身以外の)約数の和が B,B の(その数自身以外の)約数 の和がA であるような A と B を親和数とか友愛数と呼びます。この例を見つけ てください。
5 ピタゴラス数をみつける
5.1 ピタゴラスの定理
ピタゴラスの定理
18
はご存じですね。
そうです。直角三角形の直角をなす2 辺の長さを a,b,斜辺の長さを c としたとき,
a
2+ b
2= c
2が成立するというたいへん美しい定理です。
ピタゴラスはギリシャ時代の有名な数学者の名前ですが,ピタゴラスがこの定理をはじ めて発見したかどうかは疑わしいものがあります。古今東西,たくさんの証明が残されて おり,それだけで1 冊の本になるくらいです。
なぜ,文明の発生した所では,必ずこのピタゴラスの定理が発見
19
されるのでしょうか。 それは,この定理が単純で,美しく,不思議だなという感動を呼ぶからというだけでなく, 実用的であったからだと思います。
18
日本の教科書では「三平方の定理」と呼ばれています。中国では「股勾弦の理」だそうです。
19
発見ではなく,発明なのかもしれません。
それは,このピタゴラスの定理というより,その逆である「ピタゴラスの定理の逆」が 必要だったからではないでしょうか。
ピタゴラスの定理の逆
✓ ✏
a2+ b2 = c2 であるとき,a,b,c を3 辺の長さに持つ三角形は直角三角形である。
✒ ✑
文明は,直角を必要とします。暦を作るために天文学を研究するにも,税金を徴収する ために土地の面積を計算するにも,公共施設を建築するためにも,直角は重要なのです。
ピタゴラスの定理の逆は,その直角を作り出す方法を示したものです。
5.2 ピタゴラス数
古代エジプトでは,直角を作り出す貴重な数として (3,4,5) が知られていました。他に も,整数で,直角を作り出す数にはどのようなものがあるのでしょうか。当然,興味はそ ちらに進んでいきますね。
3 つの自然数,(a,b,c) が,a2 + b2 = c2 の関係をみたす時,これらをピタゴラス数と 呼びます。
有名なピタゴラス数として,(3,4,5) の他にも (5,12,13) がありますね。受験生の諸君は, これらは(その整数倍も含めて)よく試験に出てくる三角形ですから,よく覚えておきま しょう。
閑話休題。ピタゴラス数を見つけ出すプログラムを作りましょう。
例 26
ピタゴラス数110 input "直角を挟む辺の最大値 ";Max 120 for A=3 to Max-1
130 for B=A+1 to Max 140 C2=A*A+B*B 150 C=int(sqrt(C2))
160 if C2=C*C print A,B,C 170 next B
180 next A
190 print "complete" 200 end
いろいろな方法が考えられますが,直角を挟む二辺をいろいろな値に変化させて,その 2 乗の和が平方数かどうかを調べるという方法でプログラムしました。
最大値を20 で実行してみると,次のような結果が出るはずです。
3 4 5 5 12 13 6 8 10 8 15 17 9 12 15 12 16 20 15 20 25 complete
これをよく見ると,(6,8,10), (9,12,15),. . . は,どれも (3,4,5) の倍数です。これは,これ でもちろんピタゴラス数ですが,「素な」ピタゴラス数ではないという感じですね。
これらを排除するには 160 行を次のように修正すれば OK です。 160 if and{C2=C*C,gcd(A,B)=1} print A,B,C
gcd(A,B) は A と B の最大公約数を求める関数です。gcd(A,B)=1 なので,A と B は互い に素なものだけを選ぶことになります。
問24 素なピタゴラス数を 100 組見つけだしてみましょう。
見つけだしたピタゴラス数は pita.dat というファイルに保存しておきましょう20 。5.4 節で使用します。
5.3 もう一つの方法
ピタゴラス数はいったいどのくらい存在するのでしょうか。実は,ピタゴラス数は無数 に存在することが証明されています。
20
うまく動くか確かめた後で, print=print+"pita.dat"✄✂✛¡✁
とします。その上で,もう一度プログラムを走らせてください。
ピタゴラス数が無数にあることの証明
✓ ✏
m, n を自然数とし,(m > n)
a= m2− n2 , b = 2mn , c = m2+ n2 を考える。 a2 = (m2− n2)2
= m4− 2m2n2+ n4 b2 = (2mn)2
= 4m2n2 c2 = (m2+ n2)2
= m4+ 2m2n2+ n2 したがって,
a2+ b2 = (m4− 2m2n2 + n4) + (4m2n2)
= m4− 2m2n2+ n4+ 4m2n2
= m4+ 2m2n2+ n4
= c2
つまり,a, b, c はピタゴラス数である。
自然数m, n は無数にあるので,ピタゴラス数も無数にあることが証明された。
✒ ✑
問25 上の証明を利用して,ピタゴラス数を見つけ出すプログラムを書いてみましょう。
5.4 ピタゴラス三角形
ピタゴラス数を3 辺にもつ直角三角形をピタゴラス三角形と呼びます。
発展問題として,ピタゴラス三角形について調べてみましょう。pita.dat をもとに,次 の問いに挑戦してみてください。
問26 (1). ピタゴラス三角形の面積を pita.dat に付け加えましょう。
(2). ピタゴラス三角形の外接円の半径を pita.dat に付け加えましょう。 (3). ピタゴラス三角形の内接円の半径を pita.dat に付け加えましょう。
ヒント (1). S = ab
2 (2). R = c
2 (3). r = a + b − c
2
問27 (1). と (3). の結果をみて,何か気付いたことはありませんか。気がついたら,そ れはなぜかを考えてみてください。
(3,4,5) の 3 倍である (9,12,15) と,(5,12,13) の二つの直角三角形を組合わせると,[13,14,15] という三角形ができます。この三角形は3 辺が整数である上に,その面積も整数になりま す。このような三角形をヘロン三角形
21
と呼ぶことにしましょう。 問28 [13,14,15] 以外にも,ヘロン三角形を見つけだしてください。
おまけ:ピタゴラス三角形を利用したピタゴラスの定理の証明
✓ ✏
ピタゴラス三角形の面積を S とすると,6 C=6 R であることから, S = ab
2 [1]
また,内接円の半径r =
a+ b − c
2 であることから, S = 1
2× (a + b + c) × a+ b − c2
= (a + b + c)(a + b − c) 4
= a
2+ 2ab + b2− c2
4 [2]
[1] と [2] から,
a2+ 2ab + b2− c2
4 =
ab 2 a2+ 2ab + b2− c2 = 2ab
a2+ b2− c2 = 0 a2+ b2 = c2
✒ ✑
6 √ 2 を計算する
6.1 √ 2 は無理数である
x2 = 2 となる数 x は正の数と負の数の 2 つ存在しますが,このうちの正の数の方を √2 と表記することはご存じでしょう。
√2 は,どこまでも続く無限小数であり,整数 整数
の形では表せないことを学んだはずです。 そのような数を無理数と呼ぶのでした。
21
この命名は一般的なものか,私が勝手につけたものか,よくわかりません。ごめんなさい。
√2 が無理数であることの証明
✓ ✏
√2 = n
m ただしm, n は互いに素
a
であるとする。
両辺を2 乗すると,
(√
2)2 =
(n
m
)2
2 = n
2
m2 2m2 = n2 最後の式からn
2
は偶数であることがわかる。 ところが,(偶数)
2
は偶数,(奇数)
2
は奇数であるから,n は偶数である。 そこで,n= 2i とおき,最後の式に代入すると,
2m2 = n2 2m2 = (2i)2 2m2 = 4i2
m2 = 2i2
すると,この最後の式からは同じ様にm も偶数であることがわかる。
結局,m も n も偶数であることになり,これは m, n は互いに素であるというはじめの 仮定に矛盾する。
したがって,
√2 は整数 m, n によって,n
m の形では表せない。 すなわち,
√2 は無理数である。
a m, n の最大公約数が 1 であることをいいます。n/m が約分できない分数であるということです。
✒ ✑
6.2 開平法による計算
それでは,実際にプログラムによって
√2 を計算してみましょう。 次のプログラムを解読してみてください。
例 27
√2 110 point 20 120 X=1
130 input "type in 桁数 = ";N 140 for I=1 to N
150 D=1/10^I
160 while (X*X<=2) 170 X+=D
180 wend 190 X-=D
200 print using(,N),X 210 next I
220 end
point 20 は小数部を96
けた
桁分確保しろという命令です。
X を1 からはじめて,D を加えていきながら,2 乗したら 2 にならないかどうか調べてい ます。(160∼180 行)
D は,はじめは 0.1 。2 回目は 0.01 。. . . と入力した桁数まで小さくしていきます。 問29 このプログラムを動かして,√2 を小数点以下 50 桁まで求めてみましょう。
例 28
√2 を 50 桁求める
1.40000000000000000000000000000000000000000000000000 1.41000000000000000000000000000000000000000000000000 1.41400000000000000000000000000000000000000000000000 1.41420000000000000000000000000000000000000000000000 1.41421000000000000000000000000000000000000000000000 1.41421300000000000000000000000000000000000000000000 1.41421350000000000000000000000000000000000000000000 1.41421356000000000000000000000000000000000000000000 1.41421356200000000000000000000000000000000000000000 1.41421356230000000000000000000000000000000000000000 1.41421356237000000000000000000000000000000000000000 1.41421356237300000000000000000000000000000000000000 1.41421356237300000000000000000000000000000000000000 1.41421356237309000000000000000000000000000000000000 1.41421356237309500000000000000000000000000000000000 1.41421356237309500000000000000000000000000000000000 1.41421356237309504000000000000000000000000000000000 1.41421356237309504800000000000000000000000000000000 1.41421356237309504880000000000000000000000000000000 1.41421356237309504880000000000000000000000000000000 1.41421356237309504880100000000000000000000000000000 1.41421356237309504880160000000000000000000000000000 1.41421356237309504880168000000000000000000000000000 1.41421356237309504880168800000000000000000000000000 1.41421356237309504880168870000000000000000000000000 1.41421356237309504880168872000000000000000000000000 1.41421356237309504880168872400000000000000000000000
1.41421356237309504880168872420000000000000000000000 1.41421356237309504880168872420000000000000000000000 1.41421356237309504880168872420900000000000000000000 1.41421356237309504880168872420960000000000000000000 1.41421356237309504880168872420969000000000000000000 1.41421356237309504880168872420969800000000000000000 1.41421356237309504880168872420969800000000000000000 1.41421356237309504880168872420969807000000000000000 1.41421356237309504880168872420969807800000000000000 1.41421356237309504880168872420969807850000000000000 1.41421356237309504880168872420969807856000000000000 1.41421356237309504880168872420969807856900000000000 1.41421356237309504880168872420969807856960000000000 1.41421356237309504880168872420969807856967000000000 1.41421356237309504880168872420969807856967100000000 1.41421356237309504880168872420969807856967180000000 1.41421356237309504880168872420969807856967187000000 1.41421356237309504880168872420969807856967187500000 1.41421356237309504880168872420969807856967187530000 1.41421356237309504880168872420969807856967187537000 1.41421356237309504880168872420969807856967187537600 1.41421356237309504880168872420969807856967187537690 1.41421356237309504880168872420969807856967187537694
1 桁ずつ計算されていく様子がわかりますね。
問30 例 28 のプログラムを修正して,入力した数の正の平方根を 50 桁まで計算するプログ ラムを作ってみましょう。
次の行を追加,または修正してみましょう。
例 29
125 N=50
130 input "type in number = ";A 160 while (X*X<=A)
6.3 連分数を利用した計算方法
連分数とは初めて聞く言葉だと思います。どういうものを連分数というのかは実物を見 てもらうのが一番簡単ですので,まずは次の式変形を読んでください。
√2 を x とおいて, 変形していきます。
x = √2 x2 = 2 x2 = 1 + 1 x2− 1 = 1 (x + 1)(x − 1) = 1
x − 1 = x + 11 x = 1 + 1
1 + x
x = 1 + 1
1 + 1 + 1 1 + x
x = 1 + 1
2 + 1 1 + x
x = 1 + 1
2 + 1
1 + 1 + 1 1 + x
x = 1 + 1
2 + 1
2 + 1 1 + x
x = 1 + 1
2 + 1
2 + 1
2 + 1 1 + x
x = 1 + 1
2 + 1
2 + 1
2 + 1
2 + 1 1 + x これを無限に繰り返せば
x = 1 + 1
2 + 1
2 + 1
2 + 1
2 + 1 2 · · · ここで,x =
√2 でありましたから,