跳到主要内容

東北大学 工学研究科 電気・情報系 2015年3月実施 専門科目 問題5 計算機2

Author​

祭音Myyura (co-authored with GPT 5.6 SOL)

Description​

日本語原題​

Fig. 5 に示す再帰関数 ff を考える。ここで,入力 xx と yy は任意の正の整数であるとする。関数 div⁡(x,y)\operatorname{div}(x,y) は,xx を yy で割った商を整数で返し,mod⁡(x,y)\operatorname{mod}(x,y) は,xx を yy で割った余りを整数で返す。演算子 ‘−’ と ‘*’ は,整数の減算と乗算を各々表す。また,式 “if e1=e2e_1=e_2 then e3e_3 else e4e_4” の値は,e1e_1 の値が e2e_2 の値に等しければ e3e_3 の値に,そうでなければ e4e_4 の値に等しい。ff に関する以下の問に答えよ。

(1) f(2,7)f(2,7) を計算せよ。計算の過程も示すこと。

(2) f(x,y)f(x,y) の計算が停止することを示せ。

(3) f(x,y)f(x,y) を計算するために必要な再帰関数呼び出しの回数を yy に関するオーダで示せ。その根拠も説明せよ。

(4) f(x,y+1)f(x,y+1) の値は x∗f(x,y)x*f(x,y) の値と等しいことを示せ。

f(x,y) =
if y=1 then x
else if mod(y,2)=0 then f(x*x;div(y,2))
else x*f(x,y-1)

题目描述​

输入 x,yx,y 为正整数,div 和 mod 分别表示整数商与余数。

f(x, y) =
if y == 1 then x
else if mod(y, 2) == 0 then f(x*x, div(y, 2))
else x * f(x, y-1)
  1. 计算 f(2,7)f(2,7),写出过程。
  2. 证明计算终止。
  3. 用 yy 表示递归调用次数的渐近阶,并证明。
  4. 证明 f(x,y+1)=xf(x,y)f(x,y+1)=x f(x,y)。

Kai​

(1)​

f(2,7)=2f(2,6)=2f(4,3)=2⋅4f(4,2)=2⋅4f(16,1)=128.\begin{aligned} f(2,7)&=2f(2,6)=2f(4,3)\\ &=2\cdot4f(4,2)=2\cdot4f(16,1)=\boxed{128}. \end{aligned}

(2)​

y>1y>1 时,下一调用的第二参数为 y/2y/2 或 y−1y-1,都是小于 yy 的正整数,故必到达 y=1y=1 而终止。

(3)​

偶数参数减半;奇数参数先减 11,下一步再减半。故每至多两次递归,第二参数至少减半,调用次数为 O(log⁡y)O(\log y);而每步最多使二进制位数减少 11,所以也是 Ω(log⁡y)\Omega(\log y)。

更精确地,计入初始调用,总调用数为

C(y)=⌊log⁡2y⌋+popcount⁡(y),\boxed{C(y)=\lfloor\log_2 y\rfloor+\operatorname{popcount}(y)},

其中 popcount 表示二进制表示中 11 的个数。因此为 Θ(1+log⁡y)\Theta(1+\log y)。这仅统计调用次数,未把大整数乘法视为常量时间来估计位运算复杂度。

(4)​

对 yy 作强归纳证明 f(x,y)=xyf(x,y)=x^y。y=1y=1 成立;偶数 y=2ky=2k 时

f(x,2k)=f(x2,k)=(x2)k=x2k;f(x,2k)=f(x^2,k)=(x^2)^k=x^{2k};

奇数 y>1y>1 时

f(x,y)=xf(x,y−1)=xy.f(x,y)=xf(x,y-1)=x^y.

因此 f(x,y+1)=xy+1=xf(x,y)\boxed{f(x,y+1)=x^{y+1}=xf(x,y)}。