2016年10月26日水曜日

世の中、割り切れないことだってあるさ 整数の割り算

世の中、割り切れないことだってあるさ
整数の割り算

みわよしこ(執筆協力:山本栄一、小椋秀一、宇野雄騎)  2008/8/18
マイコン制御プログラムを自由自在に書けるようになろう! 前シリーズ「マイコン制御基礎以前」に続く本シリーズでは、アセンブリ言語の解説を中心に基礎力固めを目指す。(編集部)
 本シリーズでは、マイコンでの計算の基礎として、整数の「加算」「減算」「乗算」を取り上げてきた。残るは“除算”だ。
 実は除算には、加算・減算・乗算とは比較にならない困難さが含まれているのだが、今回もプログラムの実例を通じて、マイコンでの除算の世界に少しずつなじんでいこう。

除算は乗算の逆演算、だが?

 小学2年の算数で「掛け算九九」を習ったら、算数の勉強は次に整数同士の割り算(除算)へと進む。「3×9=27」を知っていれば、「27÷9=3」であることは容易に理解できるはずだ。「28÷9=3 余りは1」を理解するのも困難ではないだろう。28を9で割ると「9.3333333……」となって割り切れない。しかし、小学校の算数に最初に除算が出現するときには、割る数も割られる数も結果(商)も余り(剰余)もすべて、「正の整数で閉じた範囲に置く」という配慮がなされている。このため、小学生は大きな困難を感じずに除算を習得できるのだ。
 除算は乗算の逆演算である。正の整数の集合は、乗算に対して閉じている(正の整数同士の乗算の結果は正の整数になる)。しかし、除算に関して同じことはいえない。正の整数同士で除算を行った場合、結果が整数になるとは限らない。さらに「小数で割る」「分数で割る」といった操作を行うと、考え方も扱い方も困難になってくる。「1.5÷0.5」は、なぜ「1.5×2」と同じ結果になるのだろう? 「3/2÷3/4」の計算を行うときに、どうして「3/2×4/3」として分母と分子を掛け合わせるのだろうか? 筆者は小学生のとき、「除算は乗算の逆演算だからそれでよいのだ」という理解の仕方をして先に進んだのだが、「小数や分数の割り算が分からない」と悩んでいる小学生は、そんな説明で納得してくれるだろうか?
 除算が含んでいるこのような困難は、計算を行うのが小学生であろうがコンピュータであろうが、あまり違いがない。マイコンの開発者は時折、
「お客さんに、『なんで除算器ないの?』っていわれちゃいましたよ~」
とぼやくことがある。除算器の開発は、簡単に行えるようなものではない。特にRISCマイコンの場合、除算器は「ない」と思っておいた方がよいだろう。だけど、「除算器がないから除算しません」とはいっていられない場面も多い。
「世の中、簡単に割り切れるものじゃないんだけどなぁ……」
とぼやきながら、除算器を持たない「ATmega16」に除算をさせてみよう。

除算を行うサンプルプログラム

 今回のサンプルプログラムをリスト1に示す。コンピュータに整数の除算を行わせる方法は数多く存在するが、今回のプログラムでは「足し戻し法」と呼ばれる方法を用いた。
; Copyright 2008 Denno Neko Yashiki
; written by Yoshiko Miwa
;
; 足し戻し法を用い、dividentをdivisorで割る
; PB0を商の回数だけ点滅させた後、PB1を剰余の回数だけ点滅させる

; 出力ポートの初期化
; 時間を遅らせるサブルーチンを使用するためにスタックポインタを
; 初期化しサブルーチンコールを行う

.include "m16def.inc"

.equ LED0_ON   = 0b00000000
.equ LED0_OFF  = 0b00000001
.equ LED1_ON   = 0b00000011
.equ LED1_OFF  = 0b00000001
.equ ALL_PORT_OUTPUT = 0xFF
.equ PUD_SET = 0b00000100      ; 2ビット目のPUDビットをセットする
.equ LOOP_LENGTH1 = 0xFF
.equ LOOP_LENGTH2 = 0xFF

