mixiユーザー(id:4556571)

2020年05月16日00:22

70 view

[X68]やっと見たかったものが見れた![X−BASIC]

フォト

「やあ行き倒れだよ。昨日からテンションがおかしくなっているがやっと見たかったものが見ることが出来て最高に愉悦な気分なんだ。理由はこれから話す」


まずは前書き
実にしょーもない前書き
みんなは約数のこととか、公倍数とか最小公倍数は知ってるよね
足し算は?掛け算は?割り算は?
当然知ってるよね
小学校、中学校の義務教育の中で学ぶ「常識」だよねー
私は算数とか、数学とか本当に嫌いでした
通信簿はつねに2だったwwwwwwwwwwwwwww


そんな私が今から10年以上前にX68000のX−BASICに再びはまり、中学校の時は宿題を解かせるために実機のX68で書いた約数のプログラムを、リハビリがてら思い出しながらそのプログラムをウィンドウズのエミュレータ上で再び書いた
そこから数の不思議にはまった
そこから物を見る視点が確実に変わったかもしれん
分数の計算なんていちばん大嫌いなんだが、ふとこんなことを考えた


フォト

これを見てどう思う?


フォト

「しちめんどくさい」


フォト

「正解!!でもこうも思ったのよ。もしこれを通分したら出した分母の数って実は1から10まで割り切れる数になるってことだよな、と」


フォト

「確かに。通分ってそれぞれの分母の中で増分していって、公倍数を見つけることでしたよね。しちめんどくさいけど」


もっとも簡単に公倍数を出すならそれぞれの分母の数を掛け算でかけていってしまうことです。物凄く大きい数になりますが、これでも公倍数だけなら出せます
この場合は1から10まで掛け算します
すると3628800と言う数が出ます


フォト

3628800と言う数の約数を計算させてみます
1から10まできれいに揃って出ていますね
3628800と言う数は1から10までならきれいに割り切れる数と言えます
ただ、3628800と言う数は通分の作業するにはちょっと扱いづらいです
最小公倍数を出しましょう


フォト

1から10までの最小公倍数を計算させると2520と言う数が出ました
このプログラムはタイムスタンプによると2015年ごろに作っていたようです


フォト

2520の約数を計算させました
1から10まできれいに揃って出ています


そうです
私がはまった数の世界とは
「1〜nまでの数で割り切れる最小公倍数の世界」なのです
1〜10の最小公倍数は1から10まで割り切れる
だったら1〜100までの最小公倍数は1から100まで割り切れるはず
それが常識と言うものだが、実際にそれを確認した奴ってそうはいないのではないか


もっと先を見たい、そこから長い日々が始まりました
実はコンピュータはそれほど大きい数を標準では扱えません
高速に計算出来るかわりに計算出来る範囲はかなり限られているのです


家庭用などの一般的なコンピュータは大きな数を扱う時は内部的にはIEEE64ビット浮動小数点演算規格と言うもので計算しています
これは今から50年以上は前に作られた規格で、いろんな問題を抱えたまま今日に至ります
この64ビット浮動小数点規格で、小数を使わず整数のみで扱った場合、仮数部と呼ばれる53ビットまでとなり、2の53乗で9007199254740992までが扱える数値となります
もちろんこれ以上大きな数を扱っても見た目は正常に動いているように振舞います
振舞っているだけで、内部の数値は似ても似つかないものに変貌しています
近似値を扱っている状態となり、計算結果の正確さは保障されなくなります


これを知っていたので、より大きな数を計算出来る方法をプログラムで開発するなんて大回りをすることになってしまいました
本当に大変でした
どうすればいいのかわからないので
「わかる方法で、自分の能力の出来る範囲でやろう」と決め、「文字列処理の応用で人間の筆算のメカニズムをモデル化してプログラムする」方法を取りました
数値で扱おうとすれば範囲チェックでオーバーフローにされる
ならば「数字」で扱えばいい
でも文字では計算出来ない
だから文字列処理で人間の筆算に近いことをさせる
やってみてわかったのは小学校ってかなり高度なことを学ばせてたんだなと言うことでした
符号なし、小数点同士の計算なしとかなり限定しても、かなり頭痛くなる代物でしたが、徐々に足し算、掛け算と出来上がっていきました
果たして自分の作ったこのプログラムは正しく動いているのか?
電卓で計算出来る範囲でかなり意地悪な計算のさせ方をして見た目は正しく動いていることを日々確認しつつ、1〜100の最小公倍数を求めることが出来る強靭なプログラムを作っていく
最初にそのプログラムで1〜100の最小公倍数を求めたときの不安感は今も覚えています
でも「それぞれのサブルーチンの動作はしつこいくらいに確認を重ねたからきっと大丈夫」と言う思いもあった
実際に計算させると実にそれらしいとてつもない答えが返ってきた
処理時間は1分もかからなかった


初期の1〜nまでの最小公倍数を求めるプログラムでは22までの数しか扱えず、その最高の22までの最小公倍数を計算させると1時間以上は答えが返ってこなかった
23以上を計算させれば果てしない計算時間の後にオーバーフローになって止まってしまうほど非力なプログラムでした


フォト

