プログラミング演習 II
2003
年
11月
12日(第
5回)
木村巌
今日やること
負の整数を考慮した、加減算の実装
復習
前回は、符号を表す桁を設けて、正負 の整数を表せるようにした
データ型の実装の詳細を隠蔽するため
、各桁、符号などを設定したり、読み
出したりするための関数を用意した
Mpi (Multiple Precision Integer)の間の
等号、不等号などを用意した
整数の加算
自然数の加算は前々回に実装した
整数の加算
a+bを、引数の符号を考慮 して整理する
a ==0 || b ==0: 演算は必要ない
a>0&&b>0: 自然数同士の加算
a>0&&b<0: a + b = a – (-b): 減算に帰着
a<0&&b>0: 演算の順序を変えて上に帰着
a<0&&b<0: a+b=-((-a)+(-b)): 自然数の和と
、符号の反転に帰着
整数の加算(続き)
つまり、整数の加算を実装するには、
整数の符号の反転と、減算とが必須 符号の反転……
元の mpi の符号を反転する: mpi_negate ()
元の mpi と同じ絶対値を持ち、符号のみ 異なる mpi を新たに作る : mpi_inverse()
どちらも必要となる
整数の加算: mpi_add()
整数の加算を行う関数:
long *mpi_add (long *, long *)この関数は、符号を考慮して、自然数 の加減算、符号の反転へ、適切に帰着 させる関数
実際に自然数の加算を行うのは、
long * mpi_add0(long *, long *)整数の減算
一番単純なケース:
a > b > 0繰り下がりを考慮しなければならない
繰り下がり : 124 – 35
1 2 4
-- 3 5
1 2 14
-- 4 5
9
1 12 14
-- 1 4 5
8 9
ここで 2 を 1 にせず
、 3 を 4 にしてい るのがミソ
ここも同様.
整数の減算
繰り下がりを考慮して、
a > b > 0の場 合に
a-bを実装したのが、
long *mpi_s ub0(long *, long *)一般の整数の
a-bを行うのは、
long *m pi_sub(long *, long *).符号や引数の大小を考慮して、
a > b >0
の場合と、符号の反転に帰着させる
レポート課題
Web
に掲示した
mpi_mulbympi_addmpi_sub.c
の指示に
従って、関数
mpi_mul()の実装を完成
させること。そのさい、通常の
longで
同様の関数を書いた、
mulbyaddsub.cを参考にせよ
レポート課題提出要領
2003