.def Temp      = R16
.def COUNT1    = R17
.def COUNT2    = R18
.def COUNT3    = R19

.def divident  = R20
.def divisor   = R21
.def quotient  = R22
.def reminder  = R23

;---------------------------------------------
; おまじない。ここに、割り込みベクタが入る
;---------------------------------------------
.org 0x0000
     rjmp RESET


;---------------------------------------------
; サブルーチン群
;---------------------------------------------
;-----------------------------
; Delay3:
; 3倍ループ
; Delay1を、3回呼び出す
;-----------------------------
Delay3:
        ldi COUNT3,3
Loop3:
        rcall    Delay1
        dec      COUNT3
        brne     Loop3
        ret


;-----------------------------
; Delay1:
; 1倍ループ
;-----------------------------
Delay1:

        ldi    COUNT2, LOOP_LENGTH2
Loop2:
        ldi    COUNT1, LOOP_LENGTH1
Loop1:
        dec    COUNT1     ; カウンタ値をマイナス1、
                          ; 結果が0になるとSREG:Z=1
        brbc   1, Loop1   ; SREGのビット1(Z)が0だったらLoop1へ

        dec    COUNT2
        brbc   1, Loop2

        ret


;-----------------------------
; ここから、プログラムスタート
;-----------------------------

RESET:
;-----------------------------
; 初期化部
;-----------------------------


; スタックの初期化
; RAMの最終番地をスタックポインタにセットする
; RAMの最終番地は、インクルード(.def)ファイルに
; "RAMEND"として定義されている
; AVRは1回に8Bitしか扱えないので、LowとHighに分けてセットする
        ldi    Temp, low(RAMEND)
        out    SPL, Temp
        ldi    Temp, high(RAMEND)
        out    SPH, Temp

; PORT B の初期化(全ビットを出力にセット)
        ldi    Temp, ALL_PORT_OUTPUT
        out    DDRB, Temp

; PUD(プルアップを禁止)ビットをセットし、プルアップを禁止する
        ldi    Temp, PUD_SET
        out    SFIOR, Temp

; 最初に、LEDはすべてOFFにしておく
        ; LED OFF
        ldi    Temp,0b00000010
        out    PORTB,Temp


;-------------------------------------------------------
; メインルーチン
;-------------------------------------------------------

;-------------------------------------------------------
; 除算を行う
;-------------------------------------------------------
        ldi divident,10
        ldi divisor,3
                ldi quotient,0
                ldi reminder,0

DIVISION:
                inc quotient
        sub divident,divisor
                brmi SETUP
                rjmp DIVISION

SETUP:
        dec quotient
                add divident,divisor
                add reminder,divident

RESULT1:
; 商の回数だけLED0を点滅させる

        ; LED0 ON
        ldi     Temp,LED0_ON
        out     PORTB,Temp

        ; 1単位ディレイ
        rcall   Delay1

        ; LED0 OFF
        ldi     Temp,LED0_OFF
        out     PORTB,Temp

        ; 1単位ディレイ
        rcall   Delay1

        dec     quotient
        brbc    1, RESULT1

; ちょっと休む
        ; 3単位ディレイ
        rcall   Delay3

RESULT2:
; 剰余の回数だけLED1を点滅させる

        ; LED1 ON
        ldi     Temp,LED1_ON
        out     PORTB,Temp

        ; 1単位ディレイ
        rcall   Delay1

        ; LED1 OFF
        ldi     Temp,LED1_OFF
        out     PORTB,Temp

        ; 1単位ディレイ
        rcall   Delay1

        dec     reminder
        brbc    1, RESULT2

; 最後に無限ループを書いておく
ENDLESS:
        rjmp ENDLESS


; END
; 処理系によってバグることがあるので、
; この後には何行か空行を入れておくとよい
リスト1 足し戻し法による除算プログラム

 プログラムの構造は、前回までに紹介した「加算」「減算」「乗算」のプログラムと同様である。レジスタの別名定義のうち、除算そのものに関係しているものは、
.def divident  = R20
.def divisor   = R21
.def quotient  = R22
.def reminder  = R23

