昨日今日明日

きのうを思い、きょうを実感し、あすに想いを馳せよう。
若年性或いは老人性痴呆症にならない為にもね?

songzhaoのボケ封じ数学講座第3講

2006年01月12日 | Weblog
 今日は素因数分解に挑戦する:

 素因数分解とは、任意の自然数(正の整数)を素数の積として表示することをいう。
 例えば、4=2*2(2x2)=2^2(2の2乗のコンピューター言語での書き方)、6=2*3、8=2^3、12=2^2*3というように、素数の積として表記することです。
 
 私たちも学生の頃、確かに、「素因数分解」についても学んだのですが、非常に印象が薄いものとして記憶の片隅に残っているかどうか疑わしいのではないかと思う。
 その理由はとても簡単で、当時の学習指導方針が、ただ単に「素因数分解」という技術だけを教えることだけが目的の全てだったからに外ならない。時既に遅しであるが、実は、合理的に連立方程式を解くための前提となる重要事項なのである。
 そういう意識付けが行われなかったことは、まことに不幸であった。

 現在では、大量のデータを処理できる類のコンピューター言語が、必然的に主流になっていますが、BASIC言語はアルゴリズム(パーソナルで破綻しないコンピューター・プログラム)を構築するには、最適な言語です。コンピューターの構造などの知識が無くても十分に活用できるのである。何よりも簡単な英語の知識さえあれば、それで十分という取っ付き易さがとても良い。

 コンピューターのプログラムは、それを作る人の思考方法を写し取る鏡のようなものです。私が恥じも外聞も無く紹介するものは、ただ単に一例に過ぎないと思ってください。
 頭の良い人が組めば、いくらでも合理的なプログラムを構築できるのである。とはいえ、効率の良し悪しはさほど問題ではなく、破綻しないアルゴリズムを構築することが最重要なことである。

 現代は、何よりも先に成果が求められる世相であるから、先ず次のプログラムをポケコンに書き込んでみて下さい。(素数を求めるプログラムを消す必要はありません)

 100 REM***ソインスウ ブンカイ
 120 CLEAR:CLS:DIM A(1,20)
 130 INPUT”セイスウ”;X:Y=X:E=0:F=0
 140 FOR J=2 TO X
 150 IF FRAC(Y/J)=0 THEN 160 ELSE 190
 160 IF FRAC(Y/J)=0 THEN Y=Y/J:E=E+1:GOTO 160
 170 A(0,F)=J:A(1,F)=E:F=F+1:E=0
 180 IF J=Y THEN 200
 190 NEXT J
 200 CLS:PRINT”セイスウ”;X:FOR J=0 TO F-1:PRINT A(0,J);”^”;A(1,J);:NEXT J
 210 Z$=INKEY$:IF Z$=””THEN 210 ELSE 120

 間違いなく打ち込んでくれたことを前提にして、作動テストをしてみよう。
 RUNモードにして、RUN100と打ち込んでENTERキーを押してください。すると、
 セイスウ? と表示されますので、2を入力してENTERキーを押してください。すると、2^1(2の1乗)と表示されるはずです。次にどれでも任意のキーを押してみてください。すると、セイスウ?と最初の表示に戻りますので、いろいろな「整数」を入力して、結果が正解か確認してみてください。因みに、100の結果は、2^2 5^2と表示されますが、これは、(2の2乗)x(5の2乗)というように解釈していただきたい。

 簡単にプログラムの説明をしますと、
 100行はプログラムの名称です。REMの後に打ち込んだ文字は解説文として計算上は無視されます。
 120行は変数と画面をクリアーします。A(1,20)を配列変数と呼びます。上下二段の下駄箱がそれぞれ二十一マスに区切られているイメージを持ってください。この一マスごとに一個の数字データを入れることができます。ここで、重要なことは0を一とする数え方をすることである。したがって、配列変数A(1,20)の中に2*21=42個のデータを収納できます。DIMとは配列変数を宣言する変数です。
 130行では、変数Xに求める「任意の整数」を入力し、そのXのデータを保存する為に変数Yに保存します。Eは素数の指数部をカウントし初期値は0です。Fは配列変数のデータの位置を指し示すための変数です。初期値は0です。
 140行と190行でFOR~NEXT文を構成します。カウンターは変数Jです。
 150行では、YがJで整数で割り切れるかの判断をします。割り切れる(割り算をした少数部が0)なら160行に飛び、割り切れないなら190行に飛びます。
 160行では、割り切れる回数だけJで割り、一度割るごとにYにY/Jの値を代入し、同時に指数部のカウント変数Eに一づつ加えていきます。
 170行では、A(0,F)とA(1,F)にそれぞれ、JとFの値を代入します。同時に配列のポインター変数Fに一を加え、指数部を表示する変数Eを0に戻します。
 180行はJ=Yとなったら、200行に飛ばせます。
 190行はJに一加えて、140行に戻します。
 200行は結果を表示します。
 210行は結果表示を持続させるためのものです。任意のキーを押すと最初の行120行に戻って、何回でも次の計算が可能になります。

 大きい数字を素因数分解するにはいささか時間がかかってしまいます。「素数を求める」で覚えた方法を取り入れればもっと早く処理できますが、今日は私はいささか疲れた。次回の講義は最大公約数、最小公倍数とします。