跳到主要内容

名古屋工業大学 工学研究科 情報工学専攻 2011年8月実施 問題22 情報科学 I

Author​

祭音Myyura

Description​

I nn を2のべき乗とする。2つの nn ビット2進数 An=an−1,an−2,…,a0A_n=a_{n-1},a_{n-2},\ldots,a_0, Bn=bn−1,bn−2,…,b0B_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[n−1]A[0],\ldots,A[n-1] と B[0],…,B[n−1]B[0],\ldots,B[n-1] に格納されている(A[i],B[i]∈{0,1} (0≤i≤n−1)A[i],B[i]\in\{0,1\}\ (0\le i\le n-1))とする。AnA_n と BnB_n の和の計算結果を大きさ n+1n+1 の配列 R[0],…,R[n]R[0],\ldots,R[n] に格納するとする。また,各 i (0≤i≤n−1)i\ (0\le i\le n-1) に対して,ii 桁目の桁あげの結果を C[i+1] (0≤i≤n−1)C[i+1]\ (0\le i\le n-1) に格納するとする。このとき,C[i] (1≤i≤n)C[i]\ (1\le i\le n),R[i] (0≤i≤n)R[i]\ (0\le i\le n) を,それぞれ A,B,CA,B,C の要素を用いて表せ。それを利用して,S(n)=O(n)S(n)=O(n) を示せ。

(2) AnA_n と BnB_n の減算 (An−Bn)(A_n-B_n) に必要な時間計算量を D(n)D(n) とするとき,D(n)=O(n)D(n)=O(n) を示せ。

(3)

An/2U=an−1,…,an/2,An/2L=a(n/2)−1,…,a0,Bn/2U=bn−1,…,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)\le4M(n/2)+3S(2n)+O(n) となることを示し,M(n)=O(n2)M(n)=O(n^2) を証明せよ。

(4) 次の等式

An/2U×Bn/2L+Bn/2U×An/2L=(An/2U+An/2L)×(Bn/2U+Bn/2L)−An/2U×Bn/2U−An/2L×Bn/2L\begin{aligned} &A^U_{n/2}\times B^L_{n/2}+B^U_{n/2}\times A^L_{n/2}\\ &=(A^U_{n/2}+A^L_{n/2})\times(B^U_{n/2}+B^L_{n/2})\\ &\quad-A^U_{n/2}\times B^U_{n/2}-A^L_{n/2}\times B^L_{n/2} \end{aligned}

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

题目描述​

I 设 nn 为2的幂。两个 nn 位二进制数为 An=an−1,an−2,…,a0A_n=a_{n-1},a_{n-2},\ldots,a_0、Bn=bn−1,bn−2,…,b0B_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[n−1]A[0],\ldots,A[n-1] 与 B[0],…,B[n−1]B[0],\ldots,B[n-1] 中,其中 A[i],B[i]∈{0,1} (0≤i≤n−1)A[i],B[i]\in\{0,1\}\ (0\le i\le n-1)。将两数相加的结果存储在大小为 n+1n+1 的数组 R[0],…,R[n]R[0],\ldots,R[n] 中。对每个 i (0≤i≤n−1)i\ (0\le i\le n-1),将第 ii 位的进位结果存储在 C[i+1]C[i+1] 中。请分别使用 A,B,CA,B,C 的元素表示 C[i] (1≤i≤n)C[i]\ (1\le i\le n) 与 R[i] (0≤i≤n)R[i]\ (0\le i\le n),并利用结果证明 S(n)=O(n)S(n)=O(n)。

(2) 将减法 An−BnA_n-B_n 所需时间复杂度记为 D(n)D(n),证明 D(n)=O(n)D(n)=O(n)。

(3) 令

An/2U=an−1,…,an/2,An/2L=a(n/2)−1,…,a0,Bn/2U=bn−1,…,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)\le4M(n/2)+3S(2n)+O(n),并证明 M(n)=O(n2)M(n)=O(n^2)。

(4) 利用恒等式

An/2U×Bn/2L+Bn/2U×An/2L=(An/2U+An/2L)×(Bn/2U+Bn/2L)−An/2U×Bn/2U−An/2L×Bn/2L\begin{aligned} &A^U_{n/2}\times B^L_{n/2}+B^U_{n/2}\times A^L_{n/2}\\ &=(A^U_{n/2}+A^L_{n/2})\times(B^U_{n/2}+B^L_{n/2})\\ &\quad-A^U_{n/2}\times B^U_{n/2}-A^L_{n/2}\times B^L_{n/2} \end{aligned}

证明 M(n)=o(n2)M(n)=o(n^2)。

Kai​

(1)​

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

C[i]=⌊A[i−1]+B[i−1]+C[i−1]2⌋(1≤i≤n)\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]) mod 2(0≤i≤n−1),\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)​

まず An≥BnA_n\ge B_n の場合を考える。T[i]∈{0,1}T[i]\in\{0,1\} を ii 桁目へ入る借りとし、T[0]=0T[0]=0 とする。各 i=0,…,n−1i=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),xi≥0,(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)}

である。

An<BnA_n<B_n の場合は大小比較後に Bn−AnB_n-A_n を同じ方法で求め、負号を付ける。比較も O(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 ⁣(nlog⁡24)=O(n2)M(n)=O\!\left(n^{\log_2 4}\right)=\boxed{O(n^2)}

を得る。

(4)​

ビット長が 3 以下なら直接乗算し、それより大きい場合を再帰的に分割する。まず

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

を計算し、さらに

P1=(AhU+AhL)(BhU+BhL)−P2−P0P_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(\lceil n/2\rceil)+O(n) となるので、マスター定理より

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

log⁡23<2\log_2 3<2 であるから、

M(n)n2=O ⁣(nlog⁡23−2)⟶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)}

となる。

Reference​