である。上から「割られる数(被除数)」「割る数(除数)」「商」「剰余」である。除算には登場人物が多いのだ。http://monoist.atmarkit.co.jp/fembedded/articles/miconkiso2/08/miconkiso2_08a.html 
再生核研究所声明325(2016.10.14) ゼロ除算の状況について ー 研究・教育活動への参加を求めて
アリストテレス以来、あるいは西暦628年インドにおけるゼロの記録と、算術の確立以来、またアインシュタインの人生最大の懸案の問題とされてきた、ゼロで割る問題 ゼロ除算は、本質的に新しい局面を迎え、数学における初歩的な部分の欠落が明瞭になってきた。ここ70年を越えても教科書や学術書における数学の初歩的な部分の期待される変更 かつて無かった事である。ユークリッドの考えた空間と解析幾何学などで述べられる我々の空間は実は違っていた。いわゆる非ユークリッド空間とも違う空間が現れた。不思議な飛び、ワープ現象が起きている世界である。ゼロと無限の不思議な関係を述べている。これが我々の空間であると考えられる。
そこで、最近の成果を基に現状における学術書、教科書の変更すべき大勢を外観して置きたい。特に、大学学部までの初等数学において、日本人の寄与は皆無であると言えるから、ゼロ除算の教育、研究は日本人が数学の基礎に貢献できる稀なる好機にもなるので、数学者、教育者など関係者の協力、参加をお願いしたい。
先ず、数学の基礎である四則演算において ゼロでは割れない との世の定説を改め、自然に拡張された分数、割り算で、いつでも四則演算は例外なく、可能であるとする。数学はより美しく、完全であった。さらに、数学の奥深い世界を示している。ゼロ除算を含む体の構造、山田体が確立している。その考えは、殆ど当たり前の従来の演算の修正であるが、分数における考え方に新規で重要、面白い、概念がある。その際、小学生から割り算や分数の定義を除算の意味で 繰り返し減法(道脇方式)で定義し、ゼロ除算は自明であるとし 計算機が割り算を行うような算法で 計算方法も指導する。― この方法は割り算の簡明な算法として児童・生徒たちにも歓迎されるだろう。
反比例の法則や関数y=1/xの出現の際には、その原点での値はゼロであると 定義する。その広範な応用は 学習過程の進展に従って どんどん触れて行くこととする。応用する。
いわゆるユークリッド幾何学の学習においては、立体射影の概念に早期に触れ、ゼロ除算が拓いた新しい空間像を指導する。無限、無限の彼方の概念、平行線の概念、勾配の概念を変える必要がある。どのように、如何に、カリキュラムに取り組むかは、もちろん、慎重な検討が必要で、数学界、教育界などの関係者による国家的取り組み、協議が必要である。重要項目は、直交座標系で y軸の勾配はゼロであること。真無限における破壊現象接線などの新しい性質解析幾何学との美しい関係と調和すべての直線が原点を代数的に通り、平行な2直線は原点で代数的に交わっていること行列式と破壊現象の美しい関係など。三角関数や初等関数でも考え方を修正、補充する。直線とは、そもそも、従来の直線に原点を加えたもので、平行線の公理は実は成り立たず、我々の世界は、ユークリッド空間でも、いわゆる非ユークリッド幾何学でもない、新しい空間である。原点は、あらゆる直線の中心になっている。
大学レベルになれば、微積分、線形代数、微分方程式、複素解析をゼロ除算の発展の成果で修正、補充して行く。複素解析学におけるローラン展開の学習以前でも形式的なローラン展開(負べき項を含む展開)の中心の値をゼロ除算で定義し ― ゼロ除算算法、広範な応用を展開する。最も顕著な例は、tan 90度 の値がゼロであることで、いろいろ幾何学的な説明は、我々の空間の認識を変えるのに教育的で楽しい題材である。特に微分係数が正や負の無限大に収束(発散)する時微分係数をゼロと修正することによって、微分法の多くの公式や定理の表現が簡素化され、教科書の結構な記述の変更が要求される。媒介変数を含む多くの関数族は、ゼロ除算 算法統一的な視点が与えられる。多くの公式の記述が簡単になり、修正される。新しい、関数の素性が見えてくる。
複素解析学において 無限遠点はゼロで表現されると、コペルニクス的変更(無限とされていたのが実はゼロだった)を行い、極の概念を次のように変更する。極、特異点の定義は そのままであるが、それらの点の近傍で、限りなく無限の値に近づく値を位数まで込めて取るが、特異点自身では、ゼロ除算に言う、有限確定値をとるとする。その有限確定値のいろいろ幾何学的な意味を学ぶ。古典的な鏡像の定説;原点の 原点を中心とする円に関する鏡像は無限遠点であるは、誤りであり、修正し、ゼロであると いろいろな根拠によって説明する。これら、無限遠点の考え方の修正は、ユークリッド以来、我々の空間に対する認識の世界史上における大きな変更であり、数学を越えた世界観の変更を意味している。これはアリストテレスの世界の連続性の概念を変えるもので強力な不連続性を示している。 ― この文脈では天動説が地動説に変わった歴史上の事件が想起される。
ゼロ除算は 物理学を始め、広く自然科学や計算機科学への大きな影響があり、さらに哲学、宗教、文化への大きな影響がある。しかしながら、ゼロ除算の研究成果を教科書、学術書に遅滞なく取り入れていくことは、真智への愛、真理の追究の表現であり、四則演算が自由にできないとなれば、数学者ばかりではなく、人類の名誉にも関わることである。実際、ゼロ除算の歴史は 止むことのない闘争の歴史とともに人類の恥ずべき人類の愚かさの象徴となるだろう。世間ではゼロ除算について不適切な情報が溢れていて 今尚奇怪で抽象的な議論によって混乱していると言える。― 美しい世界が拓けているのに、誰がそれを閉ざそうと、隠したいと、無視したいと考えられるだろうか。我々は間違いを含む、不適切な数学を教えていると言える: ― 再生核研究所声明 41: 世界史、大義、評価、神、最後の審判 ―。
地動説のように真実は、実体は既に明らかである。 ― 研究と研究成果の活用の推進を 大きな夢を懐きながら 要請したい。 研究課題は基礎的で関与する分野は広い、いろいろな方の研究・教育活動への参加を求めたい。素人でも数学の研究に参加できる新しい初歩的な数学を沢山含んでいる。ゼロ除算は発展中の世界史上の事件、問題であると言える。
以 上
追記:
*156  Qian,T./Rodino,L.(eds.): Mathematical Analysis, Probability and
 Applications -Plenary Lectures: Isaac 2015, Macau, China.
 (Springer Proceedings in Mathematics and Statistics, Vol. 177)  Sep. 2016 305 pp.            (Springer)
