Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Hitotsubashi University Repository
Title FORTRAN 77による多数桁整数の演算
Author(s) 山田, 裕理
Citation 一橋大学研究年報. 自然科学研究, 24: 159-226
Issue Date 1985-06-10
Type Departmental Bulletin Paper
Text Version publisher
URL http://doi.org/10.15057/9435
Right
FORTRAN77による多数桁整数の演算
山 田裕理
1.序
計算機による計算といえば,数値計算を意味するのが普通であるが,一
方で数式をそのままの形で計算機で処理する,いわゆる数式処理も,近年 (1)ようやく普及し始めてきた.いまだに利用者はそれほど多くないが,汎用
(2)の数式処理システムがいくつか稼動しており,それちは一般に次のような
ことができる.整数係数の多変数多項式の展開,共通項のくくり出しなど
の整理,最大公約数の計算,Z上の因数分解等の処理,有理関数の展開・
整理,変数に数値や数式を代入すること,初等関数の微分,極限の計算,
丁鰐Joγ展開,初等関数の不定積分,定積分,数式を成分とする行列,行
列式の計算,特殊関数の扱い,微分方程式の解を求めること.今のところ
基本的なものとはいえ,このように数学で通常出会う形の計算を対象とす
る数式処理は応用の可能性がきわめて大きい.数値計算において必要な計
算は単純で計算機の中央処理装置(CPU)の機能と整合性があり,プ・
グラムもFORTRANで簡潔に書ける揚合が多い.もともと電子計算機
が数値計算を行うために作られたものであるから,このことは当然であろ
う。ところが数式処理では事情が大きく異なる.数値計算で扱うデータの
型は整数型,実数型,複素数型ぐらいであるが,上の例からわかるように,
159
一橋大学研究年報 自然科学研究 24
数式処理では多様な形のデータを扱わなけれぱならない.また,計算の途
中や最終結果を前もって予測できないことが多い・このため,汎用の数式
処理システムの記述には,FORTRANのような静的な言語ではなく,
LISP系の言語が使われている.さらに,問題を解くアルゴリズムにして
も,一般的なものが存在しない場合も多いし,存在するとしても効率の良
い現実的なものを見つけるのは容易ではない.アルゴリズムの面およびハ
ードウェアの面から現在活発に研究されており,今後の発展が大いに期待
される.
数式処理システムのもっとも基本的な機能のひとつとして,多数桁(多
倍長)整数演算,高精度浮動小数点演算がある.実際,多くの数式処理シ
ステムはこの機能を備えている.たとえば,多項式や有理式の計算の途中
で係数が非常に大きい桁の数になる可能性がある。このような可能性はそ
れほど大きいわけではないが,数式処理では数値計算のように近似値を求
めるのではないから,いくら大きい桁の数でもそれ’を正確に扱えなければ
ならないのである.計算機のCPUで行われる四則演算には固定小数点演
算と浮動小数点演算があり,扱うデータの長さはどちらも一定である・
FORTRANでもこれを反映して,演算で扱うデータの型が定まっている.
整数演算は整数型データに対する四則演算であり,CPUにおいて固定小
数点演算として実行される,整数型データは1数値記憶単位を占め,これ
は汎用レジスタの容量1語(word)に等しい.実数演算は実数型データお
よび倍精度実数型データの四則演算で,CPUにおいて浮動小数点演算と
して実行される.実数型データは1数値記憶単位,倍精度実数型データは
2数値記憶単位を占める.なお浮動小数点レジスタの容量は2語である・
このように,扱える数値の精度は型により決まっている・したがって・非
常に大きい桁の数の四則演算を正確に行うためには特別な方法が必要であ
る.
160
FORTRAN77による多数桁整数の演算
本稿では,FORTRAN77により作成した多数桁整数の四則演算を行
うプ・グラムを紹介する.演算の部分はすぺてサブルーチンにしてあり,
引数の値によりどのような桁の整数でも計算機の記憶容量の許すかぎり計
(3)算できる.プログラムはJIS規格のFORTRAN77に従っており,整数
型データの有効数字が9桁以上,倍精度実数型データの有効数字が16.3桁
程度以上の計算機を想定して書かれている.プ・グラムを書くにあたって
は見やすさを心がけた.具体的には,変数名,配列名は暗黙の型宜言を使
わずにすぺて型宣言文により型を指定する,配列の寸法の下限は必ず指定
する,DO文のパラメータの増分は省略せずに書く,1個のDO文には必
ず1個のCONTINUE文を対応させる,副プ・グラムを引用するときの
データの受渡しは引数により行い,共通ブ・ックは使わない,などである.
計算機は一橋大学情報処理センターのFACOM M18011ADを使用
した.オペレーティングシステムはFACOMOSlv/F4である.データ (4)の内部表現は次の通りである.整数型データは32ビットの2進数で表現
され,先頭のビットが符号を示し,残り31ビットが絶対値を表わす.実
数型データは32ビットの浮動小数点数で表わされ,先頭のビットが符号,
次の7ビットが指数部を示す.残り24ビットは4ピットずつで表現され
る16進数6桁からなる仮数部である.倍精度実数型データは64ピットの
浮動小数点数で表わされ,符号と仮数部は実数型データと同じで,残り
56ビットで4ビットずつ16進数14桁の仮数部を表わす.
第2節では整数型の配列を用いて多数桁整数を表示し,それらの四則演
算について考える,第3節では倍精度実数型の配列により多数桁整数を扱
う.第4節では多数桁数の例として円周率πの高精度の近似計算について
述ぺる.計算時間の都合で一応小数点以下5万桁まで求めた.各節の末尾
にプログラムを付してある.
いろいろと御協力をいただいた一橋大学情報処理センターの方々をはじ
161
一橋大学研究年報 自然科学研究 24
め永島孝氏,多田洋子氏,嘉藤裕子氏に感謝する.
2.多数桁整数の四則演算
計算機により多数桁整数の和,差,積,商,およぴ剰余を計算するため
には,多数桁整数を計算機に記憶させる方法および演算を実現する方法を
考えなけれぱならない.符号は別に扱うことにしてデ非負のものについで
考える.非負の多数桁整数を計算機内部で次のように表現する・自然数π
をひとつ固定し英字各Nで表わすことにする。添字が1からπまでの大
きさπの次元数1の配列X(1:N)を用意する.配列の型は整数型,・実数型・
倍精度実数型のうちのいずれかとする・非負の多数桁整数を∫桁ずつ位の
下の方から区切り,それぞれひとつずつXの配列要素に添字の値の大1き
い順に記憶させる.これにより,配列Xは10進数∫×π桁以内の非負整
数を表わすことができる.これは整数の10ノ進記数法にほかならない.,実
際Oから9までの数字妬ガ=1,2,…,ε,・により10進法で ・
0102…oε (ただし01≒0)
と表わされるむ桁の非負整数αが与えられたとする.むを∫で割ったとき
の商を乃,余りをδとする.すなわちむ=サ+♂;0≦乃,0≦呂く弄整数型の
変数K,Lにそれぞれ,乃,」の値を入れておく・緋0の揚合は配列要素
X(N-K)に10進法でoエ02…oむである整数値を代入し・以下配列要素
X(N-K十1),ただし整数型変数1の値はゼ=1,2,…,為,に10進法で
0(‘一1)∫+己+10(ε一1》∫+‘+2…0乞∫+‘
である∫桁の整数値を代入する。さらに1の値が1からπ一乃一1までの
とき配列要素X(1)に0を代入する.1の値が乞のときX(1)の値を¢f
と書くと,0≦の∫≦10∫一1であって配列Xは10∫進法で焉+1桁の数
¢π一μπ一刷…翫7 劣η一髭キ0
162
FORTRAN77による多数桁整数の演算
を表わすことになる,また♂=Oの揚合はX(N-K)に0を代入し,それ
以外は6≒0のときと同じにすれぱ,配列Xは10∫進法でん桁の数
のη一刷¢励+2・吻η,婦刷≒0
を表わすことに,なる.
1 N
X 0 。 ・ ・ 0 諾ρ ∬ρ+ユ … 蜘
ヵ=理一た または’ρ=η一々+1
これは非負整数α。の10∫進法による表記である,たとえば
αレ=11234500678099
のとき,倫=20,∫=4であれ’ば賜の値は,端謂0;1≦¢≦16,ω17=11,記18=
2345,¢1g=67,¢20=8099である.配列の大きさをπに固定し,π個の配列
要素に対し右寄せに,すなわち添字の値の大きい方に詰めて数値がおかれ
ていることに注意する.添字の扱いが多少繁雑であるが,このように10ノ
進法として自然に表わしておくことが重要である・ゐをもうひとつの非負
整数とし,Xと同じ型で同じ大きさの次元数1の配列Y(1:N)に上記の
方法でゐの値を記憶させる.このとき配列X,Yの値はα,δそれぞれの
10∫進法による表記を表わすものであるから,αとδの和,差,積,商,
およぴ剰余は10進法で表わされた整数に対して通常行う演算と同様の考
え方で計算できることになる.
基本的にはおおよそ次のようにして計算する.今までの記号を踏襲し,
さらに添字1の値が乞のとき配列要素Y(1)の値を跳で表わす二とにす
る.α十δを計算するために桁上がりを表わす整数んを用意する.んは0
または1である.ん=0と初期化しておき,添字1の値づをπから1まで
163
一橋大学研究年報 自然科学研究 24
一1きざみで変化させて,次の操作を繰返す。X(1)の値の‘とY(1)の
値駒とhの和の汁写汁んを求め,ω汁肱十ん≧10∫であれば第づ桁の値を
¢‘十跳十為一10ノとしてん=1とおく.これはひとつ上,すなわち第乞一1桁
に1だけ桁上がりすることを意味する.またもし¢汁雪汁んく10ノであれ
ば第冨桁の値を¢、十写汁んとしてん=oとおく.このときは桁上がりはな
い.これでα+δの10∫進表現での第ゼ桁の値が得られた二とになる.
O≦z‘十跳十ん≦2×10∫一1であるから,2×10∫一1以下の非負整数値を一
時的にある変数に正確に記憶しなけれぱならない。減算はα≧δの揚合だ
けを扱う.今度は整数hは桁下がりを表わす.始めの段階,すなわち乞=π
のとき,初期値ん=0としておく.碗一跳一んを求め,のr写rんく0であ
れば第ぎ桁の値を¢,一写rん+10∫としん=1とおく.もし即r写rん≧0
であれば第づ桁の値をの‘一擁一んとしん=0とおく.こうしてα一6の10ノ
進表現での第¢桁がわかる.この操作を乞をπから1まで一1きざみで変
化させて繰返せばα十δが計算できる.一10ノ≦の‘一写rん≦10!一1であるこ
とに注意する,乗算はαとδの積が10進法で∫Xπ桁以内の揚合だけを
扱う.k10∫すなわちδが10∫進法で1桁のときは積は容易に計算でき
る.♂=πのときまずん=0としておく.のゆ+んを求め,これを10∫で割
ったときの商をあらためてんとおき,余りを第歪桁の値とすれば積面を
10∫進法で表示したときの第乞桁が求められ’たことになる.この操作を,ぢ
をπから1まで一1きざみで動かして行えばのが得られる.ここで
0≦勘,δ≦10∫一1だから,0≦ん≦10∫一2,0≦の、ゐ十ん≦10∫(10∫一1)一1が常
に成立することに注意する.わが10∫進法で
駒穿η+1…阪, 写”≒0
と表わされる整数の場合,すなわち1の値が1から”一1までのときは
Y(1)の値は0,1の値が”十ゴ,ブ=0,1,…,π一暫,のときY(1)の値は霧。÷,
であるという場合は次のようにする。αと筋の積を砺とおく・αと翫一1
164
FORTRAN77による多数桁整数の演算
の積を10∫進表現で1桁左に桁移動して最後に1桁0をつけ加えて得られ
る整数をεπ一1とおく.すなわち,‘π.1はαと10∫進法で〃π一10と表わさ
れる整数の積である.一般にブ=0,1,…,π一”に対し10∫進法で霧.+,0…0
と表わされるπ一”一ブ十1桁の整数とαの積をら+,とおく.このとき
ち十‘刷十…十むηがαとδの積である.このようにαと10ノ進法で1桁の
数写。+ノの積を求めそれを桁移動すること,およびオ.,む.+、,…,むηの和を
求めることの2段階に分けられる.桁移動は配列要素の添字を変換するこ
とにより容易に実現できる.あとで述ぺるように,実際のプログラムでは
実行速度を速くするために積の計算と和の計算をまとめて同時に行う.そ
の過程で102∫一1以下の非負整数を一時的にある変数に正確に記憶させ
る必要が生じる.最後は除算であるが,これは乗算と減算を組み合わせる
ことによりできる.α,ゐの10∫進表現をそれぞれ
賜晦+1…蛎賜≒O 写昭o+1…鋭η,Ψu≒0
とする.α〈δならばαをδで割ったときの商は0,余りはαでありα=6
ならば商は1余りは0だからα>δとしてよい.このとき%≦”である.
ゐを10∫進法で8桁だけ左へ桁移動して得られる整数をかりにδ<,>と表わ
すことにしよう.6く,〉=ゐ×10e∫は10∫進法で
駒駒+1…写π0…0
と表示されるπ一η十1十θ桁の数である.呪=”一%,α(o)=αとおくとα(o)
とδ〈㎜〉は10ノ進法で同じ桁の数になる.不等式α〔o)≧δ〈肌〉×oが成立する
ような整数oのうち最大のものを2..恥とおき,αω=α(o)一西く勉〉×2η一励と
おく。~.一肌はα⑥を6く皿〉で割ったときの商,α(1)は余りである.0≦2π一η
<10∫に注意する,一般にα(のをδく肌一乞>で割ったときの商を2π吻+‘,余
りをα(‘+1)とおく,この操作を,¢を0から㎜まで1ずつ順次変化させ
て繰返すと,常にO≦2η.π+〆10∫であって,2π¶2π咽+1…~ηはαをδで
割ったときの商の10∫進表現を与える.またα(皿+エ》は余りである.この
165
一橋大学研究年報 自然科学研究 24
計算の過程で問題になるのはα(‘)≧bくη吻×oをみたす最大の整数oを捜
すことである。これについてはプログラムの説明のところで詳しく論ずる
が,実は2×102∫程度までの整数値をある変数に正確に記憶させる必要が
ある.なお実際のプ・グラムでは効率を上げるため乗算と減算を同時に行
うようにする.
配列X,Yの型と定数∫について考えよう.序で述ぺたようにFACOM
OS IVのFORTRAN77では整数型,実数型,倍精度実数型の変数の
有効数字は10進法でそれぞれおよそ9。2桁,7.2桁,16.8桁である。し
たがって自由に使える整数はそれぞれ9桁,7桁,16桁ということになる・
加減算ばかりでなく乗除算も実行するためには上述の方法では2×102∫程
度までの大きさの非負整数を扱わなければならない,したがって配列の型
が整数型のときは4,実数型のときは3,倍精度実数型のときは8がそれ
ぞれ∫としてとることができる最大の値である・もちろん∫=1とすれば
10進法になるので考え方は楽になるが,効率の面で問題がある。たとえば
80桁以内の整数の四則演算を行うためには,∫=1ならば配列の大きさを
π=80としなければならないが∫=4のときはπ=20でよい。繰返しの回
数は,加減算ではπに比例し,また乗除算では二重の手続きが必要なた
1め♂に比例する.よって後者では前者にくらべて計算の手間は一から 41一になる,また後者の方が記憶領域も少なくてすむ・この例からもわかる16
とおり∫はできるだけ大きく選ぶのが良い.ところで一般にハードウェア
の面から変数の型により中央処理装置における1回の演算に要する時間が
異なる.計算機の内部では整数型の変数は数値を固定小数点方式で扱い,
実数型および倍精度実数型の変数は数値を指数部と仮数部に分けて表現す る浮動小数点方式で扱う.浮動小数点方式で表わされた数値の四則演算は
浮動小数点レジスタを介して行われるが,まず2個のオペランドの指数が
調べられ,次に仮数の間の演算を実行し,その結果を正規化するというよ
166
FORTRAN77による多数桁整数の演算
うにいくつかの段階から成り立っている.このため浮動小数点演算は固定
小数点演算より時間がかかる,また実数型あるいは倍精度実数型で割り算
を行うと,整数の除算の形にするために小数点以下の切り捨てというよけ
いな手間がかかる・以上の事情から,配列X,Yの型は整数型で∫=4とす
るかまたは倍精度実数型で∫=8とするかのどちらかが適当であることが
わかる,整数データは1数値記憶単位(numeric storage unit)を占め,
倍精度実数データは2数値記憶単位を占めるので,どちらにしても必要と
する記憶領域は変わらない.したがってこのふたつのうちどちらがより良
いかの選択は,使用する処理系の固定小数点演算と浮動小数点演算の演算
速度の比に依存することになる.
ここでは,X,Yを整数型の配列とし∫=4としてプ・グラムを作成した.
この揚合がやはり基本であろう.なお第3節で倍精度実数型の配列を使い
∫=8とした揚合の非負の多数桁整数の減算,乗算,除算のプ・グラムを
紹介する.
プ・グラム全文のリストは本節の末尾に記載してある.全体は11個の
プログラム単位から構成されている.補助的な副プログラムが3個,加算,
減算,乗算,除算の副プ・グラムがひとつずつ,除算の補助をする副プロ
グラムがひとつの合計8個で四則演算を行う.他の3個は演算すぺき多数
桁整数のデータを入力する際に使用するもの,演算の結果を印刷するため
のもの,および主プ・グラムである。多数桁整数の符号はすべて主プ・グ
ラムで処理し,四則演算の副プ・グラムはすぺて非負の多数桁整数だけを
対象にする。入カデータは符号つきの多数桁整数を,必要ならば先頭に符
号+,一または空白をひとつ置きその後に続けてOから9までの数字を適
当な数だけ並ぺた形で表現し,文字列として扱われる.先頭の空白は符号
の+と同じ意味に解釈する.また先頭から数字が始まる場合,符号は正と
解釈する.主プ・グラムは10個の副プ・グラムの使い方を示す例にすぎ
167
一橋大学研究年報 自然科学研究 24
ないが,ここでは文字列として符号つきあるいは符号なしの多数桁整数の
入力データA,Bを読み,AとBの和,差,積,商,余りを計算し,結果
を出力するというプ・グラムにした.
前に述べたように,計算機の内部では非負多数桁整数を添字が1からπ
までの値をとる大きさπの次元数1の整数型の配列を用いて表わす.各
配列要素の値は0以上で104-1以下の整数で,これが104進法で多数桁整
数を表現したときの1桁に対応する.定数104=10000はプログラムにそ
のまま書き込んである・ここでは∫=4としているが,∫の定め方は処理
系に依存するのであるから,本来ならぱ副プログラムの中では∫あるいは
10∫を変数として扱い,副プ・グラムを引用する際に引数または共通ブ・
ックにより値の受渡しを行うことにすれば柔軟性が増すので望ましい.し
かし演算に関係する8個の副プ・グラムでは10ノを変数として扱うのは容
易であるが,入出力のための2個の副プ・グラムでは変数として扱うこと
にすると少しめんどうになる.また変数名より10000と書いてある方がプ
ログラムが見やすいであろう。一方,配列の大きさπは整数型変数Nで
表わす・副プログラムに現われる配列はすぺて仮引数として寸法の上限を
Nとする整合配列にしてある.このため働に対してはプ・グラムは十分
な柔軟性を持つ.Nの値πは主プログラムにおいてPARAMETER文
により与えられる.すなわち,主プログラムではNは定数πにつけられた
名前である。ここでは一応π=20としてあるので,扱える整数は4×20=
80桁以内である.Nの値をたとえば25にして100桁以内の整数を扱える
ようにするには,主プ・グラムのPARAMETER文でN=20をN=25
に変えるほかはサブルーチンPRNTの中のCHARACTER文で文字変
数CRの長さ指定を80から100に変更するだけでよい。もちろん文字変
数CRをPRNTの仮引数に加えれば,CRの長さ指定をサブルーチン
の中でしなくてもすむようにできるが,かえって手間のかかることになる
168
FORTRAN77による多数桁整数の演算
ように思われ’る,
プログラムの作成にあたっては計算の効率およびエラーの処理について
も考慮した.各副プ・グラムの前に,その副プ・グラムの機能の概略と引
数の意味を説明する注釈行を付した.以下本節の末尾に載せた順序に従っ
てプ・グラムを解説する.
INTEGER FUNCTION ISTR(X,N)
配列xの添字Jの値を1から始めて1ずつ増加させ配列要素x(J)の
値がoでない最初のJの値を捜し,それをISTRの値として返す。もし
すぺての配列要素の値が0ならISTRの値は0とする,配列Xによる多
数桁整数の10∫進表現における先頭の位置を示す。サブルーチンMULT,
DIVID,PRNTで引用される関数副プ・グラムである.
INTEGER FUNCTION INDC(X,Y,N)
配列X,Yで表わされる非負多数桁整数の大小関係を比較する。Xで表
わされる整数の方がYで表わされる整数より小さいか,大きいか,ある
いは両者が等しいかにしたがって,INDCにそれぞれ一1,1,0を代入する.
XとYの配列要素を添字の値の小さい方から順に比較して,最初に両者
の値が一致しなくなったときの大小関係でINDCの値を決めればよい。
この関数副プ・グラムは減算およぴ除算を行うのに必要である。
SUBROUTINE SUBSTI(X,Y,N)
配列Xの各配列要素の値をもうひとつの配列Yの対応する配列要素に
代入する.ある配列に記憶されている多数桁整数を他の配列に移すための
もので,簡単であるがサブルーチンにしておくと便利。
169
一橋大学研究年報 自然科学研究 24
SUBROUTINE ADD(X,Y,N,H)
配列X,Yで表わされ,る非負多数桁整数ω,ゐの和α十ゐを計算し,それ
を配列Xに記憶させるサプルーチンである.Yは引用されたときの値を
保ち,Xには引用されたときの値にYの値を加えた値が戻される.Eは
桁上がりを表わす変数でその値んは0か1である.サブルーチンから制御
が戻るとき,ん=0であればα十δは10進で軌桁以内の整数であり,ん=1
であれば4π十1桁の整数である.添字Jの値がブのとき配列要素x(J),
Y(J)の値をそれぞれ勘,〃ノと書くことにする.
1 2 N
X∬1諾2・・。ぼπ
Y 〃1〃2 … 飾
手順は流れ図に示す通りである.最初にんニoとしておき,ブをπから1
まで一1ずつ変化させて次の操作を繰返す,吻+駒+んを求め,この値が
104より大きければ朽十釣十h-104を新しくx(J)の値としん=1とお
く,そうでなければ吻十駒十んをx(J)の値としん=oとおく.ブ=1の
ときの操作が終った時点でん=1であれぱ,α十δの10進表現における先
頭から2番目から5番目までの4桁の値をX(1)は表わしている.
α,δがあまり大きい桁の数でない場合,先頭からいくつかの勉,ぢ=1,2,
・・ および駒,z=1,2,…,はすぺて0ということになる.このときは,
DOループで何回か繰返しを実行してDO変数Jの値がある程度小さくな
ると,その先の繰返しは意味がなくなってしまう.この無駄を少しでも避
けるために,たとえば前述の関数副プ・グラムISTRを用いて次の様に
170
FORTRAN77による多数桁整数の演算
h・・H
サブルーチン ノ…J
ADD n…N
h←0
∫,…X(」
〃,…Y(J
ノ←%
ブ≦1ノ←ブー1
F
丁 戻り
紛←紛+齢+h
5r」≧104
T
為←∫」一104
h←1 h←0
サブルーチンADDを変えてみる.仮にADD2と名前をつけることにし
よう.N,x,Y,H,Jは前と同じでPは整数型変数とする.
SUBROUTINE ADD2(X,Y,N,R)
INTEGER N,x(1:N),Y(1:N)、H,IsTR,J,P
H=O
P=ISTR(Y,N)
IF(P,E9.0)RETURN
171
一橋大学研究年報 自然科学研究 24
DO10J=N,P,一1
(DOループ内は変更なし)
10 CONTINUE
IF((H,Eg.0).OR.(P Eg.1))RETURN
IF(X(P-1).NE.9999)THEN
X(P-1)=X(P-1)十1
H=O
RETURN
END IF
X(P-1)==O
DO20J=P-2,1,一1
x(J)=x(J)十1
1F(X(J).LT.10000)THEN
H=O
RETURN
END IF
20 CONTINUE
END
このプログラムではDOループが2個に分割されている.最初のDOル
1一プの直後のIF文でH=0が成立つ確率はほぼ一である.またX(P-1) 2は0以上9999以下の任意の値をとりうるからX(P-1)=9999となる確 1 (6)率は である.よって2番目のDOループが実行される可能性は少 10000ない.Pの値をpと書くことにすると,最初のDOループの繰返しの数
はπ一p十1となる,pの定義より駒=011≦ブ<pだからDO変数Jの
値がp-1以下のときは和を求める必要はなく,ただ桁上がりの影響さえ
処理すればよい.pが大きいほど,すなわち6の桁数が少ないほど繰返し
172
FORTRAN77による多数桁整数の演算
の数は小さい・サブルーチンADDでは繰返しの数は%だからp-1だ
け節約できることになる.ただしこの分だけ効率が上がるわけではない.
関数副プ・グラムISTRを引用するが,この中にDOループがありp回
繰返しが行われる.このDOループの範囲は実質的には比較1回だけか
ら成る,一方ADDのDOループの範囲内には,X(」)≧10000が成立つ 1確率を一と考えると,加減算2.5回,代入1回,比較1回がある.この 2差だけADD2の方がADDより効率が良いことになる。
上の例ではpだけを使ったが,ISTR(X,N)の値gも使うとさらに効
率を上げられるであろうか.g≦pすなわちαの方がゐよりも桁数が多い
ときはgを使う意味がないので,g>pと仮定する.」O歪=0;1≦ご≦g-1,
駒=011≦ブ≦p-1である.この場合ADDの中のDO文を次のように2個
に分ける.DO変数Jの値がπからgまでのときはDOループの範囲内
を変更しない.Jの値がg-1以下のときは,桁上がりに注意する以外は
ほとんどx(J)にY(J)の値を代入するだけという手続きにできる.す
なわちADD2の中の最初のDO文において,DO変数の値がg-1から
pまでのg-p回の繰返しに関しては操作を少し簡単にできる.しかし,
この方法ではgを求める手間がADD2より余分である.特にJの値がp
からgまでの間は,上記の操作とgを求めるときの二度DO変数が動く
ので損である.
一般的にはADD2が効率の面で良いであろう.ただし,pが小さい揚
合はADDとの差はあまりない.gがpよりかなり大きい時でもgを使
って効率を上げることはそれほど期待できない.いずれ’にしろNの値が
10とか20とかの小さい場合は計算時間は非常に短くてすむ.Nの値が大
きいとき,あるいは何回も演算を実行しなければならないときなどを除い
て,無理に効率を高める必要はないであろう.またそのような揚合でもデ
ータの質を考慮した上でくふうすべきである.
173
一橋大学研究年報 自然科学研究 24
SUBROUTINE SUBTR(X、Y,N,H)
配列X,Yで表わされる非負多数桁整数α,δの差α一δを計算し,結果
を配列Xに戻すサブルーチン副プ・グラムである.Yはサブルーチンが
引用されたときの値を保ち,Xには引用されたときの値からYの値を引
いた値が戻される。変数Hは桁下がりを表わし,0か1の値をとる.与
えられたデータがα≧δの揚合だけこのサブルーチンは正しくα一ゐを計
算する.α<δの場合はサブルーチンを引用したプ・グラムにHの値とし
て1を戻し,α一西が正しく計算されていないことを表示する・α≧ゐであ
ればHには0が戻される.計算の手順はほぼADDと同じである.最初
にん=0とし,ブを鷲から1まで一1ずつ変化させて次の操作を繰返す.
¢ノー劉,一んを求め,それが負であればそれに104を加えた値をx(J)に代
入しん=1とおく.もし正またはoであればそのままx(J)に代入し為=o
とおく.
引用される際に与えられるデータがα≧δをみたしているかぎり,関数
副プログラムISTRを利用してSUBTRの中のDO文を
Do lo J=N,IsTR(x,N),一1
と変えても正しく差α一δを計算し,繰返しの数が減少する分だけ効率が
良くなる.、しかし,もしISTR(X,N)の値よりISTR(Y,N)の値の方が
小さいようなデータが与えられたとき,このDO文ではα一δを正しく計
算できず,Hの値だけではその誤りを検出するごともできなくなる・こ
れではサブノレー‘チンとして不完全である.ISTRを用いて効率を高めるこ
とは容易であるが,サブルーチンの機能も変えた方が都合がよいので,第
3節で紹介する二とにする。
SUBROUTINE MULT(X,Y,Z,N,H)
配列X,Yで表わされる非負整数αおよびδについて,その積⑳を計
L74
FORTRAN77による多数桁整数の演算
サブルーチン
MULT
ρ1←ISTR(X,N〉ρ2←ISTR(Y,N)
β二←0,
1≦」≦銘
ρ・一〇またはT
ρ2=O
F
T ρL十力2≦㌶
F
ノ←η F ノ≦あ+1
ブ←ゴー1
T
h←0
々葺些1為≦カ1F.
T
J←々十ノーπ
名‘←2r’十工た×〃1十1ε
h←z,/10000
竃』←z,一hX10000
h…H ノ…J
海…Kl一:::言1
あ…p2 識・一X(K)
鮎・…Y(J)
z‘…Z(L)
■[, ,
み←o l
h←1 戻り
.犀り
一
1~←0
海≡ヂ、々≦ρ・F
T
lF←々十力2一%『
β‘←zε十」庵×9魁十h
h←々/10000
2ど←zど一hX10000
175
*
一橋大学研究年報 自然科学研究 24
*
」=1F
T
Th≠0 z‘一1←h
F
ゐ←1 h←0 ん←0
戻り 戻り
算し配列Zに記憶させるサブルーチンである.X,Yは二のサブルーチン
が引用されたときの値を保つ.のが10進軌桁を超える揚合は,⑳の値
を正しく計算せずHの値を1として戻す.そうでなければHにOを戻す.
計算の手順を流れ図で示す.まずISTR(X,N)およびISTR(Y,N)の
値p1,p2を求め,Zのすぺての配列要素に0を代入しておく.
1 P1 N
XO… 0勘一… 蜘
1 P2 N
Y O 0 双P2 ・ ・ 静
176
FORTRA翼77による多数桁整数の演算
p1=0ならα=0,p2=0ならゐ=0であり,これらの場合は積切は0.ま
たp且+p2≦πであれば面は10進表現で軌+1桁以上になるので,p1+p2
≧π+1の揚合を考えればよい.
ク ゐ=Σ駒×104くπ一∫}
プコルであるから,αと駒の積を計算し,それに10蛾一ノ,を掛けて(配列によ
る整数の104進表現において,10輪一’)を掛けることは配列要素の添字の
値をπ一ゴだけ減じることと同じである),配列Zで表わされる整数に加
える,という操作をゴニπ,π一1,…,p2,について実行すればよい.実は
p1+p2=%十1とすると,ブ=p2のときに最後の桁上がりによって積のが
10進4π十1桁の整数になる可能性がある.このためプログラムでは%≧ブ
≧勉十1の揚合とブ=p2の場合に分けてある.π≧ブ≧勉十1についての操
作は本節の末尾に載せてあるプログラム中の次の部分で行われる,
DO30J=N,P2十1,一1
1F(Y(J).Eg,o)Go To301
H=O
DO20K諾N,P1,一1
L=K十J-N
z(L)=z(L)十x(K)*Y(J)十E
H=z(L)/10000
Z(L)==Z(L)一H*10000
20 CONTINUE
Z(L-1)=H
30 CONTINUE
Xの表わす整数αとY(」)の値駒の積働を計算し,それをある大き
さNの1次元の整数型配列U(1:N)に記憶させるには,次のようにす
れ,ばよい。
177
一橋大学研究年報 自然科学研究 24
H=O
DO m K=N,1,一1
U(K)=X(K)*Y(」)十H:
H=U(K)/10000
U(K)=U(K)_H*10000
観 CONTINUE
この操作と,配列要素の添字の値をπ一ゴだけ減らしてZの表わす整数に
加えるという操作を合わせたものが上記のものである.Hは,そこでは
乗算における桁上がりと加算における桁上がりの和を表わす.
z(L)=z(L)十x(K:)*Y(J)十H
の右辺のZ(L),X(K:),Y(」),Hの値はすぺて0以上9999以下で,したが
って左辺の値は108-1以下である.108-1がこのプログラムでひとつの
変数が扱う最大の値である.p1十p2≧π十1だから,ゴ≧p2十1ならL-1
の値は常に1以上でありZ(L-1)が定義できる.Lの値が1であるかど
うかの判断をするIF文をDOループの中に入れることにすれば,ブ=p2
の揚合だけを別に扱う必要はない.なお細かいことであるが,Y(」)の値
1が0である確率を と考えるとすれぱ,効率の面からはこれを判断す 10000るIF文はむしろ削除するのが良い.
配列Zを使わずに積のを計算し,結果を配列Xに記憶させて戻す機
能のサブルーチンを第3節で紹介する.
SUBROUTINE MLTSTR(X,Y,MLTR,N,11,12)
配列X,Yで表わされる非負多数桁整数α,6およぴ整数型変数MLTR
に与えられる非負整数8に対し,α一ゐ6を計算し結果を配列Xに記憶させ
て戻す機能をもつ補助的なサブルーチンで,除算のサブルーチンDIVID
の中で引用される.仮引数11,12に与えられる正の整数値をそれぞれゴ1,
178
FORTRAN77による多数桁整数の演算
ゼ2とする・このサプルーチンが引用されるとき,添字の値が♂1-2以下の
Xの配列要素の値はすべて0でなければならない.また添字の値がぜ1-1
以下および宛十1以上のYの配列要素の値はすべて0とみなして計算す
る。α≧玩でないとこのサブルーチンは正しい計算をせず,その旨を印刷
する・ここではHは桁下がりを表わす変数で,その値は負または0であ
る.
H=x(L)/10000-1
においてH・X(L)の値をそれぞれh,苅とおくと,この段階で欝‘く0で
あるので,整数型の除算の規約により
んX10000く範≦(ん十1)×10000
が成立する。¢呂を10000で割った商が整数でないとき,小数点以下を切り
上げる操作を行うことに注意する.
SUBROUTINE DIVID(X,Y,Z,N,H)
配列X,Yにより表わされる非負多数桁整数α,6について,αを6で割
ったときの商および余りを計算し,・それぞれ配列Z,Xに記憶させて戻る
サブルーチンである・ゐ=0のときはHの値を0として,なにもせずに戻る.
δ≠Oのとき,Hの値を1として除算を実行する.本節末尾のプ・グラムで
は整数型演算のみを用いている.実は倍精度実数演算を行えぱ簡単な変更
で効率を上げることができる箇所が1か所あるが,それについては後述す
る.
プ・グラムに沿って計算の手順を説明する.
1) P1=ISTR(X,N)
P2=ISTR(Y,N)
ISTR(X・N),ISTR(Y・N)の値をそれぞれP1,P2とする.P2=0であ
れぱ除数ゐはOだからEに0を代入して戻る.そうでなければHに1を
179
一橋大学研究年報 自然科学研究 24
代入して次に進む.
2)INDC(X,Y,N)により,α,δの大小を比較する.もしα<ゐなら商
は0だから,Zのすぺての配列要素に0を代入し戻る.この揚合,余りは
αだからXの値はそのままでよい.もちろんα=ゐなら商は1,余りは0
であるが,このあとの議論はα≧ゐなら成立するので,α=ゐの揚合をここ
で特別に扱うことはしない.α≧ゐ中0として議論を進める.
3)p2=πのとき,すなわち0<ゐ≦9999のとき,除算は容易である.最
初に置=0としておき,皿汁8×10000を翫⇒で割ったときの商を2‘,余
りを‘とするという操作を,p1からπまで呂を1ずつ変化させて繰返せ
ぱよい。
2ρ置2ρ監+ゴ”2π
がαをδで割ったときの商の104進表現であり,最後の‘の値が余りであ
る.以下p2≦π一1と仮定する。
4) D1=Y(P2)十1
D2=Y(P2)*10000十Y(P2十1)十1
D1,D2の値をそれぞれd1,42とおくと
(2.1)d1=劉P、+1,42一霧P、×104+写P,+旦+1
すなわち,δの104進表現において先頭の桁の値に1を加えたものが4且,
先頭の桁と2番目の桁から成る104進2桁の数に1を加えたものがd2で
ある,
5) M=P2-Pl
DO40J=P1,N-M,一1
Y(J)=Y(J十M)
40 CONTINUE
DO50J=:N-M十1,N,1
Y(J)=0
180
FORTRAN77による多数桁整数の演算
50 CONTINUE
駝=p2-p1とおく.α≧δ≠0だから0≦観くπである.ここの2個のDO
文は,配列Yによるδの104進表現において鴉桁だけ左へ桁移動するた
めのものである.
1 、P1 N
XO… 0エρL 戴” a
1 P2 NY O 0〃P2・。・3加b
1 N
ノ1 ’
ノ ’
ノM
一
,N
’
’ ノ
一
P
YO… 0幽… 〃銘0… O bくω
この操作により,配列Yにはわ㈱効×10蜘曹刎が記憶される.
6) DO60L=1,N-M-1,1
Z(L)=0
60 CONTINUE
αをわで割ったときの商は104進法で狐十1桁以内の数である。よって
配列Zの添字の値が1以上π一窺一1以下の配列要素には0を代入する,
以上の準備のもとに除算を実行する.α(o》=αとおき,♂を0から鵬ま
で1ずつ変化させて次のような操作を繰返す.
(2.2) αω≧妬ゆ×・
が成立するような整数0のうち最大のものを2π肌+‘とおく.これはαω
をゐく肌一ので割った商である.余りをα紛ユ}とおく.すなわち
αし‘+1♪=αω一δ〈処一‘〉x2π一醐
181
一橋大学研究年報 自然科学研究 24
プ・グラムではゼのかかわりに乙=π一η+ピをパラメータとして用い,変
数Lでその値を表わす.上の操作で得られる2;が配列要素Z(L)の値に
なる.αをゐで割ったときの商は104進表現で
2η一m2η一恥十1川2π
となり,この形でZに記憶される.また最後のα(m+1)が,αをδで割った
ときの余りである.
7) L=N-M
P2=Pl
LとP2に初期値を与えておく.この直後の文番号100のCONTINUE
文からEND文の直前のGO TO文までがひとつのループを構成する.
この繰返しはGO TO文とIF文で制御している,
呂をひとつ固定してループ1回の操作を見ていこう.便宜上‘のかわり
に主として仁升糀一πを使って説明することにする.初めの段階で配列
Xはα(のを表わし,Yはゐ(m一¢>を表わしている.ここでは,整数型変数
P2はISTR(Y,N)の値,すなわちP1十ゼを表わす.煩雑さを避けるた
め,この値をpと書くことにする.
8) IF(INDC(X,Y、N).EΩ.一1)THEN
Z(L)=O
GO TO120
END IF
INDC(X,Y,N)により,αωと6く㎜一‘〉の大小を比較する.もしα(‘)〈
δ(皿一‘〉ならば2FO,α(‘+1)=α【‘)だからZ(L)に0を代入し,」〈πのときは
‘に1を加えて次のステップに進めばよい.‘=πならこれで終わりである.
さてαω≧ゐ〈πゆの揚合に(2。2)をみたす整数oのうち最大のもの2‘
を求めよう.αωとゐく況一葛〉の10弓進表現の先頭の2桁または3桁からそれ
らの値を近似し,2‘の値の見当をつけるという方針をとる。乞≧1ならαω
182
FORTRAN77による多数桁整数の演算
はゐく肌一歪一1)で割ったときの余りであり,δ〈η一例〉編ゐ〈皿一∫>×104だから
(2.3) ゐ〈皿一‘〉≦ωω<6〈肌一‘〉×104
となる。ぎ=0のときもこの不等式は成立する.pの定義より,配列要素
Y(J)の値駒は1≦ゴ≦P-1のときoで働≠o.したがって配列要素x(J)
の値ηは1≦ブ≦p-2のときは0である.必p-1が0かどうかで揚合を分け
て考える. 、
(i)p≧2でのp-1≠oの場合:
P1=P2-1
K1=(X(P1)*10000十X(P1十1))/Dl
cALL MLTsTR(x,Y,K1,N,P2,J)
K2=(X(P1)*100000000十X(P1十1)*10000十X(P1十2))/D2
においてK1,K2の値をそれぞれ砺,碗とおくと
(2,4) ~‘=乃1十乃2または2‘=乃1十彦2十1
が成立することを見よう・なお,あとの都合上p3=P-1とおいておく.’
α(の
ゐ(鵬紛の1げ進表現は
(の_ α 一¢P-1¢PのP+ゴ”¢η
δ軌一‘〉= 伽伽+1…筋
である.
α=¢P一、×104+鮪
とおくと
(2.5) α×104(π一P)≦α(の<(α+1)×104(犯-p》
が成立する.また
(2.6) 9ρ×104(π一P)≦δ(処一‘〉<(写P+1)×104(π騨P》
である,(2.1)の41は今の記号では〃p十1である.αを41で割ったと
きの商は砺である.余りを7且とすると
(2・7) α=乃、〃P+乃、+γ1;0≦γ、く写P+1
183
一橋大学研究年報 自然科学研究 蟄
ここで乃1≦~εであることに注意する.(2。5),(2.6)より
(2。8) αω一ゐく皿一‘》ん1<{(α+1)一晒1×104(η一P》
=(為1十71十1)×104〔π一P)
また(盆3) よりαく(3rp十1)×104だから,(2。7) より
(2,9) 乃三+7、+1<2×104-1
がわかる.ここで
3=αω一ゐく㎜騨‘〉乃1
とおく.この値はMLTSTR(X,Y,K1,N,P2,L)により計算される.実際
このサブルーチンの引用によってXの添字の値がグの配列要素に戻され,
る値を砿と書くことにすると
び グ ノ ず 8=‘じP-1¢pj5P十1”甥ね
は3の104進表現になる.これの先頭の3桁をとり,
β靴P〆一、×108+¢P’×104+¢Pグ+・
とおくと, (2.8) より
(2.10) β<(乃、+71+1)×104
がわかる.特にβは整数型変数に正確に記憶できる大きさであることに
注意する.さて,
5≧6く倣輔>×θ
をみたす整数0のうち最大のものを考えよう。それを00とおくと
(2.11) 2‘=乃、+o・
である.(2.1)で定義した♂2を使う.今の記号ではd2=働×104十写p+1+1
である。βを碗で割ったときの商は碗である.余りをγ2とし,βをd2-1
で割ったときの商を厨,余りを72’とする.すなわち
(2。12) β=乃242+72; 0≦72<碗
(2。13) β⇒2ダ(d2-1)+72’;0≦γ2ダ<d2-1
このとき
184
FORTRAN77による多数桁整数の演算
(2.14) 乃2≦・。≦乃2’
である.曜一乃2が0または1であることを見よう.(2.12),(2、13)から
(2.15) (厨一砺)d2=72-72’+乃2’
巧≧2と仮定すると♂2≧2×104十1となるから,(2,9),(2,10),(2。13)よ
り乃〆<104-L72<(濱2だから, (2.15)により 碗’一乃2=0または1がわか
る.鈴=1のときはαく2×104だから,(2,7)より砺十71→一1≦104十1と
なる.碗≧104十1ゆえ,これと(2.10),(2.13)を合わせてア2-72’十耐く
242が得られ,この揚合も厨一乃2=0または1となる.いずれにしろ,
(2.11),(2.14)から(2.4)が成立することがわかる・なお次のことに注意
しておく.(2.3)より¢(4)一δ(伽一‘沸1<ゐ軌.乞〉(104一砺).よってβくd2(104一あ1),
特に屡≦104一乃1.9pが小さいとき,これは(2.10)より都合がよい.た 104 104とえ晦ρ一・のとき為・≧万であり・したカ:ってん2’≦万がわかる・
(ii) (i)以外の揚合,すなわちp=1,またはp≧2でのp-1=oの揚
合:
P1=P2
K1=O
K2=(x(P1)*10000十x(P1十1))/D2
K1,K2の値乃1,乃2が(i)の場合と同様に(2・4)をみたすことをみよ
う,今は砺=0である.またp3=pとおいておく.α(の,6(鳴ゆの104進
表現は
ω_ σ 一のP躍P+ゴ”¢π
ゐくm磁>=写ρ写P+1…9π
である.
α靴P×104+¢P+、
とおく.αをd2=駒×104+写p+1+1で割ったときの商が乃2である。余り
を7とする.さらに,αをd2-1で割ったときの商を耐,余りを〆とお
185
一橋大学研究年報 自然科学研究 24
く.すなわち
α=乃2d2十7; 0≦7<42
α=あ2’(42-1)+〆10≦〆<42-1
このとき
乃2≦β‘≦乃2’
となる.(乃2’一あ2)42ニ7一〆十な2’であるが,ここではα≦108-1でd2≧
104十1だから,厨く104.よって厨一乃2は0または1で,(2.4)が成立す
る.
9) CALL MLTSTR(X,Y,K2,N,P2,L)
IF(INDC(X,Y,N).Eg-1)THEN
Z(L)=K1十K2
ELSE
Z(L)=Kユ十K2十1
END IF
こ二のサプルーチンMLTSTRの引用によりα〔‘)一b軌.‘〉(あ1十乃2)(=%
とおく)が計算され,配列Xにその値が戻される.INDC(X,Y,N)によ
って%とゐ(処一ε>の大小を比較する.もしδく皿ゆの方が大きいならぱ,
2‘=砺十碗でα轍1》=%である。またもし価≧ゐ軌.乞〉なら,(2.4)より~‘=
乃1十碗十1であり,α(4+1)=%一δ〈η.‘〉であるからXの値からYの値を引く
必要がある・ここでは添字の値がp8-1以下のXの配列要素およぴp-1
以下あるいは什1以上のYの配列要素の値は0だから・この減算では
DO変数を‘からp3まで動かせばよい.
10)どrならこれで終了する.k%なら配列Yによるδく刑>の104
進表現を1桁だけ右へ桁移動して,Yがδ(鵬一‘一1>を表わすようにし,L,
P4にそれぞれ1を加えてループの先頭に戻る.
186
FORTRAN77による多数桁整数の演算
さて,(i)の揚合には2εを捜す過程がいささか煩雑であった.(i)の
場合の記号で,αを4r1=伽で割ったときの商を屍,余りをパとお
くと
α=蜘P+7、’;o≦パく穿P
であって乃1≦2ε≦扉となる.しかし一般に砺と耐の差は大きい.この
差は膨が小さいほど大きいが,たとえば働.1=100,吻=9999,@p=101の
揚合でも,乃1=9901,観=9999である.のp+1あるいは宮p+ユの値により2置
は乃1から耐までの任意の値をとりうるので,これでは2‘の値の見当を
つけたモとにならない.一方,γ=¢p-1×108十%×104+Zp+、をd2で割った
商とd2-1で割った商の差は高々1で,2εはこのどちらかに一致する.
このようにγを考えればよいのであるが,この例ではγは10ユoより大き
く,ここで想定しているシステムの整数演算では正確に扱えない.しかし,
倍精度実数演算を行うことにすれば(i)の揚合も(ii)の場合と同様に
処理することができる,実際K1,K2の代わりに整数型変数Kを用意し,
プログラムの一部を次のように変更すれぱよい.
IF((P4,NE1).AND.(X(P4-1).NE.0))THEN
P1=P2-1
K=(x(P1)*1.o D8十x(P1十1)*1.o D4十x(P1十2))/D2
ELSE
P1=P2
K=(X(P1)*10000十X(P1十1))ノD2
END IF
CALL MLTSTR(X,Y,K,N,:P2,L)
IF(INDC(X,Y,N)。Eg。一1)THEN
Z(L)=K:
187
一橋大学研究年報 自然科学研究 24
ELSE
Z(L)=K十1
Tニ0
END IF 省略したT=0以降の部分は前と同じでよい.FORTRAN77では,整
数型のオペランドと倍精度実数型のオペランドの間の演算は倍精度実数型
に変換して行うので,(i)の揚合7の値は倍精度実数演算で計算される・
Kが整数型変数だから,このγの値は整数型に変換されてKに代入され
る.
除算は他の演算と異なり手間がかかるので,効率を考える必要がある.
計算量がほぽバに比例することから,倍精度実数型の配列を用いて各配
列要素に10進8桁ずつ記憶させることにより多数桁整数を表わすのが効
率面から良いようである.第3節で倍精度実数型の配列を用いたプ・グラ
ムを紹介する.
SUBROUTINE TRANS1(CRS,X,N,SIGN,H)
仮引数CRSに文字列として与えられる多数桁整数αに対し,それを
104進表現の形で大きさπの1次元の整数型配列Xに記憶させて戻すサ
ブルーチンである.SIGNはαの符号を表わし,その値は+または一とし
て戻る,CRSに与えられる文字型データは,先頭の位置に符号+,一,ま
たは空白をひとつ置き,その後に0個以上の空白を置いて引き続き0から
9までの数字を適当な個数だけ並ぺた形,あるいは先頭から数字を適当な
個数だけ並べた形で多数桁整数αを10進法で表示しているものとする.
先行する空白および0は無視される。先頭が空白の場合または先頭から数
字が始まる場合は符号はプラスとみなす.プログラム中の整数型変数丁
188
FORTRAN77による多数桁整数の演算
の値ごは,CRSにおいて最初に現われる0以外の数字の文字位置を表わ
す.0以外の数字がひとつもなければα=0として処理し,SIGNに十を
代入して戻る.その他の場合,’は1以上でCRSの長さη以下の値をと
る.
DO40J=T十1,M,1
によるDOループで,CRSにおいて文字位置≠以降どこまで数字が並ん
でいるかを調ぺる.文番号45の文における」の値は,この数字列の最後
の次の文字位置を示す.すなわち,文字部分列CRS(T:J-1)がαの絶対
値の10進表現の数字の列である。なおDO変数に関する規約により,
CRSの末尾まで数字が続いている揚合」の値は糀十1になることに注意す
る.LCはαの桁数を表わす.LCの値が軌より大きいときは,Hに1を代
入して戻る.そうでなけれぱHにoを代入して次に進む.CRS(T:J-1)
を末尾の方から4文字ずつ区切り・それぞれ4桁以内の整数値として添字
の値の大きい順にXの配列要素に代入していく.こ二で,文字列から数
値への変換は内部ファイルにより行う.組込み関数ICHARによる文字
から整数への変換では処理系の採用しているコード表に依存するが,内部
ファイルはコード表から独立しているので便利である.CRSの長さ指定
が(*)であるため,対応する実引数がどのような長さのものであっても
このサブルーチンは使える.
SUBROUTINE PRNT(HEAD,SIGN,X,N)
多数桁整数を印刷するためのサブルーチンである.HEAD,SIGNはそ
れぞれ項目と符号を表わし,これ’らに続いて配列Xで104進表示されて
いる非負多数桁整数を印刷する.便宜上・ここで扱う整数は80桁以内と
し,HEAD,SIGNと合わせてラィンプリンタ1行に印刷することにする.
長さ80の文字型変数CRを作業領域として用意し・多数桁整数を10進
189
一橋大学研究年報 自然科学研究 24
法で表示したときの数字の列をCRに先頭から代入していく.こうして
CRに代入された文字列を出力すればよい.整数値から文字列への変換に
は内部ファイルを利用する.なおこのほかにも,たとえば大きさ80の1
次元の整数型配列を用意し,多数桁整数の先頭から順に1桁ずつ取り出し
て,各配列要素に1桁の整数値として代入し,それを出力することも考え
られる.この方が内部ファイルを使うより実行速度は速い.扱う整数の桁
数を変えるとき,このサブルーチンだけは修正する必要がある.
最後に,これまでに紹介した副プ・グラムを利用して,与えられた2個
の多数桁整数に対し和,差,積,商,余りを計算し,結果を出力する主プ
・グラムを載せておく.主プ・グラムで符号を処理するので,多少手数が
かかる.多数桁整数のデータは,まず文字列として文字変数Cに読込み,
さらにサブルーチンTRANS1で配列に記憶させ,そのあとで演算を行う.
ここでは80桁以内の整数を扱う.前にも述ぺたように,桁数を変えるに
は,主プ・グラムのPARAMETER文でNの値を変更すること,およ
ぴサブルーチンPRNTを修正する二とが必要である.
190
FORTRAN77による多数桁整数の演算
寓富*累家累蹴*窒
潅
累
零
累塞窒 工NTEGER FUNCT工ON 工S↑Rく×,N) 零宰累 零
零
累 累 * 家 竃 竃 塞 塞 家 家 宰 家 家 塞 竃 累 霧 零 竃 掌 零 塞 家 累 竃 竃 塞 累 零 累 累 業 家 塞
X LARGE NON閥EGATIVE 工NTEGER. 宰
N UPPER BOUND OF DI岡ENSION OF ADJUSTABLE ARRAY X. *:STR = THE SMAL」EST SUBSCRIPT OF NON-ZERO ARRAY ELEMENT OF X(工=N〕 *ISTR=O IF X=O. 累
竃 諸 索 霞 * 家 * 窒 累 謝 零 零 * 竃 零 窺 家 家 累 宰 累 * 累 掌 * 零 零 竃 察 率 零 零 * 零
工NTEGER FUNCT工ON 工STR(X/N)
INTEGER N/X(1=N),J DO ユO J篇ユ,N,1
1F(X(」》■NE,O) THEN エSTR冨J
RETURN E ND I F
lO CONTINUE I STR=O
EN D
33塗零*票*寓
*** 工NTEGER FUNCT工ON INDC(X,Y,N) 案豊業
家 零 累 零 零 零 零 零 零 累 累 累 激 常 塞 窯 鼠 累 累 累 傘
COMPAR工SON OF LARGE NONNEGATIVE INTE・GERS N UPPER 80UND OF D工阿ENS工ON OF ADJUSTABLE 工卜IDC謬一1, 0, 1 ACCORD工NG AS X く, 冨, 〉 Y.
含 累 累 累 累 累 掌 家 家 * 虞 家 零 累 累 潅 竃 * 塞 塞 累
傘 零 2 *
×, Y.
ARRAYS
窒 零 業
X/ Y.
累 窯 累 家 累 零 零
累激
蹴
累 家 家 零 零 * 竃
零
累
零
零 零 鴬 累 累 零 家
工NTEGER FUNCTION 工NDC(X,Y/N)
工NTEGER N,×(ユ3N》,Y(1=N),J
DDユO J=1/N,1 工F(X(J)gL1「.Y(」》) THEN
I四DC層一1
R ETURN
ELSE 工F(×(」)●GT.yく」)) THE” I ND C=ユ
R ET UR N
END 工F
ユO CONTINUE I N D C=O
E N D
案零零**翠零3
零掌案累嵩累ホ零
家
X
窒
零
F
零
0
象 零
S
象
丁
章
N
富
僧」
竃
丁●
竃
NY零
O
竃
C’零
X
累
丁
零
US
零
PY象
霧
NA
家 *
工R零
塗 R
累
F日A象
H
)
累 TE*
N
」」
’
*
SRド累
Y
AA
/
3
丁累
X
戸」S
く
8
岡U家
- 邑【J
T
ホ
SD*
S A
B
蹴
E 零
口 RF甲
S
掌
AO竃
F』 家
YN家
N O
I
宰
DI喉
丁
裡S
U
業
昌”N*
O E
R
累
XM虚
B
I
岡∪
累
FD零
S (∪
家 F象
・SO
累 零YT
零
塞
ND
雰
家REN家
OTU
累FN【U家
OB
*XC 家
R
*F』TF』家
TUP
累UP昌「零
丁TU
零IU 累
丁OS
零S 7.累
BF』
零U口随 掌
STN
家 業
SUBROUTINE SUBST工くXダY,N)
INTEGER N,×(1:N),Y(ユ=N),J
DO IO J=1,N4 Y(J》=X(J》
10CONT工NUE E閥D
191
一橋大学研究年報 自然科学研究 24
8零388窪累零累掌霧宰零簿
竃零窒竃累竃宰宰宰審象宰竃嘱8
竃脚 SUBROUTINEADD(X’V’N’H》8竃霧
888零象象窒窒掌竃8繋窒零累寧塞零零零雛零雲零8窒 ADD V TO X ζX=X+Y》。E八CHARRAYELE門ENτOFX/YエSANエNτEGER8EτWEE闘O
INPUτ言 X,YしARGE阿ONNEGATIV巳INTEG巳RS・ N UPPERBOUNDOFDI閏ENSIONOFAD」USTABLEARRAYSOUTPUT= H300R1.エFX〔1)》9999/TH印H3レOTHER冒工SEH-0・ X SUMOF X AND Y・ Y PRESERVES 工NPUT DATA。宰累躍堵累寧幽8潔家掌寧富掌露窒累塞窒竃塞塞寓塞零9
SUBROUTINE ADD(X,Y,N,H)
INτEGER N■Xく1:N),Y(工=N)ノH,J
H菖O
DO IO J=Nグ1’一1 X(J》=X(」》{・Y(」》◎H
エF(×(J》.GE.10000》THEN X(」)3X(」》一工OOOO
H=1
ELSE H30 END IF
lO CONTINUE END
家竃零塞竃2零塞8寓竃富串謬
3 8
塞 宰
3 8
富 。 3
9
竃 9 零
9
窒 9 竃
零 D
Y 累
N
零 ^ ’ 零
X
累累ホ SUBROUT工NE SUBTR(X/Y4N’H》 皐零零
塞 雰 零 窒 累 虚 窒 累 零 掌 累 寧 掌 家 竃 竃 家 塞 家 累 霜 累 家 家 家 零 8 零
SUBTRACT Y FROM X (X=X-Y》EACHARRAYELE図ENTOFX.hSANエNTEGERBETWEENO^ND
工NPUτ= X,Y LARGE NONNEGAT工VE 工NTEGERS● N UPPERBOUNDOFD珊ENSIONOFADJUSTABLEARRAYSk’Y・OUTPUT3 H謁OR1.IFXくY,THENH=1ANDTHEOUτPUτCONTENTSOF BE IGNORED,OTHERWISE H=O・ X DIFFERENCEOF Y FRO岡X, Y PRεSERVES IMPUT DATA●寧 霧 率 塞 率 家 累 掌 家 家 累 累 寓 竃 累 8 霧 累 零 累 窒 宰 零 塞 3 8 富 累
SUBROUτ工閥E SUBτR(X,Y,閥,H》
工NTEGER UヂXく1:N》,Yく工=N),HクJ
H=o DO IO J昌N’工’一4
x(」)8x【」》一v(」》一H
IF (X(」》.Lτ。O》 THEN
X【J》冒Xく」)+1◎OOO
H=1
εしSE
H冨O
END 工F
lO CONTI閥UE END
192
窒竃寓竃累寧零家掌雄窒8零家嵩
3 亀
塞 D 象
L
3 U 塞
0
3
・
H 零
9 S
零 9 寮
9 X
零 9
竃
FORTRAN77による多数桁整数の演算
3累8塞3紫箪388諭3窒富窒塞
窒 零禦塞 SUBROUT工NE 岡UしTくX,Y,Z,N’H) 塞象累 3
謝寧 零 3 象 8 零 3 零 宰 寧 8 富 3 8 3 8 零 塞 8 寓 零 竈 零 零 察 零 零 富 累 家 零 零 電 竈 家
凹ULTIPLY X 8Y Y (Z胃X累Y》. 竃
EACH ARRAY ELE卜1ENT OF ×’ Y’ Z IS AN INTE6ER BET田EEN O AND 9999. 謝 SUBPROGRA岡 ヱSTR 工S USED,. 家
工閥PUτ3 3 X,Y LARGE NONNE6AT王VE INTEGERS。 露
N UPPER BOUND OF D工岡E閥SION O「 ADJUSTAB【」… ARRAYS X/ Y, Z. 零O口TPUT: *
H目D OR ユ■ IF X*Y IS OF MORE THAN 4零N F工GURES, THEN H胃1 AND τHE 累 OUTPUT CONTENTS OF Z SHOULD BE 工GNORED, 0τHERW工SE H冒0. * Z PRODUCT OF X AND Y● 雛 X’Y PRESERVE エNPUT DAτ飛。 象
象 竃 案 累 索 零 零 罵 窒 竃 零 峯 竃 禦 霧 3 零 素 零 塞 8 雛 零 粟 累 察 零 竃 零 8 累 累 * 家 象
SUBROUT工NE MULτ(X/Y/Z,N,H)
工NTEGER N,Xくユ=N)ノY(13陀),Z(1=N),H/ISTR,」,民,L,P1/P~
P工=ISTR(×,N》
P2=ISTR(Y,N) DO IO L=1,N,1 Z(し》=O
ユO CONTIN口E
工F((P1.EQ.O).OR。〔P2臼EQ.O)) THEN H=O
RETURN[ND IF工F(P1争P2.LE.N》 THE閥
H=1 RETURNE阿D 工F
DO 30 」=N,P2+1ノー1 工F(Y〔」).EQ.O) GO TO 30 H=O
DO 20 K=N,P1,一1 L=K+J-N
Z(L》=Z(L》+X(K)零Y{J》+H
H=Z(L)!10000
Z(L)ロZ(L)-H癖10000
20 CONTI閥UE Z(L-1)=H
30 CONTINU巳 H=o DD 40 K=N,Pユ,-1 L=K+P2-N
Z⊂L)=Z(L)+X(K,ホY(P2)+H
H=Z(L)ノ10000 Z(L)=ZくL)一H零10000
40 CONT工NUE 工F(L。EQ.1》 THEN 工F(H.NE。0) THEN H=!
ELSE
H=O
END 工F
RETURN E閥D IE Z(L彌1)冨H
H=O END
193
一橋大学研究年報 自然科学研究 24
倉零竃嵩零審欝零峯零審嵩嵩竃窒継富家顕寧
竃零家 SUBROUTINE MLTS↑R(X,Y,MLTR,N,11,工2》 準塞零
潔 累 * * * * 塞 業 累 * * 累 累 掌 * * * * 零 * * 彙 零 零 零 宰 零 率 寓 嵩 零
MULTIPLY Y BY MLTR AND SUBTRACT FRO岡 × (X置X-Y累MLTR)。
TH工SSUBROUTINE ISONLYUSED工NSUBROUT工NED工V工D。 EACH ARRAY ELE門ENτ OF X3 Y 工S AN 工NτEGER BETWEEN O AND 9999.
工NPUτ3 ×4Y しARGE NONNEGAT工VE 工NTEGERS. N UPPER BOUND OF D工MENS工O障 OF ハDJUSTABLE ARRAYS X, Y● MLτR AN 工NTEGER BETレJEE爬 O AND 9999- Xく1)=O FOR 工《11-1●
Y(1⊃=O FOR Iく11 0R I2《工一
(RE図ARK: INPUτ DATA 岡USτ SAτISFY 7HE COND:T工ON X>冒V宰ML■『R’ OTHERW工SE SUBROUT工NE MLTSTR 工S 工NVA』工D AND ;N 了HAT CASE A MESSAGE ”ILL BE PR工NTED)g
回UTPUT2 X D工FFERENCE OF Y*MLTR FROM ×, Y,岡LτR PRESERVE INP口T DATA,8 皐 塞 竃 竃 零 零 塞 零 塞 塞 宰 塁 累 塞 零 8 霧 零 零 零 8 3 2 3 8 3 3 亀 8 3
虚塞零家累累出3塞零零3寓零繋鵬零零38
象 8
* 3
零 8
SUBROUτ工NE 凹L「「SτR(,ζ,V,牌しTR,N,11,12)
、
工NτEGER N,×く1=N),V(工=閥),ML了R4工1,12,H,し
10
100
H=oDO 10 1■=12,エヱ,一1
X⊂L,=X(L》一Y(L)窒MLTR+日
工FくX,(L》・LT・0》THEN
H3X(L)ノ10000一手 X(L)含X(L)一H累10000 工F《X(L》・EQ●10000》 THE爬 x(L》冨o
H=H噛ユ
END 工F
EしSE H=o
END 工F
CONT工NUEIF(H。EQ●O》 RE了URNIFくく11.GT.1)●AND●くX(11-1》+H。GEgO)) THEN x(11-1)=》{くエユーユ》+H
ELSE W農工TE(6,100》 璽零寧 SU8ROU71NE 凹LTSTR 工S
FOR赫Aτ(10.,A)
END 工FEND
1踵VALID 8竃,
194
FORTRAN77による多数桁整数の演算
象離案掌零家案索業蹴累累素客竃鵬零審
禽 象累家 SUBRDUτINE DIVIDくX/Y,Z,N,H) 累累累 離
富業 禦 家 3 1露 家 家 * 庫 零 掌 亀 零 零 零 嶺 累 累 業 * 塞 窒 零 家 家 象 零 零 * * * 累 * 激 零
D工VIDE X BY Y (X冨y*Z÷X)● 繋
三ACH ARRAY ELEMENT OF X, Y’ Z 工S AN INTEGER BETWEEN O AND 9999● 窒 SUBPROGRA卜1S 工NDC, ISTRノ 朝L「「STR ARE USED一 激
ヱNPUT3 雛 X D工V工DEND, LARGE NONNEGATIVE INTEGER. *
γ D工V工SOR/ LARGE NONNEGATIVE INTEGER. ま
N UPPER BOUND OF D工凹ENS工ON OF ADJUSTABLE ARRAYS X’ Y, Z』 激OUTPUT= 零
H胃0 0R 1- IF Y=O, TH巨N H冨O AND THξ OUTPUT CONTE牌TS OF Z SHOULD 含 BE IGNORED, 0THERW工SE H置1噌 激 X RES工DUEg 2 Y PRESERVES 工NPUτ DATA. 掌 Z QUOTIENτ● 孝
3 3 * 累 案 次 家 家 零 零 竃 零 零 竃 零 塞 塗 累 家 家 家 激 皐 家 3 霧 激 8 3 零 霧 家 零 窒 零
S口BROUTINE D工VID【X,Y,Z,N,H》
IN了EGER N,×(1=N),Y(1=N),Z(1器N》,H
工NτEGER INDC,ISTR,D1,D2’」ノK1’K2,L,凹,Pユ,P2,Y
P1置工STR(X,N) 』n
P2冨工SτR(Y,N)
IFくP2・置Q.O》 THEN H=O
REτURN
ELSE H菖ユ
E国D 工F
工F(INDC(X/V,吋》.EQ.。1) τHEN
DO IO L冒1,N,1
Z(L》=0
10 CONT工NUE RETURN END 工F
工F(P2曹EQ●N) THEN DO 20 L21,Pユ“ユ’ユ
Z(L)20
20 CONTIN口E T言o
DO 30 L=p1,N,1 X(L)=X(L)壱τ家工OOOO
ZくL)冒X(L》ノY〔N)
丁昌XくL)“ZくL》*YくN》
XくL)=0
30 CONT:NUE X(N)=T
RETURN END工F
D1冨Y(P2》+1
D2=YくP2》8100◎O十V(P2+1》÷工
M冨P2-Pl DO 40 J=P1’N-M’ユ Y(」)買Y(」十凹)
195
一橋大学研究年報 自然科学研究 24
40 CONTINUE DO 30 』!=N-M4・ユノN,1
Y⊂」)冒0
50 CONτINUE DO 60 L署1♂N一図一1,1 Z(L》=0
60 CONTINUE
100
L=N-M
P2=PlCONT工NUE 工F(INDC(X,Y,N》gEQ●一↓)
Z(L)=O
GO τO 工20
END 工F
τHεN
工F((P2。NE。1》gAND.(XくP2-1)。閥EgO》》 THEN P1冒P2-1 K1=(X(P1)*10000+X(P1+1》)ノDl CALL 凹LTSτR(X/Y,K1,N,P2,L》 K2=(×(PコL)塞100000000寺XくP1寺1)*10000÷XζP1+2))!D2
ELSE P1=P2 K1=O
K2=(X(P1》竃10000+×(Pユ十1》》!D2
END 工F
110
120
130
CAしL MLTSTR(X,YヂK2/N,P2クし》IF(工NDC(X,Y,N)●EQ.一1》 THEN Z(L》=K1+K2 ELSE Z(L)3K1+に2+1 τ冒o
DO 1!O J=し’Pユノー!
X(」)=X(」)一Y(」》一T
IF(X(J》・LT■O》 τHEN X(J》旨X(」》+10000
T=1
ELSE T富o
END IF CONT工阿UEENO工F
工Fζし。EQ。N) RETURN DO 130 」旨L,P2,一1
Y(J÷ユ)=Y(」)
CONT工NUE 7くP2》=o
L醤L班 P2富P2←1
GO TOユOOEND
196
FORTRAN77による多数桁整数の演算
竃8零零塞寓竃鷹累零零竃灘竃家寡3零露
漁
窒*竃 SUBROUY工NE TRANS:LくCRS!X,N,S工6N,H) 霧纈竃 累
竃竃 零 零 * 零 業 窒 家 窒 蹴 掌 粟 累 零 家 塞 零 累 累 累 竃 塞 零 * * 零 累 零 零 禽 霧 零 零 事 累
TRANSFORM CHARACTER STRING CRS ‘『O ARRAY X W工TH SIGN。 竃 CRS 工S A CHARACτER VAR工ABLE OF ASSUMED LENGTHg 零 EACH ARRAV ELE凹ENτ OF X 工S AN 工NTEGER BET騨EEN O ハND 9999. 零 INτERNAL FILE IS USEDじ 零
工NPUT= 竃 CRS CHARACTER STRING。 CRS(工=工)冒一, ノ +, OR A 藤iON聯ZERO D工G工丁, *
AND OTH巳R CO卜‘ST工TUENTS OF CRS ARE D工G工TS。 雛 N UPPER BOUND OF D工凹ENSION OF ADJUSTABLE 八RRAY }ζ● 宰OUTPUT: 需
H=0 0R ユ. 工F THE NUMBER OF F工GURES OF THE 工NTEGER REPRESENTED BY 竃 CRS 工S GREATER τHAN 4掌N/ THEN SUBROUT工NE τRANS1 工S 工NVAL工D AND 零 H冨1, 0τHERW工SE H=Og 堵
S工GN=一 〇R +, S工GN OF THε LARGE 工NTEGER REPRESENTED BY CRS. 零
X ABSOLUTE VAしUE OF THE LARG巳 INTEGER REPRESENTED BY CRS. 潔竃 累 3 累 家 家 累 峯 掌 累 業 零 零 窒 掌 零 象 事 家 * 零 家 家 * * 渚 竃 竃 累 霧 串 8 嵩 峯 堵
SUBROUTINE TRANS1(CRS,X,N,S工GN,H》
INTEGER N/X(13N),H,」ノトくノし,LC,M,P,T
CHARACTER SI6N潅1,CRS竃(塞》
」=INDEXく一一 +,ゲCRS(1=1)》
工Fく」・EQ・O》 THEN
T轟1 SIGN=冒+雪
ELSE IFζ」爾EQ。1》 THEN τ=2
S工GN=豊一,
ELSE τ冨2
SIGN買1手,END IF
M昌LEN(CRS) DO IO J=丁ノM/1
工F(工NDEκ(『123456789璽,CRS⊂」3」》,.NE.0》 THEN T=J
GO TO30 END 工F
ユO CONTI閥UE SIGN3雪÷, DO 20 J=1,阿’1
X(の霊0
20 CONT工NUE H竃O RETURN ㌧
30 CONT工卜『UE DO 40 」目丁+1,M/1
1F(INDEXく『0123456789曾ノCRS⊂」;」》》5EQ.O》 GO TO 50
40 CONTINUE50 LC冨」一丁
工F(LC■GT64竃N) THEN H專1
RETURN ELSE H=O
END工F
197
一橋大学研究年報 自然科学研究 24
K=LC’るし謬LC-4家K
P=N-KIF‘ L.εQ.1) THEN READ(CRS〔T=T)ノ冒(11》曹》 ×(P)
ELSE 工F(L.EQ。2) τHEN RE《DくCRS(T;丁+ユ》,一(12)冒) X(P》
ELSE 工F(L.EQ●3》 τ卜{EN
READ(CRS(τ3T+2》,撃(13)冒) XくP》
ELSE L=4 P冨P千1 READ(CRS(T:T+5》,質(14)『》 X(P》
END 工F
DO 60 J3P+1,Nグ1 K=4竃(J-P-1》+T+L
READ(CRS(K:K季3》〆(14)1)X(J》60 』CONT工NUE
DO 70 」31,P-1,1 X(J》暴0
70 CONTINUE END
富家8窒88庫象88鷺審零3富零2篇
*率零 S口BROUT工NE PRNτ(HEAD,SIGNグ×,N》 謝零3
象 家 8 竃 3 零 8 零 8 零 零 零 零 竃 2 竃 禦 竃 竃 8 零 潮 竃 喀 掌 倉. 零_ 竃 8 * 零 竃
PRINτ OF LARGE 工NTEGER OF A↑ MOST 80 FIGURES. EACH AR尺AV EしE岡E≡NT OF X IS A爬 INτEGER BET”EEN O AND 9999。
CR 工S A CHARACTER VARIABLE USED AS A 輔OR民工NG SPACEじ (REMARK= τHE しENGTH OF CR 凹US了 BE GRE…八TER THAN OR EQUAし, 丁O THE
NUM8ER OF F工GURES OF TUE 工NτEGER REPRESENTED BY X)● 工NτERNAし F工LE 工S US巨D。
SUBPROGRAM ISTR IS USEO.INPUT; HEAD HEADING σF DATA● SING=q OR 中’ SIGN OF しARGE 工NτEGER。 X LARGE NONNEGAτ工VE 工NTEGER。 闘 UPPER BOしJND OF DI岡巨卜1SION OF ADJ口SτABLE ARRAY X●
OUTPUT= PR工NT HEAD工NGク SIGN, AND THE CONTENτS OF X。零 宰 零 竃 累 零 竃 累 霧 竃 竃 掌 家 竃 3 鷹 零 零 竃 零 零 竃 寒 累 3 塞 累 寓 謝 竃 8 富
亀窒嵩准家富家宰窒窺業竃皐塞窒家3竃
竃 3
竃 嵩
S口BROUTINE PRNT(HEAD,SIGN/X,N》
工NTEGER N/X(1=N),工STR,14」ノK,L,LNG,PC卜…ARACTER HEAD零(*),SIGN零ユ’,CR霜80 ・ F・
P=ISτR(X,N)
工F(P.EQ阜O) THE岡 CR(1=1》冒,0置
LNG=1 SIGN=■ 1
GO TO30E閥D工F
198
FORTRAN77による多数桁整数の演算
エF(4塞(N-P+1)●GTgしEN(CR)》 THEN WR工TE(6,100》
RETURNεND 工F
HEAD,冒τROUBLE OCCURS IN SUBROUτINE PRNT審
IF(X(P).GE●1000) τHEN L=4
WR工TE(CR(1=4),冒(14)冒) X(P》
ELSE IF(X(Pン●GE。100) THEN L=3 WR工TE(CR〔1=3)卜,,(13)電) X(P》
ELSE IF(X(P)■GE●10) THEN L=2 WRITE(CR【1:2》,冒(工2)禦》 X(P)
EしSE L旨1 WR工TE(CR(ユ=1》,u(工1》・》 X(P》
END 工F
0012
DO 20 」=P+1/Nグ1 K=4*(J-P-1)+L+1
WR工TE(CR(K=K+3)グロ{工4)1)
DD ユO 工=G,2,1
1F(CR(K+1=κ+工》。EQ,騨 ,》
CR(K+I
ELSE GO TO
END IF CONTINUECONT工NUE
=K十1)=『o,
20
×くJ)
THEN
LNG=4*(N-P》+L 工F(SIGN.EQ.電を9》 SIGN昌騨 ,
30 HRITE(6,110》 HEハD4SIGN/CR(1;LNG)
OOO1
4占-
FORMAT(一〇『,2A》
FORMAT⊂『O,,3A》END
3家宰露象累零8零象
凹AIN PROGRA凹 FOR FUNDA凹ENTAL ARIlrHMEτ工C OF『LARGE 工NTEGERS
ハLL LARGE 工NτEGERS APPEARED 工N TH工S PROGRA岡 FIGURES, THE三 LENGTH OF CHA疲ACτER VARIABLES A’ Bρ C SUBPROGRAMS ADD/ D工V工D, 工四DC, MULT, PRNτ, ARE 口SED。竃 霧 零 宰 寓 家 3 家 寮 8 累 8 8 皐 窪 雛 宰 窒 8 零 8 8
宰 家 窒 家 竃 零 激 零 零 寓 累 家 零聾零 竃 8 象 ホ 零 纏 窒 家竃F
O
* E
*B
象T
S
喰U
凹
竃 累丁「
S
累0
凹
累 丁
家^
MUSτ BE EQUAしSUBST工,,SUBTR,
零N
家
業4
丁0 4富N。
τR酬S1
累 宰 家 霧 露 3 零 8 3 3 零 窒
3零3紫竃零零累93
INT!三GER NPARA岡ETER くN雷20》INTEGER X(13N》,γ(1=四)ダZく1=N》クUくユ3N》
INTEGER H,HA,HB,1,INDCCHARACTER C零‘4率N),SA累1,SB竃1,SIGN竃1
199
一橋大学研究年報 自然科学研究 24
10 READ(5,,くA,『」END=30) C
CALL TRANS1(C,X,N,SA,HA》 REへD(5ノ『(A),) C
CALL TRANS弐くC,Y,村,SB,HB) IF((Hハ。EQ●1)gORg(HB.EQ・:し》》 THEN 転’R工TE(6,工OO) 冒零零 τRA卜ξS工 IS 工凹POSSIBLE
GO TOユO ENDエF CALL PRNT(, A冒9,SAクX,N》 CALL PRNT(・ B=,’SB,Y,N》
累虚じ
8 累竃雛 ADD工丁工ON
1冨INDC(X,Y,N)
CALL SUBSTI(×,Z’N》CALL ADD(Z,YグN,H》工F《lgEQ■一1》 THEN CALL SUBSτ工(Y/U,N》
CALL SUBTR(U,×,N,H》 ELSE CALL SUBSTI(XダU,髄》 CALL SUBTR〔U/Y,閥,H》
END工F
AND S口BTRACT工ON 寓癖零
エF‘SA.EQ.SB) THEN CAしL PRNT(, A+B富,,SA,Z,N》
IF(1.6EgO》 THEN S工GN≡SA
ELSE エF(SA。EQ働,階9》 τBEN
SIGN=,÷,
[しSE
SIGN言9-u
END IF
END IF CALL PRNT(U A噌B影,,SIGN,U,N)
ELSE 工F(1。GE.O》 THE” SIG門富SA
ELSE SIGN=SB
END 工F
CALL PRN了くe A+B冨9’SIGNグU’N, CAL」 PRNT《■ A-B昌,,SA,Z,N)
E吋D工F
8 零累累 凹ULτ工Pし:CAT工O閥 *激竃
CALし MUL7(X,Y,Z,吋,H)
工FくHgEQg1) THE” ”R工τEく6ノエOO》 曾 A陰B IS OF 凹ORE τHA阿 80 F工6URES”
GO了020END工F
工F(SA-EQ。SB》 SIG腫昌,←璽
EしSE S工GN=9一『
END工F CAしL PRNTく置
20 CONτ工NUE
τHEM
A累B=豊,S工GN,Z,N》
200
FORTRAN77による多数桁整数の演算
累*累 D工》工S工ON 累累霧蹴
CALし DIVID(X,YグZ,N,H) 工F(H.EQ.O) 了トlE卜:
WRITE⊂6ク100)璽 A/BエS工凹POSSIBLE(DIVISORIS OエN GO TO IO E四D IF
工F(SA。EQ.SB》 ・『HEN
SIGN=置+『
ELSE S工GN=,一u
END 工F CAしLPRNT(電 A/B3”SIGN・Z’N》 CALしPRNT(一RESIDUE3㌧SA’X州》 GO TO IO
lOO FOR岡Aτ(90一,A》
110 FORMATく101,3A)
30 E酷D
DIVID)ロ
201
一橋大学研究年報 自然科学研究 24
3.倍精度実数型配列による演算
前節で述ぺたように,大きさπの1次元の倍精度実数型配列の各配列要
素に,8桁以内の非負整数値を記憶させることにより,配列全体で翫桁以
内の非負整数を表わすことができる.これは非負多数桁整数の108進法に
よる表示である.本節では,このようにして倍精度実数型の配列X(1:N),
Y(1:N)に記憶されている非負多数桁整数α,δの差,積,商およぴ余りを計
算するサブルーチンを紹介する.前節の3個のサブルーチンSUBTR,
MULT,DIVIDをそのまま倍精度実数型配列を使う形に書き換えてもよ
いが,ここでは他の副プ・グラムを引用しないですむように変形する.プ
・グラムのリストを本節の末尾に載せておく.108進表現を考えるため,
定数1.OD8がプ・グラム中にしばしば現われることに注意する.
SUBROUTINE SBTR(X,Y,N,H)
配列X,Yに与えられる非負多数桁整数α,ゐの差を計算し,結果をX
に戻すサブルーチンである.α>δのときはα一δを計算し,Hに1を代
入する.α<ゐのときは一(α一δ)=ゐ一αを計算し,Hの値を一1とする.
FゐならXの各配列要素に0を代入し,Hの値を0とする.整数型の配
列を使う場合でも,この形式の方が第2節のサブルーチンSUBTRより
効率がよい.
SUBROUTINE MLT(X,Y,N,H:)
配列X,Yに与えられる非負多数桁整数の積を計算し,結果を配列Xに
戻すサブルーチンである.積が8π桁を超えるときは,Hに1を代入して
戻る.そうでなければHの値を0とする.第2節のサブルーチンMULT
202
FORTRAN77による多数桁整数の演算
とは途中の計算の順序が異なる.このため,文番号70の文を端末文とす
るDOループが必要になり,それだけ手間が増える,もっとも,X(L-2)
の値が108-1の揚合を除いて,このDOループは高々2回しか繰り返さ
れないので,大きい桁の整数を扱うときには,この部分の負担は相対的に
ごく僅かである.
SUBROUTINE DVD(X,Y,Z,N,H)
配列X,Yに与えられる非負多数桁整数の商と余りを計算し,結果をそ
れぞれZ,X一 戻すサブルーチンである.機能,計算の方法は第2節のサ
ブルーチンDIVIDと同じである.また,プ・グラムの構成および使用
する変数,配列もほぽ対応している.実際,変数N,H,L,M,P1・P2・D1・
D2,およぴ配列X,Y,ZはDIVIDとDVDとで同じ意味で使われてい
る.ただし,DIVIDでは途中で他の3種類の副プ・グラムISTR,INDC,
M二TSTRを引用しているが,DVDでは副プログラムを引用せず,その
揚で展開している.このため,多少の見かけ上の違いがある・
ISTRについては,必要な場所で展開するのは容易である・一方,配列
で表わされている非負多数桁整数の大小を比較するINDCは,引用され
ている揚所によって展開の形が少し異なる.計算の途中では,扱っている
多数桁整数についてある程度のことがわかっているので,INDCを引用す
るより簡単に大小の比較ができるのである.DIVIDで3回INDCが引
用されるが,DVDでは,最初のINDCに対応する部分はDO文を用い,
あとの2個のINDCに対応する部分はIF文とGO TO文の組合せで繰
返しを制御している.各配列要素x(J),Y(J)は8桁以内の任意の非負
整数値をとるので,x(J)とY(」)の値が一致する可能性はきわめて小さ
い.したがって,これら3か所での繰返しの回数は,ほとんど1と考えて
よい。DVDで,文番号35の文を端末文とするDO文によりINDCを展
203
一橋大学研究年報 自然科学研究 24
開しているのは,IF文が3個重なって見にくくなるのを避けるためであ
る.MLTSTRはDIVIDで2回引用される,最初に引用されるのは,
IF((P2.NE。1).AND.(X(P2-1)。NE.0))THEN
で始まるIFブロックで
X(P1)*100000000十X(P1十1)*10000十X(P1十2)
の値をD2の値で割ったときの商を計算し,その結果をK:1十K2で表わす
所である.DVDで対応する部分では,
X(P2-1)*1,0D16十X(P2)*1,0D8十X(P2十1)
の値をD2の値で割る除算を直接実行している・また・乙のときの整数化
した商を変数Sに代入する.P2の値が1のとき,あるいはX(P2-1)の
値が1のときは,DIVIDにおけるK1十K2の値とDVDにおけるSの
値の計算は同じである.DIVIDのK1+K2とDVDのSとが対応して
いる.DIVIDではMLTSTRを二の直後にも引用するが,DVDでは同
じものをその揚所に展開している.なお,DVDにおいて変数Sをすぺて
配列要素Z(L)でおきかえてもよく,本来ならぱSは不要であるが,こ二
ではプ・グラムの見易さを考えてSを使うことにした.
以上の3個のサブルーチンは,主として効率の面を重視して第2節のプ
ログラムを書き換えたものである.第2節のものとの違いは,多数桁整数
を表わすのに倍精度実数型の配列を使うこと,およぴ他の副プ・グラムを
引用しないことである.同一の桁数の整数を扱うのに,倍精度実数型の配
列を使うと,整数型の配列を使う揚合に比ぺて,必要な配列の大きさが半
分ですむ.乗算,除算では計算量が配列の大きさの2乗に比例するため,
倍精度実数型配列を使うことによる節約効果は大きい・なお・記憶領域に
ついては,どちらの型の配列でも同じである。副プ・グラムを引用すると,
引数の受渡しなどの余分な手続きが必要になり,オーバーrヘッドが生じる・
204
FORTRAN77による多数桁整数の演算
特に,DOループの内部など実行頻度の高い箇所での副プ・グラムの引用
は,一般に避ける方が良い.さらに,副プログラムを引用する揚所によっ
ては,周囲の事情を考慮しながらそこで展開することにより,計算のむだ
を大幅に減らすことができる.たとえば,サブルーチンDVDにおいて,
INDCを引用する代わりにその揚で展開している箇所では,制御変数の値
の動く範囲は,INDCの中で動く範囲よりずっと小さい,
FORTRANコンパイラでは,原始プログラムに対して強力な最適化が
行われるのが普通である.効率を高めるためには,最適化機能がうまく作
(7)用するように考慮することも大切である・
多数桁整数の四則演算のように基本的なものは,実行速度が非常に重要
である.繰返し使われる可能性が大きいからである.実行速度を考えると,
やはりアセンプラによりプ・グラムを作成するのが望ましい.この揚合,
(8)アセンブラを使う大きな利点として次のことがある,固定小数点演算命令
でも浮動小数点演算命令でも,乗算では演算結果の置かれる記憶領域は,
被乗数と乗数の記憶領域の2倍である.また,除算では被除数の占める記
憶領域は除数のそれの2倍である.このため,多数桁整数を一定の桁ずつ
区切って,いくつかの番地に分けて記憶させるとき,ほぼ記憶揚所の精度
いっぱいに詰め込むことができる.すなわち,FORTRAN77によるプ・
グラムで各配列要素に記憶させている数値の2倍以上の桁数の数値をひと
つの番地に記憶させることができ,それだけ全体の計算量を減らせる。
桁上がり,桁下がりの処理もアセンブラなら容易である.また,FORT・
RAN77による除算では,商と余りを別々に求めなければならないが,
固定小数点演算命令の除算では,商と余りがともに保存されるため,1回
の計算で求められる.
205
零
33竃零霧宰掌噛瑠家
一橋大学研究年報 自然科学研究 24
象零竃 SUBRO口丁工N【… SBTR‘×’Y/N/H》 8廓3
SLIBTRACT Y FRO凹 X (X=》ζ臼Y 工F ×》冒Y, AND X=Y-X言一(X畠V》 工F XくV》●
EACH ARRAV 巨」EMENτ OF X, Y 工S AN I撞τEGER Bε丁騨EEN O A睡D 99999999・
工NPUT= X,Y LARGE 閥O閥NE〔≡ATIVE INTEGERS。 N UPPER BOU閥D OF D工岡ENSION OF ADJUSTABLE ARRAYS ,{4 V。
OUTPUT= H=一1, 0, ユ. 工F XくY, THEN X 工S THE D工FFERENCE OF X FRO凹 》 A閥D
H=一1. 工F X=Y, THEN X詔O AND HBO● 工F X》Y’ THE邸 X IS THE
DIFFERENCE OF Y FRO阿 × AND H=1,
V PRES巳RV巳S 工NPUT DATA■
SUBRDU了工NE SBTR(X,Y/N,H》
INTEGER H,JグK’L/N DOUBLE PREC工SION X(1=N),Yく1=N,,τ
DD 10 J雰1,Nρ1 工F((Xく」),Nε.O。ODO》.OR一(Y(J),NE。〇一〇DO》》 τHE閥
K=J
GO TO20 E柑D IF
10 CONTINUE H言O
REτUR悶
20 DO 30 J3KダN/1 1F醸(」》.GT.Y(」》》GOTO50
工F〔X〔J).」T●Y(」》》 GO τ0 70
30 CONTINUE H騙o
DO 40 」置蚤く,N/1
XくJ)=O.ODO
40 CONTI閥U巨 RETUR閃
50H=1 T=O.ODO DO 60 L=NヂJ,一1 X(L,篇XくL)一Y(L〕一τ
エF(X(L).LT.O.ODO》 THEM
XくL》躍X(L》+1.OD8
丁胃1,0DO
ELSE
T昌O.ODO
END 工F
60 CONT工NUE GO TO gO
70H冨一1 T=O、ODO DO 80 L=N/Jノー1 κ(L)=Y(L》層κ(L》-丁
エF(X(』)●LT.ODODO》 τHE髄
X(L》=X(」)+1.OD8
T=1。ODO
[LSE
T=O.ODO
END工F
BO CO閥丁工NUE
gO DO ユ00 L=J-1,K,-!
窯くL,露0。ODO
lOO CONT工NUE END,
206
竃
3窒零累顕,3富■睾
FORTRAN77による多数桁整数の演算
3
*竃竃零累*零零象累
累家累 SU8ROUTINE MLT(X,Y,N,H) 潔家累 零
MUしTIPLY X BY Y 《×=×累Y》。 紫
EACHARRAYELEMENTOFX,Y工SANINτEGERBET”EENOAND99999999匿 *工NPUT: 累 X,Y しARGE NDNNEGATIVE 工NTEGERS, *
N UPPER BOUND OF D工凹ENSION OF ADJUSTABしE ARRAYS ×ク Y. *O口TPUτ= 零
H;0 0R i. IF X*Y 工S OF MORE THAN 8*N F工GURES, THEN H=ユ AND THE 寧 OUTPUT CONTENTS OF × SHOUしD BE IGNORED, OTHERWISE H=O。 零 × PRODUCT OF X AND Y・ 零
Y PRESERVES 工NPUT DATA。 宰
SUBROUT工NE MLTく×ダY,N,H)
1N了EGER H,J,K,L,N,P1,P2DOUBLE PR[CISION ×(1=N),Y(1=N),CARRY,丁
H=o DO IO J=1/N,1 1F(×(J》.NE.OgODO》 GO TO 20
10 CONT工NUE REτURN20P1躍」
DD 30 J=1,N,ユ エF(Y(J》.NE■O■ODO) GO 。『0 50
30 00NT工NUE DO 40 L言P1グN/1 ×(し》富0。ODO
40 CONT工閥UE RETURN50P2窩J
工F(P1+P2.LE夢N》 THEN
H冒1
RETURNEND 工F
DO 80 J=P1〆N~1
CハRRY目0.ODO T冒X(J)
X(」)=O■ODO
DO 60 K=N/P2ク韓1 L=K+」一N
X‘L》胃X(L)+Y(K)累丁+CARRY
CARRY=DINT(X〔L)ノ1.OD8》 X(L》=X(L)曽CARRY蹴1。OD8
60 CON下INUE DO 70 K3L-1,1,一1 XくK)=X(K》+CARRY IFく×(K》.Lτ.ユ。ODB》 GO TO 80
X(K〕=×(K》一1.OD8
CARRY昌1。ODO70 CONT工NUE H=1
RETURN80 CONτINUE END
207
一橋大学研究年報 自然科学研究 24
8
83零毒3838傘躍象纈
窒謝零 SUBROUTINE DVD(×〆Y,Z,N,H》
DIVIDE }ζ BV Y (X=Y零Z+X).
E《CH ARRAy ELEMENT OF X, Y’ Z 工SINPUT= X DIV工DE閥D。
Y DIVISOR. 爬 UPPER BOU擁D OF DI凹ENSION OFOUTP口丁; H=O OR 1. 工F V=O, τHEN H=O AND
BE IGNORED, 0τHERW工SE H胃:●
X RESIDUE. Y PRESERVES 工NPUT DATAじ
ZQUOT工ENT一
竃零皐 掌
零
ハNIN了EGER8ετUEENOAND99999999,3 3
窒
零
ADJUSτABLE ARRAVS X, Y, Z■ 累 塞
THE OUTPUT CON了ENTS OF Z SHOUしD 零 零
霧
零
3
SUBROUTINE DVD(X,Y,Z’N,H》
工NTEGER H,」,K,し,岡,N,Pi,PZDOUBLE PRECISION X(1=N),Y(1=N》,Z⊂1=N)ノDユ,D2/S,T,V,W
05
ーユ
DO IO J冒1’N,1 工F(×(」》一NE.0●ODO) GO TO 15
CONTINUEP1冒J
DO 20 」旨1/Nグ1 工F(Y(J》.NE.O.ODO) GO TO 25
20 CONτ工NUE H寵o
RETURN25 H=1 P2=」
IFくP1.GE.P2) THEN DO 35 J=P2ヂN,1 1F(X(J).LT.Y(」)》 τ卜IEN
DO 30 L=1/N,1
Z(L)=0.ODO
50 CONTINUE RETUR国 ELSE 工F(X(」》。Gτ.Y(」)》
GO TO40 END IF
35 CONTINU巳 END IF
THE閥
40 1FくP2.EQ。N》 THEN DO 50 L昌1’P1-1’1 Z(L)=0●ODO
50 CONTINUE T=O、ODO DO 55 L馨P1ノドー1’1 X(L)3X(L)+丁峯1。OD8 Z(し)=DINT(X(L》’V(N))
τ自X(L)一Z(し)累Y(閥》
X(L)=OgODO
55 CONτINUE X(N)謬X(N)+丁塞ユ.OD8
Z(N)=DINT(箕(討)!Y(N》)
×(N)=×(N》一Z(N)零Y(吋》
RETURN END エF
208
FORTRAN77による多数桁整数の演算
D1=Y(P2)+1●ODOD2諄Y(P2)竃1・OD8†y(P2+ユ)+1.ODO
凹=P2-Pl DO 60 J=P1’隠一岡’ユ Y(J》冨Y(」+M)
60 CONT工NUE DO 70 J昌N一岡+1,N,i Y(」)=OgODO
70 CONτINUE DO 80 L=1ノ闘一M臼1’1 Z(L)=O■ODO
80 CONT工NUE
100
110
L冨N-M
P2=Pl
CONT工NUE IF(⊂P2。NE.1》●A酊D●(X(P2一工).NE。0-ODO)》 THEN P1=P2-1
W=×(P2-1》家ユ.OD8÷XくP2)
S=DINT(甘!D1)
V雷X(P2+1)一Y(P2+1)竃S
工F(V・LT-O・ODO》 THE四 丁3DINT(V/1.OD8)一1.ODO V=V一丁*1。OD8
工F(V.EQ.1◎OD8) THEN V=O.ODO T雷丁+1■ODO
END 工F
ELSE
T篇O.ODO END工F S=S+DINτ((V+(回噂V〔P2)累S+T⊃累1。OD8)’D2》
ELSE J=P2
CO國τINUE 工F(X(J).L了DY(」)) THEN
Z(し)=OgODO
60TOユ60 EしSE 工F(X(」)。EQ●Y(」》) τHEN
J轟J+1
工F(」.LE.L) GO TO 1ユO
ENDユF P1=P2
S呂D工NT((X(P2)家工60D8÷XくPZ+1)》1D2》
END IF
120
丁=O.ODODO ユ20 、!罵L,P2グー1
X(J)=X(J)一Y(J)累S+T
IF(X(」).LT。O.ODO) .『HE閥
丁=DINT(X(J,ノ1■OD8》口1。ODO ×(J)=×(J〕一’「累1.OD8
工F(X(J).EQ.1●OD8》 THEN X(J)篇O.ODO
了冨丁+1。ODO
END 工F
ELSE T冨0.ODO
END IF
CONT工NUE工F〔Pユ。NE.P2》 X(P1》=X‘P1》+丁
209
ユ30
i40
150
160
170
一橋大学研究年報 自然科学研究 24
」冨Pl
CONT工N口E 工F(×{」)。LT.Vて」)》TH鮒
Z⊂P冒S
GO TO160 EしSE 工FζX‘」》.Gτ●Y(」)》 τHE閥
Z(L)菖S十1■ODO 了昌O.ODO DO ユ40 K冨Lρ」,一1
xくK)昌x(K》一v(K》一τ
工F(X(K).Lτ.0.ODO》 THEN
X〔K)=X〔K》+ユgOD8
丁置LODO
ELSE
T軍O.ODO
END IF
CON了INUE
GO TO160 END IF J詔」争1
工F(J.LE.L》 GO TO 130
Z(L》=S+1・ODO DO ユ50 」冒P1,L,1 X(L》=OpODO
CONT工NUE
工F⊂L巳EQ.N) RETURN DO 170 」=L/P2ダー{l
Y〔」+1)置Y‘」)
CONT工NUE Y(P2》‘O.ODO L=』壱1
P2謂P2昏1GO TO IOOEND
210
FORTRAN77による多数桁整数の演算
4.円周率πの近似計算
円周率πの近似値を求めることは古くから試みられており,各種の方法
が知られている.よく利用されるものにtaゴ1¢のテイラー級数 一、 。。(一1)㌔融、 (4.1) tan FΣ ¢ 勘一・2乃+1 (9)があり,これを組合せていろいろな公式が作られている.たとえぼ
(生2)丑一44tan-1■+7taゴ・⊥一・2㌻aゴ・⊥+24ねn一・1 4 57 239 682 12943
(C,St6rmer,π=791)
(43)丑_・2ねゴ・主+8tan一ユ⊥_5tan一・⊥ 4 18 57 239
(C.F.Gauss,π=891)
(生4)丑一8tan一・■一tan一・⊥_4tan一・⊥ 4 10 239 515
(S,Klingenstierna,π=893)
(生5)丑_4tan一且⊥_taゴ且』L
4 5 239 (J.Machin,冗=923)
(46)丑_6taゴ・⊥+2taゴ・■+taゴ・⊥
4 8 57 239 (C、St6rmer,π=1046) ㍗
だなどがある.二こでπは一の1000桁までの計算に必要な項数の合計を表 4わし,計算量の一応の目安になる.tan一%のテイラー級数による方法は計
算機で計算しやすLく形でもあり,計算機の発達にともなって非常に高精度
のπの近似値が求められている.(4.6)の公式による10万桁までの計算 (10)についてShanksとWrenchの詳しい報告がある,現在ではスーパーコ
ンビュータを利用した1000万桁までの計算も伝えられているが,このよ
うにπの有効数字を何桁まで求めるかという問題は,実際には計算機の性
能試験という程度の意味しかない.もっとも,良い乱数表が得られるとい (11) (12)う副産物はある.SalaminとBrentはそれぞれ独立に,従来のtan-1劣の
Z11
一橋大学研究年報 自然科学研究 24
テイラー級数による方法と異なる新しいπの高速計算法を考案した・二の
ような新しいアルゴリズムの開発は興味ある二とである。
(4.4)の公式によるプ・グラムを作成したので,それを紹介する。この
公式によるπの計算が三好和憲らにより既に行なわれているが・ここでは
FORTRANコンパイラの最適化機能を試験する二とを主目的とし,5万
桁まで求めた.プ・グラムは本節の末尾に載せてある。
(4.1)での=一を代入すると,定数oに対し む
(生7) ・taバ櫨(、舞轟
り り り ==一一篇十布一閣” ε 3む 5ホとなる.(4。4)式によれば,(o,む)=(32,10),(4,239),(16,515)について
1 1(4。7)を計算すればよい・4tan-1 と・6taゴ1 は次のように計算す
る.まず,2個の大きさπ+1の1次元の倍精度実数型配列A(0:N)・
Y(0;N)を用意する.各配列要素は10桁以内の非負整数を表わすことに
する.先頭の配列要素A(o),Y(o)は小数点より上の数値を表示するため
に使う.したがって,配列A・Yは小数点以下10π桁までの数値を表わす
りことができる・計算の途中でA・Yはそれぞれ評τおよぴ
r (一1)㌔ S(γ)=蕊(2冷+、)哲2κ+・
の値の小数点以下10箆桁までを記憶している・第丁十1部分和S(7)の各
項は小数点以下10π桁まで正しい値を計算するが,S(7)は最後の数桁が
ひ のア正確に計算されないことに注意する.α。=押とおくと,α。+1=7である
から,次々にε2で割ることによりα・が求められる・αrは7が増加するに
したがって0に近づくので,α.を記憶する配列Aの配列要素の中で値が0
のものが,計算を進めるうちに増えてくる。計算の無駄を避けるため,A
の配列要素の中で最初に値が0でないものを調ぺ,その添字の値を変数M
212
FORTRAN77による多数桁整数の演算
で表わすことにする.手順は以下の通りである.
(1)配列要素A(0)にoを代入し,A(1)からA(N)までにはOを代
入する.鵠=0と初期化しておく.
(2) (1)のAの値をεで割る.この商がαoである.結果をAに記憶
させる.この操作はサブルーチンDIVで行う.配列Yにαoを記
憶させる.
σ2。および第2γ+1部分和S(2γ)が計算できていて,値がそれぞれ配列
A,Yに記憶されているとする.
(3) サブルーチンDIVによりα2.を♂で割ってα2,+1を求め,Aに
記憶させる.ここでMの値吼が1だけ増加する可能性がある.肌
〉πであれぱ,α2r月=0だからこれで計算を終了する.
(4)サブルーチンDVDSTRにより,Yの値から,α2アqを27十1で
割ったときの商を引き,結果をYに記憶させる.27+1は,プ・グ
ラムでは変数Hで表わされている.このときのYの値がS(27十1)
である.
(5) (3)と同じ操作でα2.+2を求め,Aに記憶させる.鵠>πなら
¢27+2=Oだから計算を終了する.
(6) サブルーチンDVDADDにより,Yの値に,α2.+2を27十2で割
ったときの商を加え,結果をYに記憶させる.この値がS(27+2)
である.
(3)から(6)までの操作を㎜>πとなるまで繰返せぱよい.
_11 32tan一も同様に計算するのであるが,侮を求めるとき,すなわち 10オ2=100で割るとき,桁移動を考慮するだけで除算を実行する必要がない (13) 一一1点が前のものと異なる。このため,32tan一の計算は,上記の操作と比 10較して,半分程度の手間でできる.εが大きいほど(4.7)の級数の収束は
速く,計算項数が少なくてすむ.公式(4.4)ではε=10の揚合が一番多
213
一橋大学研究年報 自然科学研究 24
くの項を計算しなければならないから,ここでの計算量が減らせることの
効果は大きい.ShanksとWrenchの公式(4。6)による計算では,2進法
で実行されており,同様にして24tan-1主の計算量を半減する工夫がなさ
8れ,ている.
なお,サブルーチンDVDADDでは除算と加算を一度に行う・除算は
配列の添字を小さい方から1ずつ増加させて行い,加算は添字を大きい方
から1ずつ減少させて行うのが普通であるが,ここでは桁上がりに注意し
て,加算も添字を小さい方から1ずつ増加させて行うようにしてある・除
算と加算を別々に分けて行うのにくらぺて,余分な作業領域を必要としな
い点およびDOループをひとつにまとめられる点が有利である。サブル
ーチンDVDSTRでも同様に,桁下がりに注意して除算と減算を一度に
実行するようにしてある.
前にも述ぺたように,級数の各項は小数点以下10π桁まで正確に計算
しているが,それらを合わせた部分和S(7)の最後の数桁は,桁上がり,
桁下がりの影響を無視して計算しているため正しくない・計算で求めるπ
の近似値の小数点以下の有効数字は,プログラム中で定数名NEFFが表
わす定数の10倍である.安全のため,πは定数NEFFより2だけ大き
い値にして,20桁余分に計算している.
πの近似値の計算で必要なのは,多数桁数の加算,減算,除算であるが,
特に除算では除数があまり大きい桁の数ではなく,ひとつの変数に記憶で
きるので容易である.序文にあるように,ここでは倍精度実数型変数の精
度が10進16桁程度の計算機を想定している.除数が6桁以内の除算しか
行わないので,倍精度実数型の配列の各配列要素に10桁までの数を記憶
できるのである.公式(4.4)は二の意味でも大変都合がよい.各配列要
素が10桁の数を表わすようにしておくと,結果の印刷のときにも便利で
ある.
214
FORTRAN77による多数桁整数の演算
FORTRANコンパイラの最適化機能は,原始プ・グラムの翻訳時に作
用し,効率のよい目的プ・グラムを生成するもので,非常に大切な機能で
ある。FACOM OS IV/F4FORTRAN77コンバイラでは,0,1,2,3の四
つのレベルが提供され’ている.本節末尾のプ・グラムでNEFFの値を
100,1000,5000としたものを,それぞれ最適化レベル0,1,2,3で実行した
ので,それらの翻訳(コンパイル),編集(リンケージ),実行に要した
表1
0 0 0
0 0 0
レ ー 0 0
ノ
さ
ぺ )
レ訳集行卜
化 F
適 E
最翻編実α
0
0.76
0.52
2.26
201.93
1
0.79
0.53
1.98
175,71
2
1。35
0.49
1.71
149.58
3 1,46
0,52
1.67
146.92
3668.30
1CPU時間を表1にまとめておく.単位は秒で一秒まで書いてある. 100NEFFの値100,1000,5000は,それ,ぞれπの近似値を小数点以下1000桁,
1万桁,5万桁計算することを意味する.NEFF=5000の場合は最適化レ
ペルは3のみで実行した.翻訳,編集のCPU時間はすぺてNEFF=100
の揚合のものである.NEFFの値が異なってもこれらに影響しないはず
であるが,実測値は少し変化した.たとえばNEFF鷲1000で最適化レベ
ル0のとき,翻訳,編集のCPU時間はそれぞれ0.77秒,0.54秒であった.
同じくNEFF=1000で最適化レベル2のときはそれぞれ1.34秒と0.52秒
であった・同一のプログラムでも何回か実行させると,出力されるCPU
時間が多少違うので,表1もあまり厳密に見るわけにはいかないが,最適
化レベルが上がるにしたがって翻訳時間が長くなり,実行時間が短くなる
様子がよくわかる.最適化レベル2と3ではあまり差がないこともわかる.
プ・グラムによって最適化機能の効果がどのように変化するかを見るた
めに,マチンの公式(4.5)を使い少しずつ異なる三種類のプログラムを
215
一橋大学研究年報 自然科学研究 24
作成した.それらのプログラムを仮にA,B,Cとする.マチンの公式で
は16tan一:主と4tan一Lとの値を計算しなけれぱならない,プログラムB
5 239 1では,二れらの計算は公式(4.4)による上述のプログラムの4tan-1- 239と16taゴ1』Lの値の計算と同じにしてある.16taゴ1⊥を求めたあと, 515 5 1その値を他の配列に移し,次に4taゴ1一を求め,引き算をするという方 239法で計算する.プログラムCでは,サブルーチンDVDADD,DVDSTR
を使わずに,それぞれ除算のサブルーチンDIVと加算のサプルーチン,
DIVと減算のサブルーチンに分割する.二のため除算のあと,加算ある
いは減算のサブルーチンを引用する前に,DIVから戻される値を他の配
列に移す手間がかかる.そのほかはプログラムBと同じである.プログ
_11ラムAは,otan一を計算する部分をひとつのサブルーチンARCTMに オまとめた点と,・6tan-1主ヵ、ら4tan-1⊥を引く計算を主プ。グラムで行
5 239う点が他のプ・グラムと異なる.参考のためARCTMのリストを最後に
載せておく.三種類のプ・グラムで,NEFFの値を100,1000としたもの
を最適化レペルOと3で実行した.翻訳,編集,実行に要したCPU時間 1を表2にまとめてある.単位は秒で一秒まで書いてある.全体のステッ 100プ数(印刷のサブルーチンも含めて)は,プログラムAが149,Bが160,
表2
ムル 0000
ラペ ー10
グ臣訳集行
・遡
プ最翻編実
A O 3 0.56 1.04
0,49 0.48
2。49 2.06
223.44 184.66
B C O 3 0 3 0.64 1.18 0,59 1,07
0.50 0,49 0.51 0。52
2.61 1。92 3。31 2.02
231.85 170.20 305。25 179.27
Cが151である.なお前記の公式(4.4)によるプログラムは222ステッ
プである,総計算量はプ・グラムAが一番少なく・次に少ないのがB,一
番多いのがCである,ARCTMは少ない計算量で。taゴ・⊥を計算するよ む
216
FORTRAN77による多数桁整数の演算
うに作られている.また,プログラムAでは,ある配列に記憶され’ている
値を他の配列に移す操作がないのも計算量を少なくする要因になっている.
副プログラムの引用もARCTMが2回と印刷のサブルーチン1回だけで のある.最適化レペルが0のときは局所的な最適化の一部が行われるだけで,
実行時間はちょうど計算量の順になっている,また,翻訳時間もたまたま
ステップ数の順になっている.しかし最適化処理が最も強力なレペル3で
は,プ・グラムBの翻訳時間が最も長く,実行時間は短い.最適化レペ
ル0と3との実行時間の差はプログラムCが最も大きい,表2から,ひと
つのプ・グラム単位を長くせずに,いくつかのサブルーチンに分解した方
が最適化機能が働きやすいと予想される.また,サブルーチンARCTM
では文番号30の文を端末文とするDOループが前のプ・グラムのDIV
とDVDSTRを合わせた処理をし,文番号50の文を端末文とするDOル
ープがDIVとDVDADDを合わせた処理をするのであるが,これらを
それぞれ2個のDOループに分解して処理を分けると,それだけでわず
かではあるが最適化の効果が違ってくる.プ・グラムAに二の変更を行
ったものを,NEFF謬1000として最適化レベル3で実行すると,翻訳,実
行に要するCPU時間はそれぞれ1。14秒,180,12秒であった,
ここでの例のように大きい配列を使う場合には,仮想記憶方式によるメ
モリー管理との関係などの複雑な要因があり,最適化機能を有効に活用す
るのは容易ではない.
217
一橋大学研究年報 自然科学研究 24
縮累富
8
ユ0
CAL肌ATIONOFTHE榔岡BERPIBVKLINGENS了工ER朋・SFOR剛LA Pエノ4=8竃《RCTANく!ノ10〕一ARC了AN(1/239⊃一4零ARCτA閥(ユ’5工5》
(REMARK3 吋 MUSτ BE EVEN》
工NTEGER 四’睡EFF,1’L,凹
PARA岡ETER (NEFF31000,N8NEFF+2》DOUBLE PREC工SION A(03吋寺1》ρX(O=N),Y(O=N),H
COMPUTE 32塞ARCTAN〔ユノ10》AくO》富3■ODOAく1)=~.ODg
XくO)=3-ODOX(1》昌2-ODgDO 10 工32,閥,1
Aく1)昌0.ODO X(1》=O。ODOCONTINUEH昌3、ODO
2’暦承5’2 5
属 零
工5M-
!『十
〇工IM
2=塁霧MLh
OD
工F(L●EQ巳ユ》 THE”
A(M-1)=3曹ODO
A(M)=2-ODg M=阿一1
ELSE 工F(し●EQ.2》 THEN Aく岡ロ1)=O.ODO
A(凹)=32。OD7
ELSE IF(LgEQ。3》 τHEN A(M》332。OD5 ELSE 工F(L.EQ,4) 了HEN
A(M》=32.OD3 ELSε 岡胃M-1
A(凹)=32。ODlEND 工FCALL DVDSτR(X,A,N■Hノ髄》
H富H十2・ODO
IF(L-EQ.1) THEN A(団)冨0。ODO
A(M+1》=32,0D7 凹專M+1
ELSE 工F(し●EQ・2》 THEN A(岡)=32匿OD5
ELSE IF(L.EQ畳3, τHEN A(岡》富32.OD3
ELSE IF(L.EQ.4} τHEN
A(凹)=32。ODl
ELSE A(岡》23。ODO
A(門手1》=2・ODg
END IF
CALL DVDADDくX,A,N〆H,M) H2H+2.ODO20 CONT工NUε
218
9象象
FORTRAN77による多数桁整数の演算
霧 COMPUτE 4竃ARCTANζ1/239, A(O》冒4・ODO
DO 30 1=1,N,1 A(1》謬0.ODO
30 CONT工NUE M=O
CALL D工V{A7N,239●ODO,M》 CALL SBSTく》,A,N》 H=3.ODO
DO 40 1昌ユノ4累N,1
CALし D工V(A,N,5712ユ・ODO,岡》
IF(M■6τ.N) GO TO 50
CALL DVDSTR(Y,A,N,Hノ凹》 H3H←2-ODO
CAしL D工V(A,閥,57121。ODO,凹》 工F(凹●GT畠~》 60 「「0 50
CAしL DVDADDくY,A,吋,H,凹》
H=Hか2喝ODO
40 CONT工NUE
零 X352象ARCTAN(1/10》卿48ARCTAN(1!239}
50 CALし SB(X,Y,N》
激 COMPUTE 16寮ARCτANく1/515,
AくO》=16。ODO DO 60 工罵1/N,1
A(工》昌O”ODO
60 CO国1「工NUE 凹冒o
CALL DIV(A,N’515gODOグN》 CALL SBST(Y,A,N) 賢冨3.ODO
DO 70 工=1ク4零閥ノ1
CALL DIVくA,N,265225●ODO,岡⊃ IF(岡.Gτ。N》 G口 τ0 80
CALL DVDSTRくY,A,N,Hρ阿》 H認H+2。ODO
CALL D工V(AグNρ265225●ODO,凹》 IF(凹。GT●麗) GO TO 80
CALL DVDADDくY,A♂N,H’M》 H躍H+2畳ODO
70 CONTINUE
諏 X胃32象ARCTA腫く1’10》一4窒ARCTANζ1/2:39》働16零ARCTANく1’515》
80 CALL SB(XグY,N》
竃 PRIN了 RESりLT
CALL PRNτ10くX,N/NEFF》
END
219
一橋大学研究年報 自然科学研究 24
謝88
麟寮 SUBROUnNESBく×,V’N》 ”零 X冨X甲Y
SUBROUT:NE SB(X/Y,閥》
1国↑EGER JクN DOU巳LEPRECエSION×(O=N》’Y(0:N》’H
H冒O.ODO DOIOJ言N’O’一1 X(」》痙X(J》一Y(」》pH
IF(X(J》.LT.O.ODO)TH“ X(J)冒X(」)+1●ODIO
H昌1.ODO
ELSE HコO。ODO
END IF・10 CONτINUE
END
窒家累
家累零 SUBROUTINE DVDADDくX」Y,N,T,M) 粟富窟 X冨X+Yノτ
SUBROUT工既DVDADDく×ノY州汀・m
INTEGER J,K,L,凹,N DOUBLEPRECISIONX(O:N)・YくO:N》’T《QグRノ)
R雷O.ODO DO 20 」3岡,N,1
V昌Y(」)+R家1.ODIO
Q=D工NT(V1丁》
R昌V-Q累τ
Xく」)=X(J)+Q
工F(Xく」》.G巨.1■OD10》 THEN
Xく」)=X(」》一1。ODIO
L冒J-1
X(L)冒X(L)+1●ODO
エFくX(P.εQ.1.ODIO)τH印
X(L》冨O.ODO DO IO K冨」一2’O’一1 エF(XくK).EQ.999999999.ODO》THE腫
×くK)=O.ODO
ELSE X(K)5X(K)+1.ODO
GO TO20
END 工F
lO CO腫τ工NUE END 工F
E閥D 工F
20 CONτ工NUE END
220
FORTRAN77による多数桁整数の演算
零
家8
窒累零 SUBROU了1閥E DVDSTRζX/Y/N,T,凹)
X含X-Yπ
累零掌
SUBROUT工NE DVDSTRくX,Y,国,T,M》
INTEGER J,K,L,M,NDOUBLEPRECエSエO閥XくO=N》’》(O=N》’T’Q’R’V
R昌0.ODO DO 20 J=岡,N,1
V=Y(」)+R累1.ODIO
Q冨D工Nτ〔V/T》
R=V-QまT ×(」》=X(」)一Q
工F(X(J).Lτ.O.ODO》 YHEN X(J)属×(」》+1.ODIO
し冨」一1
Xくし〕=X(L)一1-ODO
工F(X(L).EQ。一1.ODO) THE艮
X(L》=999999999.ODO DO IO K=J-2,0,一1
1F(X(K).EQ.0.ODO》 τHE絶
X(K)=999999999■ODO
ELSE X(K)軍X(K)一1.ODO
GO TO 20
END 工F
10 CONT工NUE END 工F
END 工F
20 CONT工NUE E鯉D
竃竃窒
累家零 SUBROUT工NE DIVく×’N,T’FD x曙’τ
家*窪
SUBROUTINE D工V(X,卜1,τ,M》
INTEGER J,国,NDOUBLE PRECIS工ON X(O:N》,T■R,V
R=O.ODO DO 10 J=岡,N,1 V冨X(J)÷R家1,0DユO
X(」)=DINT(V’T》 R富V-X(J》家丁
!O CONT工NUE IFくX(M).EQ.O.ODO》
END
凹=M+1
221
一橋大学研究年報 自然科学研究 24
纈3錦
家*禦 S口BROUT工NE SBS↑ζ罵’V’N》 蹴家鴬
x昌Y
SUBROUT工夢1ε SBST{X’V’閥}
工N1「EGER J,N DOUBLE PRεC工S工ON Xく03N》,YCO3閥,
DO IO J置0/N,1 xく」》冒v(」》
ユO CONT工NUE END
露纈
雰宰* SU日ROUTI吋E PRNTIOζXク闘,NEFF} 塞竃9
S口BROUτ工NE PRNT工0【X,N,NEFF》
1NTEGER F’工’」’N’NEFF,P’K1’K2’K5ダK4’K5♂K6,K7,K8,LU歌OO》DOUBLE PREC工S工ON X(O=N》
F2ユO掌闘EFF苧1 WRITE(6,100) Fユ00 FORMAτ(,1軍ノノノ” 曾,14×’,象寓零家竃 THE NU岡BER P工3,,工7’曾 F:GURES (THE RAT
畦OOFτHECエRCU凹FERENCEOFτHEC工RCしETOTHED工鮒ETER》 燃塞帥1〃》
WR工TEく6,200》 INTく×(O))200 FOR門AT(腰 『,2X,,PI=冒,1ユグ量・7)
DO 2D I雷1/NEFF-9ヂ10 DO 10 J=エノ1+9
P縮10零(」一1》
L(P÷1》=INT(X(」)ノ1gOD9》 K1=INT(X(」)一DBLE(L(P÷1》》掌1●OD9)
L{P÷2)鵠K1!100000000 κ~=K1-L(P+2)零100000000
L(P+3)謬K2110000000 K3=K2-L(P+3)竃10000000 L(P+4)=K3/1000000 K4冒K3-L(P+4)竃1000000 L(P+5》=K41100000 K5=K4-L(P+5)累100000
L(P←6)=K5!10000 K6冒K5-L(P+6)零10000 L(P+7》昌K6!ユOOO
K7=K6曹LくPウ7)寧1000 L(Pや8)=K7/100 K8=K7-L(P+8)竃ユOO
L(P←9)=K8!10 L(P+10)=K8一し〔P+9》宰10
10 CONTINUE
IF(エ.EQ.1) THE闘
ASSIGN 300 TO F ELSE IF(MOD(1グ500》,EQ●1》 ASSIGN 301 TO F ELSE IF(MODく1,100).EQ.1) ASS工GN 302 τO F EしSE
ASSIGN 303 τO F
THE闘
THE吋
ノ
222
FORTRAN77による多数桁整数の演算
END IF WRITE〔6,F》 くL(3》,』1=1,100》
20 CONTINUE
300
301302305
FORMAT(電+『,7×4ZO(5工1,1 1》)
FOR岡AT(電i,ノ1!ノノノ彫 ,ノ7X,20(511グ量 豊》》
FOR卜1AT(曹O『,7X/20(511グ1 ,》》
FOR岡ATく, 9,7X,20(5工1,0 冒)》
E閥D
8率零累家累累寡
象窟臨 SUBROUT:NE ARCT凹(AρX,N,T》 家竃3
COMPUTE C翠ARCτAN(1!丁)ノWHERECISACONSTANT.EACHARRAYEしEMENTOFA’XエSANエNTEGERBETWEENOAゆ9999999999.
INPUT=
A THEFエRSTTER岡OFTAYLORSERIESOF C家ARCTA阿(1/T). N UPPERBO開DOFDエMENSエONOFADJロSTABLEARRAYSA,X.DUTPUT言 X C累ARCTAN(1/T》.
霜竃摺家累*塞掌
SUBROUT工国E ARCT岡くA,×,N,T》
INTEGER Iヂ」,K/M,”
DDUBLEPRECエSIONA(0=N)’X(O=N》,ルQ,R,Sバ,V,冒
DO 10 」器O,N,1 x(」)=A(」)
ユO CO闘TINUE τ=丁累T
M冨O
H=5.ODO
DO IOO I冨1/N竃10,1
R冒0。ODO V=0,0DO DO 30 J=岡,N/1 S=R*1・ODユO÷A(」》 A(J)冨D工NT(S’T》
R=S-A(J)家丁
W=V零1・ODユ0+Aく」,
Q=D工NT(W!H)V=田一Q*H
X(J》=X(」)一Q
IF(X(」》,L了.O.ODO, THEN
X(J》胃X(」)+1曹ODIO
X(J-1》=X(」一1)。190DO
IF(X(」一1)。EQ,一1.ODO)THEN XζJ-1)冒999999999。ODO K冨J-220 CONTI~UE
工F〔X(K》.EQ.0.ODO) THEN
X{K〕=999999999.ODO ELSE
X(K)=×てK)。工。ODO
GO TO30
223
30
40
50
100
一橋大学研究年報 自然科学研究 24
END IF K胃K-1
工F(K.GE.O) GO TO 20
END 工F
END IFCONTINUEエF(A(岡).EQ.0、ODO)N堀UIF(M.GT.N)RETURNH謬H+2.ODO
R昌O.ODOV=0.ODODO 50 」=M,N,1
S=R*1.ODIO+A(」》
A(」)gDINT(SIT》 R冒S-A(J)家T
W冒V寧1.ODIO+Aく」》
Q置DINT(U/H》
V=W-Q*H
×(」)=X(J)十Q
エF(×(」〕.G巳.1.ODIO》THEN
X(J)コ×(J)一1.ODIO X(J-1)器X(J-1》+1,0DO エF(X(J-1).EQ.1。ODIO)TH巳N
X(J-1)=O■ODO K3」一2
CONT工NUE エFくXくK》.EQ.999999999・ODO》THEN X(K)=O.ODO
ELSE X(K)=XくK》十1・ODO
GO TO 50
END 工F
K=K輯1 エF(K.GE.O》GOτ040
END 工F
END 工F
CONT工NUE エF(A(凹》.EQ.O,ODO)M=凹+1
エFくM.GT.N)RETURN H=H千2.ODO
CONT工NUEEND
224
FORTRAN77による多数桁整数の演算
注と参考文献
(1)佐々木建昭,砿Vo乙12,No、4,4-121No.5,76-861No,6,53-61(1981)
に数式処理全般にわたる詳細な解説がある.伊理正夫編,数と式と文の処理,
岩波講座情報科学,23,1981では数式処理と関連する分野について解説してい
る・また・具体的な間題に対する数式処理の例として,たとえば渡辺隼郎,常
微分方程式の数式処理・教育出版,1974がある・数理科学1983年8月号に数
式処理のいろいろな分野での応用例がある.
(2)金田康正,肱VoJ,13,No,4,4-12(1982)にMACSYMA,REDUCE,
μMATHなどの代表的な数式処理システムの紹介がある.MACSYMAにっい
て詳しいことはたとえば∫~.」風1勉π鳳Co卿ρ%’即イ佐帥紹伽イ4ρρ々84ハ4薦hβ一
卿媚05,オπ1卿o伽めo短oハ4ヨCsyハ姻,Pitman.
(3)電子計算機プ・グラム言語FoRTRAN Jls C6201-1982,日本規格協会.
(4)マニュァルFACOM OS IV!F4FORTRAN77使用手引書.
(5) これは汎用コンピュータにっいていえることで,たとえばマイクロコンピュ
ータでは浮動小数点演算はソフトウェァで行うのが普通である。その揚合,浮
動小数点演算用のプ・セッサは別に用意されていることもある.
(6) もちろんこれは∫=4の仮定のもとでいえることで,∫の値を4以外にする
とすれぱ,ここでの議論で9999を10∫一1,10000を10∫にかえる必要がある.
(7)高貫隆司,FORTRANコンパイラにおける最適化処理,情報処理,24(1983),
624-632などに最適化機能の解説がある・ここではマニュアルFACOM OS
Iv1F4FoRTRAN77使用手引書を参考にする・ループは最適化の最も重要
な対象のひとつであるが・ループがいくっか重なっている揚合,一番内側のル
ープに対して最適化機能が強く働くとか,ループ内よりもループ外の方が実行
頻度が低いと仮定して最適化をしているため,ループ内に実行される可能性の
非常に低い部分があると都合が悪いなどの問題もある.FORTRANコンパイ
ラはプ・グラム単位ごとに分割コンパイルするため,副プ・グラムを引用する
かわりに引用箇所で展開すると,全体としての最適化が行われる可能性もある
が・逆に実行頻度の高くない部分で引用されている副プ・グラムをその揚所で
展開すると,プ・グラムが複雑になったり長くなるという最適化にとって悪い
要因も出てくる・最適化機能がどの程度働くかは,プログラムを翻訳・実行さ
225
一橋大学研究年報 自然科学研究 24
せてみないとわからない.第4節で最適化機能について触れる・
(8)マニュァルFACOM Mシリーズハードゥェァ機能説明書1(命令編)・
(9)金田康正,協,Vo乙14,No.10(1982),102-109と高野喜久雄,δづ!,Vo乙15,
No・4(1983),83-91に多数の公式がある・
(10)D。5加励εα嘱/。w.凹1櫛6瓦/アリCα勧」戯o雑q〆π’0100’ooO Dθ6加儒・
M¢’h.Co吻、ρ16(1962),76-99・
(11) E.5α」α挽伽、Co辮♪%如κo雑4πU5伽811γ露勧¢θ躍σ一σ80魏θ∫擁oハ48朋。ハ4α’ゐ・
Co吻.ρ30(1976),565-570・
(12)R.P.Bγθ瓢Fα5∫M駕〃fρ」θ一P繍5づ・ηE槻」剛∫oπげE’8甥8吻7ツF㈱伽ε・
J,AcM,23(1976),242-251.
(13) 10進法で考えているため,100で割ることは2桁右に桁移動することと同じ
である.なお,ここで技術的な問題から配列Aの大きさをπ+2にしておく・
また,πは偶数でないと配列要素A(N)の値が正しくなくなる。
(14)マニュァルFACoM os Iv1F4FoRTRAN77使用手引書,第8章プログ
ラムの最適化・
226