69
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

FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 2: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

FORTRAN77による多数桁整数の演算

山 田裕理

1.序

 計算機による計算といえば,数値計算を意味するのが普通であるが,一

方で数式をそのままの形で計算機で処理する,いわゆる数式処理も,近年         (1)ようやく普及し始めてきた.いまだに利用者はそれほど多くないが,汎用

                (2)の数式処理システムがいくつか稼動しており,それちは一般に次のような

ことができる.整数係数の多変数多項式の展開,共通項のくくり出しなど

の整理,最大公約数の計算,Z上の因数分解等の処理,有理関数の展開・

整理,変数に数値や数式を代入すること,初等関数の微分,極限の計算,

丁鰐Joγ展開,初等関数の不定積分,定積分,数式を成分とする行列,行

列式の計算,特殊関数の扱い,微分方程式の解を求めること.今のところ

基本的なものとはいえ,このように数学で通常出会う形の計算を対象とす

る数式処理は応用の可能性がきわめて大きい.数値計算において必要な計

算は単純で計算機の中央処理装置(CPU)の機能と整合性があり,プ・

グラムもFORTRANで簡潔に書ける揚合が多い.もともと電子計算機

が数値計算を行うために作られたものであるから,このことは当然であろ

う。ところが数式処理では事情が大きく異なる.数値計算で扱うデータの

型は整数型,実数型,複素数型ぐらいであるが,上の例からわかるように,

             159

Page 3: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 24

数式処理では多様な形のデータを扱わなけれぱならない.また,計算の途

中や最終結果を前もって予測できないことが多い・このため,汎用の数式

処理システムの記述には,FORTRANのような静的な言語ではなく,

LISP系の言語が使われている.さらに,問題を解くアルゴリズムにして

も,一般的なものが存在しない場合も多いし,存在するとしても効率の良

い現実的なものを見つけるのは容易ではない.アルゴリズムの面およびハ

ードウェアの面から現在活発に研究されており,今後の発展が大いに期待

される.

 数式処理システムのもっとも基本的な機能のひとつとして,多数桁(多

倍長)整数演算,高精度浮動小数点演算がある.実際,多くの数式処理シ

ステムはこの機能を備えている.たとえば,多項式や有理式の計算の途中

で係数が非常に大きい桁の数になる可能性がある。このような可能性はそ

れほど大きいわけではないが,数式処理では数値計算のように近似値を求

めるのではないから,いくら大きい桁の数でもそれ’を正確に扱えなければ

ならないのである.計算機のCPUで行われる四則演算には固定小数点演

算と浮動小数点演算があり,扱うデータの長さはどちらも一定である・

FORTRANでもこれを反映して,演算で扱うデータの型が定まっている.

整数演算は整数型データに対する四則演算であり,CPUにおいて固定小

数点演算として実行される,整数型データは1数値記憶単位を占め,これ

は汎用レジスタの容量1語(word)に等しい.実数演算は実数型データお

よび倍精度実数型データの四則演算で,CPUにおいて浮動小数点演算と

して実行される.実数型データは1数値記憶単位,倍精度実数型データは

2数値記憶単位を占める.なお浮動小数点レジスタの容量は2語である・

このように,扱える数値の精度は型により決まっている・したがって・非

常に大きい桁の数の四則演算を正確に行うためには特別な方法が必要であ

る.

               160

Page 4: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

       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

Page 5: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 6: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 7: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 8: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 9: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 10: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        FORTRAN77による多数桁整数の演算

うにいくつかの段階から成り立っている.このため浮動小数点演算は固定

小数点演算より時間がかかる,また実数型あるいは倍精度実数型で割り算

を行うと,整数の除算の形にするために小数点以下の切り捨てというよけ

いな手間がかかる・以上の事情から,配列X,Yの型は整数型で∫=4とす

るかまたは倍精度実数型で∫=8とするかのどちらかが適当であることが

わかる,整数データは1数値記憶単位(numeric storage unit)を占め,

倍精度実数データは2数値記憶単位を占めるので,どちらにしても必要と

する記憶領域は変わらない.したがってこのふたつのうちどちらがより良

いかの選択は,使用する処理系の固定小数点演算と浮動小数点演算の演算

速度の比に依存することになる.

 ここでは,X,Yを整数型の配列とし∫=4としてプ・グラムを作成した.

この揚合がやはり基本であろう.なお第3節で倍精度実数型の配列を使い

∫=8とした揚合の非負の多数桁整数の減算,乗算,除算のプ・グラムを

紹介する.

 プ・グラム全文のリストは本節の末尾に記載してある.全体は11個の

プログラム単位から構成されている.補助的な副プログラムが3個,加算,

減算,乗算,除算の副プ・グラムがひとつずつ,除算の補助をする副プロ

グラムがひとつの合計8個で四則演算を行う.他の3個は演算すぺき多数

桁整数のデータを入力する際に使用するもの,演算の結果を印刷するため