↑このプログラムは初期よりはやや速く処理出来るになったもの
コンパクトなので他のプログラム言語にも移植しやすいよ


フォト

フォト

と、いうわけで一般のBASIC言語でも動かせる形に私の手で移植
ポケコンで動いたことを確認
初音ミクプロジェクトディーバMEGA39’SのTシャツに描いてミクさんに着せたよwwwww


話を戻す
昔の自分に勝ったと思った瞬間だったし、出てきた1から100までの数の最小公倍数はグーグルで合っていることを確認し、ガッツポーズをとってしまった記憶がある


フォト

1から100までの最小公倍数は、最小公倍数でもとんでもない数になる
こんなバカでかい数になると極めて取り扱いが厄介になってしまう


最後のステージ、割り算
こいつが最大の問題
まだ巨大な数字同士の引き算も比較演算も作れていない
割り算もさせるなら足し算、引き算、掛け算、比較演算、しかも符号が扱えるようにしないとどうにもならない
しかしその引き算が厄介
10をとなりの位から借りてくる処理をどう書いてくれようか
符号を扱うようにするなら今まで書いた処理も大幅に変更することになるかも
どうしてくれよう
こんなことを日々考えていたが、最近になって気付く

デカい数字同士で割り算させなくても良いんじゃねーか?
よう考えたらバカでかい数字÷普通の範囲の数値でも良くね?
それなら比較的簡単に出来る気がする


仕様は決まった
・整数同士で計算させる
・極大数字÷普通の数字で計算する作りにする
・答えに関しては小数点以下も出せるようにする
・割り切れない時、小数点以下何桁まで計算し続けるか指定出来るようにしておく


おかげさまで割り算の筆算のメカニズムの分析でところどころやり方がうろ覚えであることが発覚し、グーグルに「割り算の筆算のやり方」と打ち込み、出てきたサイトで復習しましたとさwwwwwwwwwwwwww


2020/05/14 午前4時ごろ
ついに見たかった最高の光景が見れた
「1から100までの最小公倍数は、1から100まで続けて割り切ることが出来る」という当たり前の常識が本当だったことをこの目でしっかりと確かめた
まるで割り切れない数などないのではないかと錯覚しそうになった時、101で「端数が出ました」と出て計算がぱたりと終わった
そう、それが見たかったんだんだよ・・
感無量だった
その後、プログラムは誰に見せても大丈夫なようにコメントやタイトルなども入れ、念のための初期化処理も加えて綺麗に仕上げた


フォト

書き直したプログラムで1から100までの最小公倍数を1から割り算させてみた
どこまでも上昇するような錯覚を覚えるほど、ずっと割り切りながら進んでいき、101で割ったところで、計算は停止した
常識と言うと凡庸でつまらないものと思われがちだが、決してそうではない
時に美しく、時に絶望感まで味合わせてくれる、絶対的な世界のルールであり、万物への枷と、事象の壁なのだ
そして人の手では絶対に作り出せない自然界に仕組まれた美しいパズル
大昔の人達がそこに神の意志を感じるのも無理はない


一昔前の私はこうした計算はスパコンの世界だろうと思っていた
でも違った
こんなとんでもない計算が、BASIC言語でも出来るのだ
私に合っていたプログラム言語はX68000用のBASIC言語、X−BASICだったと言うだけの話
私の時代はプログラムを作ることを趣味にしてるなんて根暗扱いされていじめられる原因になったりもしたんだぞ
でもいじめられたからって、こんな楽しいことやめるわけなかろう?
これからはプログラム学習が必須の時代になる
成績をつけられ、その成績のせいで嫌になることもあるかもしれん


でも大手を振ってプログラムを楽しめる時代になった
今の時代の子どもたちは私なんかよりはるかに頭が良いだろうから、凄いのをガンガン作り出すだろうね
算数が苦手でも、プログラム出来るようになればカバー出来るし、こうした数の不思議な世界に触れる機会も出てくるはずだ
このくらいエキサイティングな内容な教科書があったら、私も勉強が好きになっていたかもしれない


フォト

1から100までの数の最小公倍数の約数を求めてみた
69720375229712477164533808935312303556800と打ち込み約数を計算させる
200までと限った範囲とし、計算させると1から100までずらりと綺麗に並ぶのを確認出来た!
1から100まで割り切れると言うことは、約数を求めると1から100まで綺麗に出てくると言うのも1から100までの数の最小公倍数の常識で考えれば当たり前と言うことにはなるが、実際にそうなることを確認するとあまりに非日常的で、壮観である
常識の隙間にこそ、とんでもない世界は隠れているのです!
しかも小学生、中学生並みの知識があれば今回のことは全部出来るのです!


端数が出るまで計算するプログラムを公開します
GOTO命令、GOSUB命令を使っていないので行番号には依存していません
X68持ってる、エミュレータ環境がある人はAUTO命令で行番号を発生させながら通しで打ち込むでも、テキストエディター上で書いてX−BASIC上でLOAD@命令でファイルを読み込むでも大丈夫です


フォト

フォト

フォト



フォト

「ここまで読んでくれたすべての人達に、本当にありがとう。」





おまけ
フォト


0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する