算法导论31.2 Exercises 答案
31.2-1
令$\displaystyle{a’=\prod{i=1}^{r} p_i^{e_i-\min(e_i,f_i)},b’=\prod{i=1}^{r} pi^{f_i-\min(e_i,f_i)}},g=\prod{i=1}^{r} p_i^{\min(e_i,f_i)}$。
那么有$a=a’g,b=b’g$,并且由于$\forall i\in[1,r],e_i\ge\min(e_i,f_i),f_i\ge \min(e_i,f_i)$,因此$a’,b’$的所有指数仍然仍然是非负整数。也就是说,$a’,b’$仍然是整数,$g\mid a,g\mid b$。
接下来说明$\gcd(a’,b’)=1$。由于$\forall i\in[1,r],e_i-\min(e_i,f_i)=0$和$f_i-\min(e_i,f_i)=0$必定有一个成立,因此要么$p_i\nmid a$,要么$p_i\nmid b$,这两个条件必须有一个成立。也就是说,$\nexists p,p\mid a,p\mid b$同时成立。因此$\gcd(a’,b’)=1$,这说明$\gcd(a,b)=g$。
31.2-2
按照图31.1可以列出下表:
$\begin{array}{cccccc}
a&b&\lfloor a/b\rfloor&d&x&y\\hline
899&493&1&29&-6&11\
493&406&1&29&5&-6\
406&87&4&29&-1&5\
87&58&1&29&1&-1\
58&29&2&29&0&-1\
29&0&-&29&1&0
\end{array}$
最终EXTENDED-EUCLID(899, 493)返回$(29,-6,11)$。
31.2-3
根据定理31.9,有
$\begin{aligned}
\gcd(a+kn,n)&=\gcd(n,(a+kn)\bmod n)\
&=\gcd(n,a\bmod n)\
&=\gcd(a,n)
\end{aligned}$
因此当$a$满足$a=1\pmod n$时,将上面的式子由下往上推,有
$\begin{aligned}
\gcd(a,n)&=\gcd(n,a\bmod n)\
&=\gcd(n,1)\
&=1
\end{aligned}$
31.2-4
这个算法由EUCLID'给出。
1 | EUCLID'(a, b) |
31.2-5
定理33.11给出,当$b<F{k+1}$时,调用次数小于$k$次。又因为$F{k+1}<\dfrac{\phi^{k+1}}{\sqrt{5}}$,因此可得$b<\dfrac{\phi^{k+1}}{\sqrt{5}}$。令$k=\log_{\phi}$
定理33.10给出,当$b\ge F_{k+1}$时,EUCLID的调用次数上界才能达到$k$。
那么可以知道,$F_{k+1}\ge\dfrac{\phi^{k+1}}{\sqrt{5}}-\dfrac{\sqrt{5}-1}{2}$。那么有$\dfrac{\phi^{k+1}}{\sqrt{5}}\le b+\dfrac{\sqrt{5}-1}{2}$。两侧对$\phi$取对数并且移项,得到
当$b\ge 4$时,可以得到$k\le \log{\phi}\sqrt{5}+\log{\phi}\left(b+\dfrac{\sqrt{5}-1}{2}\right)-1<1+\log_{\phi} b$,从而保证原结论成立。
当$b=1,2,3$时,通过代入定理33.10的结论进行验证也可知原结论成立。
使用循环不变量来证明这个界限可以缩紧到$1+\log_{\phi}\dfrac{b}{\gcd(a,b)}$。
令$g=\gcd(a,b),a’=\dfrac{a}{g},b’=\dfrac{b}{g}$,我们将证明在整个递归过程中,参数值为$(a,b)$的调用过程产生的参数,永远是参数值为$(a’,b’)$的调用过程产生的参数的$g$倍。
初始:程序$A$调用EUCLID(a, b),子程序$B$调用EUCLID(a', b'),有$a=a’g,b=b’g$。
保持:程序$A$计算出了$a\bmod b$的值,程序$B$计算出了$a’\bmod b’$的值。可以发现,
$a\bmod b=(a’g)\mod(b’g)=a’g-b’g\left\lfloor\dfrac{a’g}{b’g}\right\rfloor=g\left(a’-b’\left\lfloor\dfrac{a’}{b’}\right\rfloor\right)=g(a’\bmod b’)$
整个循环保持了这个性质。
终止:最终程序$A$的最后一步调用参数为$(g,0)$,并返回;程序$B$的最后一步调用参数为$(1,0)$,并返回。
这说明了程序$A$和程序$B$的递归步骤总是一致的。也就是说,上面的调用次数上限可以缩紧到$1+\log\phi b’=1+\log{\phi}\dfrac{b}{\gcd(a,b)}$。
31.2-6
定理31.11的描述过程给出了求解$\gcd(F_{k+1},F_k)$的答案;它实际上是:
$\gcd(F{k+1},F_k)=\gcd(F{k},F{k-1})=\dots=\gcd(F{2},F1)=\gcd(F{1},F_0)=1$
也就是说,相邻两项的斐波那契数的最大公因数为$1$。
因此接下来我们考虑调用EXTENDED-EUCLID(F[k+1], F[k])的结果,用$(x_k,y_k)$表示(不需要考虑$d_k$,我们刚刚已经知道了$d_k=1$)。我们将自底向上地考虑这个过程,那么有:
$\left {\begin{aligned}
&xk=y{k-1}\
&yk=x{k-1}-\lfloor F{k}/F{k-1}\rfloor y{k-1} = x{k-1}-y_{k-1}
\end{aligned}\right.$
其中,第二个等号是当$k\ge 3$时才满足。
对于一些比较小的$k$值,有
$\begin{array}{cccc}
k&d_k&x_k&y_k\
\hline
0&1&1&0\
1&1&0&1\
2&1&0&1\
3&1&1&-1\
4&1&-1&2
\end{array}$
对于较大的$k$值,我们考虑计算求解递推式$ak=a{k-2}-a_{k-1},a_0=0,a_1=1$,不难求出$a_k=(-1)^{k+1}F_k$。
因此,将$a$回代到$y$。不难知道,对于$k\ge 4$,算法EXTENDED-EUCLID的返回结果为$(1,(-1)^{k+1}F{k-2},(-1)^{k}F{k-1})$。
31.2-7
等式31.6证明说明了参数的次序不影响最大公因数的值,即满足交换律。
题目31.1-10证明了参数的优先运算顺序不影响最大公因数的值,即满足结合律,哪怕多于两个参数。
因此按照这两个性质,无论是多个参数参与进行运算,最大公因数的值并不会受到影响。
至于求解$a1x_1+a_2x_2+\dots+a_nx_n=\gcd(a_1,a_2,\dots,a_n)$,令$g_n=\gcd(a_1,a_2,\dots,a_n)$。我们使用$\gcd(g{n-1},a_n)=g_n$这个等式来考虑:
假设已经计算出了一组整数$y1,y_2,\dots,y{n-1}$,使得$\displaystyle{\sum{i=1}^{n-1} a_iy_i=g{n-1}}$,那么将左边的这一些值视为整体,我们就可以得到以$(x,y)$为未知数的方程$g_{n-1}x+a_ny=g_n$。对它使用EXTENDED-EUCLID求出解后,那么对于$i\in[1,n)$,令$x_i=y_i\cdot x$即可,并令$x_n=y$,那么久求出了一组解$(x_1,x_2,\dots.x_n)$。
只要$a$值是从小到大求解的,那么EXTENDED-EUCLID算法使用除法的次数仅仅取决于$ai$的最大值,并且由于每次遍历时,一开始调用EXTENDED-EUCLID的参数$b$必定不为$0$,因此也需要一次除法操作。因此整个程序的时间复杂度为$\displaystyle{O\left(n+\max{i=1}^n{a_i}\right)}$。这个算法由MULTI-EXTENDED-EUCLID给出。
1 | MULTI-EXTENDED-EUCLID(A, n) |
31.2-8
这个算法由LCM-MULTI给出。其基于的事实是,$\text{lcm}(a1,a_2,\dots,a_n)=\text{lcm}(\text{lcm}(a_1,a_2,\dots,a{n-1}),a_n)$,以及$\text{lcm}(a,b)\cdot\gcd(a,b)=ab$。
1 | LCM-MULTI(A, n) |
整个算法的时间复杂度为$O(n\log M)$,因为计算复杂性主要在于求解最大公因数。
31.2-9
以下证明将围绕定理31.6进行证明:$\gcd(ab,p)=1$当且仅当$\gcd(a,p)=1,\gcd(b,p)=1$。
由于$\gcd(n_1n_2,n_3n_4)=1$,因此$\gcd(n_1,n_3)=\gcd(n_1,n_4)=\gcd(n_2,n_3)=\gcd(n_2,n_4)=1$,按照定理31.6,这两个条件是充要的。
由于$\gcd(n_1n_3,n_2n_4)=1$,因此$\gcd(n_1,n_2)=\gcd(n_1,n_4)=\gcd(n_3,n_2)=\gcd(n_3,n_4)=1$,同样按照定理31.6,这两个条件是充要的。
因此,$n_1,n_2,n_3,n_4$两两互质当且仅当$\gcd(n_1n_2,n_3n_4)=\gcd(n_1n_3,n_2n_4)=1$。
对于更一般的过程(为了方便,这里我们假设下标从$0$开始),令$m=\lceil \lg k\rceil$,在第$i$轮中,将下标满足第$i$位为$1$的数(假设这个数集为$S^i_1$)乘起来得到$s^i_1$,将下标满足第$i$位为$0$的数(假设这个数集为$S^i_0$)乘起来得到$s^i_0$,如果$\gcd(s_0,s_1)=1$,那么说明$S_0^i$中的数和$S_1^i$中的都是互质的,因此每一对数总会在某一轮中处在不同的集合。
这个算法由程序IS-PAIRWISE-RELATIVELY-PRIME给出。
1 | IS-PAIRWISE-RELATIVELY-PRIME(A, k) |