のもの,および主プ・グラムである。多数桁整数の符号はすべて主プ・グ

ラムで処理し,四則演算の副プ・グラムはすぺて非負の多数桁整数だけを

対象にする。入カデータは符号つきの多数桁整数を,必要ならば先頭に符

号+,一または空白をひとつ置きその後に続けてOから9までの数字を適

当な数だけ並ぺた形で表現し,文字列として扱われる.先頭の空白は符号

の+と同じ意味に解釈する.また先頭から数字が始まる場合,符号は正と

解釈する.主プ・グラムは10個の副プ・グラムの使い方を示す例にすぎ

              167

Page 11: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 12: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 13: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 14: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 15: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

          一橋大学研究年報 自然科学研究 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

Page 16: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 17: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 18: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 19: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 20: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         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

Page 21: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 22: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 23: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 24: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         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

Page 25: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 26: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         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

Page 27: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 蟄

ここで乃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

Page 28: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 29: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 30: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 31: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

     一橋大学研究年報 自然科学研究 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

Page 32: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 33: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 24

法で表示したときの数字の列をCRに先頭から代入していく.こうして

CRに代入された文字列を出力すればよい.整数値から文字列への変換に

は内部ファイルを利用する.なおこのほかにも,たとえば大きさ80の1

次元の整数型配列を用意し,多数桁整数の先頭から順に1桁ずつ取り出し

て,各配列要素に1桁の整数値として代入し,それを出力することも考え

られる.この方が内部ファイルを使うより実行速度は速い.扱う整数の桁

数を変えるとき,このサブルーチンだけは修正する必要がある.

 最後に,これまでに紹介した副プ・グラムを利用して,与えられた2個

の多数桁整数に対し和,差,積,商,余りを計算し,結果を出力する主プ

・グラムを載せておく.主プ・グラムで符号を処理するので,多少手数が

かかる.多数桁整数のデータは,まず文字列として文字変数Cに読込み,

さらにサブルーチンTRANS1で配列に記憶させ,そのあとで演算を行う.

ここでは80桁以内の整数を扱う.前にも述ぺたように,桁数を変えるに

は,主プ・グラムのPARAMETER文でNの値を変更すること,およ

ぴサブルーチンPRNTを修正する二とが必要である.

190

Page 34: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 35: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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       

Page 36: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 37: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 38: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 39: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 40: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 41: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 42: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 43: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 44: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 45: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 46: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 47: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 48: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        FORTRAN77による多数桁整数の演算

特に,DOループの内部など実行頻度の高い箇所での副プ・グラムの引用

は,一般に避ける方が良い.さらに,副プログラムを引用する揚所によっ

ては,周囲の事情を考慮しながらそこで展開することにより,計算のむだ

を大幅に減らすことができる.たとえば,サブルーチンDVDにおいて,

INDCを引用する代わりにその揚で展開している箇所では,制御変数の値

の動く範囲は,INDCの中で動く範囲よりずっと小さい,

 FORTRANコンパイラでは,原始プログラムに対して強力な最適化が

行われるのが普通である.効率を高めるためには,最適化機能がうまく作

               (7)用するように考慮することも大切である・

 多数桁整数の四則演算のように基本的なものは,実行速度が非常に重要

である.繰返し使われる可能性が大きいからである.実行速度を考えると,

やはりアセンプラによりプ・グラムを作成するのが望ましい.この揚合,

                    (8)アセンブラを使う大きな利点として次のことがある,固定小数点演算命令

でも浮動小数点演算命令でも,乗算では演算結果の置かれる記憶領域は,

被乗数と乗数の記憶領域の2倍である.また,除算では被除数の占める記

憶領域は除数のそれの2倍である.このため,多数桁整数を一定の桁ずつ

区切って,いくつかの番地に分けて記憶させるとき,ほぼ記憶揚所の精度

いっぱいに詰め込むことができる.すなわち,FORTRAN77によるプ・

グラムで各配列要素に記憶させている数値の2倍以上の桁数の数値をひと

つの番地に記憶させることができ,それだけ全体の計算量を減らせる。

桁上がり,桁下がりの処理もアセンブラなら容易である.また,FORT・

RAN77による除算では,商と余りを別々に求めなければならないが,

固定小数点演算命令の除算では,商と余りがともに保存されるため,1回

の計算で求められる.

205

Page 49: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

零 

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富■睾

Page 50: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 51: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 52: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 53: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

ユ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

Page 54: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 55: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 56: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 57: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 58: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

        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

Page 59: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

         一橋大学研究年報 自然科学研究 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

Page 60: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 61: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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象象

Page 62: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 63: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 64: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 65: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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

Page 66: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 67: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 68: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

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

Page 69: FORTRAN 77による多数桁整数の演算 URL Right · 2018-11-07 · 以外は6≒0のときと同じにすれぱ,配列xは10∫進法でん桁の数 のη一刷¢励+2・吻η,婦刷≒0

一橋大学研究年報 自然科学研究 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