Paper:Division by Zero z/0 = 0 in Euclidean Spaces
Dear Prof. Hiroshi Michiwaki, Hiroshi Okumura and Saburou Saitoh
With reference to above, The Editor-in-Chief IJMC (Prof. Haydar Akca) accepted the your paper after getting positive and supporting respond from the reviewer.
Now, we inform you that your paper is accepted for next issue of International Journal of Mathematics and Computation 9 Vol. 28; Issue  1, 2017),
数学基礎学力研究会のホームページ
URL
再生核研究所声明327(2016.10.18)  数学教育についての提案
次で、数学教育の重要性、効用性について触れている:

再生核研究所声明313(2016.08.01) 良い数学教育の推進を
― 数学を通して、人類が交流でき、世には道理、秩序が 存在すると理解できるだろう。分かり易いスポーツを通して、ドラマを見て、芸術を通して理解するは 世に多いが、数学の効用をここでは強調したい。道理、秩序に対する認識には 数学の効用は大きく、上記 公正の原則の理解にも 大きく寄与するのではないだろうか。数学教育の充実を国際的な視点で提案したい。その留意点を纏めて置きたい:
1) 世には共通の論理があることを理解し、論理的な思考を学習する。
2) 数学の論理的な面には、美しさとuniverseの、世の秩序を述べていることを学ぶ。
3) 非ユークリッド幾何学の出現過程を良く学び、真理を追求する精神感情と論理の関係を学ぶ。批判精神、理性、客観性について学ぶ。予断と偏見、思い込み、囚われやすい人間の精神を掘り下げる。
ここで、数学教育の充実とは、いわゆる数学の学力、問題解決に重点をおいた従来の学習ではなく、上記のような数学教育を通して身に付く数学の精神に重点をおいた教育である。他方数学の学力を付けることに偏りすぎたり、学力を競争させたりして 世に多くの数学嫌いな人たちを育てていることを大いに反省したい。数学の美しさ、楽しさを教えることが第一であると心がけなければならない。
数学愛好者の増大は かつて和算が広く民衆に普及していたように、環境にも優しく、人間の修行にも、精神衛生上も、また創造性を養い、考える力を育成するにも大いに貢献するのではないだろうか。囲碁や将棋、歌会、俳句会など良い趣味集団を構成しているが、数学愛好者クラブなど大いに進められるべきではないだろうか。新聞やテレビ、マスコミ、週刊誌などでもどんどん話題を取り上げ、また奨励されるべきではないだろうか。社会の浄化と低俗化防止にも貢献するのではないだろうか。―

