跳到主要内容

名古屋工業大学 工学研究科 情報工学専攻 2012年度 計算機ソフトウェア I

Author

祭音Myyura

Description

nn22 のべき乗とする。二つの nn ビット二進数

An=an1,an2,,a0,Bn=bn1,bn2,,b0A_n=a_{n-1},a_{n-2},\ldots,a_0,\qquad B_n=b_{n-1},b_{n-2},\ldots,b_0

の乗算に必要な時間計算量を M(n)M(n)、加算に必要な時間計算量を S(n)S(n) とする。

(1)

An,BnA_n,B_n がそれぞれ大きさ nn の配列 A[0],,A[n1]A[0],\ldots,A[n-1]B[0],,B[n1]B[0],\ldots,B[n-1] に格納されているとする。ただし、

A[i],B[i]{0,1}(0in1)A[i],B[i]\in\{0,1\}\qquad(0\le i\le n-1)

である。AnA_nBnB_n の和を大きさ n+1n+1 の配列 R[0],,R[n]R[0],\ldots,R[n] に格納する。また、各 ii0in10\le i\le n-1)について、ii 桁目からの桁上げの結果を C[i+1]C[i+1] に格納する。

C[i]C[i]1in1\le i\le n)および R[i]R[i]0in0\le i\le n)を、それぞれ A,B,CA,B,C の要素を用いて表せ。それを利用して、S(n)=O(n)S(n)=O(n) を示せ。

(2)

AnBnA_n\ge B_n とする。AnBnA_n-B_n の減算に必要な時間計算量を D(n)D(n) とするとき、D(n)=O(n)D(n)=O(n) を示せ。

(3)

上位・下位の各 n/2n/2 ビットを

An/2U=an1,,an/2,An/2L=a(n/2)1,,a0,Bn/2U=bn1,,bn/2,Bn/2L=b(n/2)1,,b0\begin{aligned} A^U_{n/2}&=a_{n-1},\ldots,a_{n/2}, & A^L_{n/2}&=a_{(n/2)-1},\ldots,a_0,\\ B^U_{n/2}&=b_{n-1},\ldots,b_{n/2}, & B^L_{n/2}&=b_{(n/2)-1},\ldots,b_0 \end{aligned}

とする。再帰的な乗算アルゴリズムを記述し、

M(n)4M(n/2)+3S(2n)+O(n)M(n)\le 4M(n/2)+3S(2n)+O(n)

となることを示して、M(n)=O(n2)M(n)=O(n^2) を証明せよ。

(4)

次の等式

An/2UBn/2L+Bn/2UAn/2L=(An/2U+An/2L)(Bn/2U+Bn/2L)An/2UBn/2UAn/2LBn/2LA^U_{n/2}B^L_{n/2}+B^U_{n/2}A^L_{n/2} = (A^U_{n/2}+A^L_{n/2})(B^U_{n/2}+B^L_{n/2}) -A^U_{n/2}B^U_{n/2}-A^L_{n/2}B^L_{n/2}

を利用して、M(n)=o(n2)M(n)=o(n^2) を示せ。

Kai

(1)

C[0]=0C[0]=0 とおく。各桁について、和と次の桁への桁上げは

C[i]=A[i1]+B[i1]+C[i1]2(1in)\boxed{C[i]=\left\lfloor \frac{A[i-1]+B[i-1]+C[i-1]}{2} \right\rfloor}\qquad(1\le i\le n)

で求まる。また、

R[i]=(A[i]+B[i]+C[i])mod2(0in1),\boxed{R[i]=(A[i]+B[i]+C[i])\bmod 2}\qquad(0\le i\le n-1),
R[n]=C[n]\boxed{R[n]=C[n]}

である。各 ii に対する演算回数は定数であり、これを nn 桁について行うので、

S(n)=O(n)\boxed{S(n)=O(n)}

となる。

(2)

T[i]{0,1}T[i]\in\{0,1\}ii 桁目へ入る借りとし、T[0]=0T[0]=0 とする。各 i=0,,n1i=0,\ldots,n-1 について

xi=A[i]B[i]T[i]x_i=A[i]-B[i]-T[i]

を計算し、

(R[i],T[i+1])={(xi,0),xi0,(xi+2,1),xi<0(R[i],T[i+1])= \begin{cases} (x_i,0),&x_i\ge 0,\\ (x_i+2,1),&x_i<0 \end{cases}

とすればよい。各桁で定数回の演算しか行わないため、

D(n)=O(n)\boxed{D(n)=O(n)}

である。

(3)

h=n/2h=n/2 とおくと、

An=2hAhU+AhL,Bn=2hBhU+BhLA_n=2^hA^U_h+A^L_h,\qquad B_n=2^hB^U_h+B^L_h

である。次の四つを再帰的に計算する。

P0=AhLBhL,P1=AhUBhL,P2=AhLBhU,P3=AhUBhU.P_0=A^L_hB^L_h,\quad P_1=A^U_hB^L_h,\quad P_2=A^L_hB^U_h,\quad P_3=A^U_hB^U_h.

すると、積は

AnBn=2nP3+2h(P1+P2)+P0A_nB_n=2^nP_3+2^h(P_1+P_2)+P_0

である。桁ずらしは O(n)O(n)、四つの 2n2n ビット以下の数をまとめる加算は 3 回で済む。したがって、

M(n)4M(n/2)+3S(2n)+O(n)=4M(n/2)+O(n).M(n)\le 4M(n/2)+3S(2n)+O(n) =4M(n/2)+O(n).

この漸化式にマスター定理を適用すると、

M(n)=O ⁣(nlog24)=O(n2)M(n)=O\!\left(n^{\log_2 4}\right)=\boxed{O(n^2)}

を得る。

(4)

まず

P0=AhLBhL,P2=AhUBhUP_0=A^L_hB^L_h,\qquad P_2=A^U_hB^U_h

を計算し、さらに

P1=(AhU+AhL)(BhU+BhL)P2P0P_1=(A^U_h+A^L_h)(B^U_h+B^L_h)-P_2-P_0

を計算する。これにより、積は

AnBn=2nP2+2hP1+P0A_nB_n=2^nP_2+2^hP_1+P_0

となり、再帰的な乗算は 3 回で済む。二つの半分の和は高々 n/2+1n/2+1 ビットなので、加減算と桁ずらしも含めて厳密には

M(n)3M(n/2+1)+O(n)M(n)\le 3M(n/2+1)+O(n)

と評価できる。F(n)=M(n+2)F(n)=M(n+2) とおけば F(n)3F(n/2)+O(n)F(n)\le3F(n/2)+O(n) となるので、マスター定理より

M(n)=O ⁣(nlog23).M(n)=O\!\left(n^{\log_2 3}\right).

log23<2\log_2 3<2 であるから、

M(n)n2=O ⁣(nlog232)0\frac{M(n)}{n^2} =O\!\left(n^{\log_2 3-2}\right)\longrightarrow 0

であり、

M(n)=o(n2)\boxed{M(n)=o(n^2)}

となる。

検算

4 ビット整数の全組合せについて、四分割による式と上の 3 回乗算による式をプログラムで計算し、いずれも通常の整数積と一致することを確認した。