名古屋工業大学 工学研究科 情報工学専攻 2011年8月実施 問題22 情報科学 I
Author
祭音Myyura
Description
I n を2のべき乗とする。2つの n ビット2進数 An=an−1,an−2,…,a0, Bn=bn−1,bn−2,…,b0 の乗算に必要な時間計算量を M(n) とし,加算に必要な時間計算量を S(n) とする。以下の問いについて答えよ。
(1) An,Bn がそれぞれ,大きさ n の配列 A[0],…,A[n−1] と B[0],…,B[n−1] に格納されている(A[i],B[i]∈{0,1} (0≤i≤n−1))とする。An と Bn の和の計算結果を大きさ n+1 の配列 R[0],…,R[n] に格納するとする。また,各 i (0≤i≤n−1) に対して,i 桁目の桁あげの結果を C[i+1] (0≤i≤n−1) に格納するとする。このとき,C[i] (1≤i≤n),R[i] (0≤i≤n) を,それぞれ A,B,C の要素を用いて表せ。それを利用して,S(n)=O(n) を示せ。
(2) An と Bn の減算 (An−Bn) に必要な時間計算量を D(n) とするとき,D(n)=O(n) を示せ。
(3)
An/2UAn/2LBn/2UBn/2L=an−1,…,an/2,=a(n/2)−1,…,a0,=bn−1,…,bn/2,=b(n/2)−1,…,b0
とするとき,再帰的な乗算アルゴリズムを記述し,M(n)≤4M(n/2)+3S(2n)+O(n) となることを示し,M(n)=O(n2) を証明せよ。
(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
を利用して,M(n)=o(n2) を示せ。
题目描述
I 设 n 为2的幂。两个 n 位二进制数为 An=an−1,an−2,…,a0、Bn=bn−1,bn−2,…,b0。将乘法所需时间复杂度记为 M(n),加法所需时间复杂度记为 S(n)。回答下列问题。
(1) 假设 An,Bn 分别存储在大小为 n 的数组 A[0],…,A[n−1] 与 B[0],…,B[n−1] 中,其中 A[i],B[i]∈{0,1} (0≤i≤n−1)。将两数相加的结果存储在大小为 n+1 的数组 R[0],…,R[n] 中。对每个 i (0≤i≤n−1),将第 i 位的进位结果存储在 C[i+1] 中。请分别使用 A,B,C 的元素表示 C[i] (1≤i≤n) 与 R[i] (0≤i≤n),并利用结果证明 S(n)=O(n)。
(2) 将减法 An−Bn 所需时间复杂度记为 D(n),证明 D(n)=O(n)。
(3) 令
An/2UAn/2LBn/2UBn/2L=an−1,…,an/2,=a(n/2)−1,…,a0,=bn−1,…,bn/2,=b(n/2)−1,…,b0.
请写出递归乘法算法,说明 M(n)≤4M(n/2)+3S(2n)+O(n),并证明 M(n)=O(n2)。
(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
证明 M(n)=o(n2)。
Kai
(1)
C[0]=0 とおく。各桁について、和と次の桁への桁上げは
C[i]=⌊2A[i−1]+B[i−1]+C[i−1]⌋(1≤i≤n)
で求まる。また、
R[i]=(A[i]+B[i]+C[i])mod2(0≤i≤n−1),
R[n]=C[n]
である。各 i に対する演算回数は定数であり、これを n 桁について行うので、
S(n)=O(n)
となる。
(2)
まず An≥Bn の場合を考える。T[i]∈{0,1} を i 桁目へ入る借りとし、T[0]=0 とする。各 i=0,…,n−1 について
xi=A[i]−B[i]−T[i]
を計算し、
(R[i],T[i+1])={(xi,0),(xi+2,1),xi≥0,xi<0
とすればよい。各桁で定数回の演算しか行わないため、
D(n)=O(n)
である。
An<Bn の場合は大小比較後に Bn−An を同じ方法で求め、負号を付ける。比較も O(n) なので全体の評価は変わらない。
(3)
h=n/2 とおくと、
An=2hAhU+AhL,Bn=2hBhU+BhL
である。次の四つを再帰的に計算する。
P0=AhLBhL,P1=AhUBhL,P2=AhLBhU,P3=AhUBhU.
すると、積は
AnBn=2nP3+2h(P1+P2)+P0
である。桁ずらしは O(n)、四つの 2n ビット以下の数をまとめる加算は 3 回で済む。したがって、
M(n)≤4M(n/2)+3S(2n)+O(n)=4M(n/2)+O(n).
この漸化式にマスター定理を適用すると、
M(n)=O(nlog24)=O(n2)
を得る。
(4)
ビット長が 3 以下なら直接乗算し、それより大きい場合を再帰的に分割する。まず
P0=AhLBhL,P2=AhUBhU
を計算し、さらに
P1=(AhU+AhL)(BhU+BhL)−P2−P0
を計算する。これにより、積は
AnBn=2nP2+2hP1+P0
となり、再帰的な乗算は 3 回で済む。二つの半分の和は高々 n/2+1 ビットなので、加減算と桁ずらしも含めて厳密には
M(n)≤3M(n/2+1)+O(n)
と評価できる。同じ分割法を任意のビット長にも定義して端数を切り上げれば、
F(n)=M(n+2) とおいて F(n)≤3F(⌈n/2⌉)+O(n) となるので、マスター定理より
M(n)=O(nlog23).
log23<2 であるから、
n2M(n)=O(nlog23−2)⟶0
であり、
M(n)=o(n2)
となる。
Reference