と述べた。古くはプラトン学派の門に、幾何学知らざる者この門をくぐるべからず、ナポレオンが軍隊を強くするには数学の教育が大事であると述べていることや、現中国政府の数学重視の姿勢も注目される。
ここでは、明確な提案が閃いたので纏めて置きたい。まず現状の分析と問題であるが、数学は選別、能力を評価する重要な科目になっていて、受験勉強の強い枠に縛られてカリキュラムは相当に厳格に範囲が定められている。そのため限られた範囲での特訓の要素が強く、現実には理想的な教育の有り様からの乖離が甚だしい状態と言える。標語的には、ゆっくり面白いところを追求しようとすれば、そんなことでは、時間内に解答できない、そのようなものは型として、このように対応すれば良いと、薄っぺらな教育内容になり、多くの場合才能ある学生の みずみずしい知的好奇心 を失なわせ、薄っぺらな学習で数学そのものを嫌う学生を多く育てている現実があると考えられる。これは創造性や好奇心を育てる教育と いわゆる学力をつけるための勉強の乖離の問題である。さらに顕著な事実として、高校までの数学と大学での数学の大きな乖離は 相当に広く認められる現象ではないだろうか。多くの高校生は、大学に入って、数学とはそんなに広く、深く、雄大なものであるかと知って驚くのではないだろうか? また、教育現場の感じも相当に違う感じを受けるだろう。
― このような乖離は、研究成果と学部教育の内容についても言えることに注意しておきたい ―。
背に腹は変えられない、受験勉強は無視できない現実であるから、この問題を改善する具体的な提案として、例えば、週1時間とか、月1時間、カリキュラムにとらわれない数学の時間を用意して、カリキュラムに関係する素材や、新しい話題、面白い歴史的な話題から題材をとり、本来数学の教育に求められるような方向での教育を行うようにする。このような時間は、先生の新鮮な研究、研修にも繋がる面があって 先生の柔軟な精神の涵養にも良いのではないだろうか。さらに視野を広げるためにも、いろいろな講演会の企画なども良いのではないだろうか? 提案したい。数理科学の文化の裾野を広げる努力をしたい。近年は教育・研究環境の厳しさと専門の深さ、困難さで、専門的に深くなりすぎて、数理科学など幅の広さや基礎への関わりが薄くなっているように感じられる。その様な事情を反映させて、教育が疎かになる傾向にもなっているのではないかと危惧される。成果が数字に表されるような貧しい教育である。

数学の教育については、下記も参照:

再生核研究所声明315(2016.08.08) 世界観を大きく変えた、ユークリッドと幾何学
再生核研究所声明283 (2016.2.8)  受験勉強が過熱化した場合の危惧について
再生核研究所声明260 (2015.12.07) 受験勉強、嫌な予感がした ― 受験勉強が過熱化した場合の弊害
再生核研究所声明 187 (2014.12.8)工科系における数学教育について                 
以 上

0 件のコメント:

コメントを投稿