CINTA——2选做
第三章第九题
计算斐波那契数列 F ( n ) F(n) F(n),就是解题中已给出的矩阵的n次幂,那么怎样才可以快速的解出来呢?
当然,最简单的算法就是对矩阵进行循环乘法了,时间复杂度为 O ( n ) O(n) O(n),但是,如果我们采用教材中3.3节所给出的模指数运算的算法包含的中的快速幂算法,就可以将时间复杂度降为 O ( l o g n ) O(logn) O(logn)
那么对于模指数运算的算法
x
y
(
m
o
d
n
)
x^y\pmod{n}
xy(modn)来说,这里的
x
x
x就相当于矩阵
[
1
1
1
0
]
\begin{equation} \left[ \begin{array}{cc} 1&1 \\ 1&0 \end{array} \right] \end{equation}
[1110]
这里的
y
y
y就相当于n,然后我们只需要将书中算法的整数
x
x
x,换为矩阵就好了,而且矩阵已知,我们的参数列表只需要给出即可,不过矩阵乘法需要自己写代码来实现,下面给出递归版本的代码↓
//递归快速幂来求解斐波那契数列
int qpow(inta[][2],int n){
//a是二维数组代表题中的矩阵
//注意,这里的*要重载为满足矩阵乘法运算规则
if(n==0)return 0;
int temp=qpow(a,n/2);
else{
if(n%2==0){
return temp*temp;//若为避免使用temp*temp,可以直接使用return(a*a,n2)
}//阶为偶数
else{
if(n%2==1){//阶为奇数
return temp*temp*a;//如果是模指数算法,则在上面两个如return后面加上%p即可
}
}
}
}
注意,教材中的是模指数算法,但是求解本题需要的是快速幂算法,区别就在于模指数算法多了模运算。
第四章第十四题
( 1 ) (1) (1)因为p是素数,所以p的因子只有1和p,根据题中函数的定义,则 F ( p ) = ϕ ( 1 ) + ϕ ( p ) = 1 + p − 1 = F(p)=\phi(1)+\phi(p)=1+p-1= F(p)=ϕ(1)+ϕ(p)=1+p−1=得证。
( 2 ) (2) (2)同上面小题的思路, p 2 p^2 p2只有 1 , p , p 2 1,p,p^2 1,p,p2因子,所以 F ( p 2 ) = ϕ ( 1 ) = ϕ ( p ) + ϕ ( p 2 ) = 1 + p − 1 + p 2 − p = p 2 F(p^2)=\phi(1)=\phi(p)+\phi(p^2)=1+p-1+p^2-p=p^2 F(p2)=ϕ(1)=ϕ(p)+ϕ(p2)=1+p−1+p2−p=p2得证。
( 3 ) (3) (3)思路同第二小问, p k p^k pk的因子有 1 , p k , p , p k − 1 , p k − 2 , p 2 ⋯ 1,p^k,p,p^{k-1},p^{k-2},p^2\cdots 1,pk,p,pk−1,pk−2,p2⋯,则 F ( p k ) = ϕ ( 1 ) + ϕ ( p ) + ϕ ( p 2 ) + ⋯ + ϕ ( p k ) = 1 + p − 1 + p 2 − p + ⋯ + p k − p k − 1 = p k F(p^k)=\phi(1)+\phi(p)+\phi(p^2)+\cdots+\phi(p^k)=1+p-1+p^2-p+\cdots+p^k-p^{k-1}=p^k F(pk)=ϕ(1)+ϕ(p)+ϕ(p2)+⋯+ϕ(pk)=1+p−1+p2−p+⋯+pk−pk−1=pk得证。
( 4 ) (4) (4)对任意素数 p , q p,q p,q, p q pq pq的因子有 1 , p , q , p q 1,p,q,pq 1,p,q,pq。 F ( p q ) = ϕ ( 1 ) + ϕ ( p ) + ϕ ( q ) + ϕ ( p q ) = 1 + p − 1 + q − 1 + ( p − 1 ) ( q − 1 ) = p + q − 1 + p q − p − q + 1 = p q F(pq)=\phi(1)+\phi(p)+\phi(q)+\phi(pq)=1+p-1+q-1+(p-1)(q-1)=p+q-1+pq-p-q+1=pq F(pq)=ϕ(1)+ϕ(p)+ϕ(q)+ϕ(pq)=1+p−1+q−1+(p−1)(q−1)=p+q−1+pq−p−q+1=pq得证。
( 5 ) (5) (5)如果 m , n m,n m,n互为素数,那么它们的因子也要互为素数才可以。故假设m的因子是 a 1 , a 2 , ⋯ a x a_1,a_2,\cdots a_x a1,a2,⋯ax,n的因子为 b 1 , b 2 , ⋯ , b y b_1,b_2,\cdots,b_y b1,b2,⋯,by。
那么 m ⋅ n m\cdot n m⋅n相乘可表示为因子相乘,即 a 1 b 1 , a 1 b 2 ⋯ a 1 b y , a 2 b 1 , a 2 b 2 ⋯ a 2 b y , ⋯ a x b 1 , a x b 2 ⋯ a x b y a_1b_1,a_1b_2\cdots a_1b_y,a_2b_1,a_2b_2\cdots a_2b_y,\cdots a_xb_1,a_xb_2\cdots a_xb_y a1b1,a1b2⋯a1by,a2b1,a2b2⋯a2by,⋯axb1,axb2⋯axby
那么函数
F
(
m
n
)
=
ϕ
(
a
1
b
1
)
+
ϕ
(
a
1
b
2
)
+
⋯
+
ϕ
(
a
1
b
1
)
+
ϕ
(
a
2
b
2
)
+
⋯
+
ϕ
(
a
x
b
1
)
+
ϕ
(
a
x
b
2
)
+
⋯
+
ϕ
(
a
x
b
y
)
F(mn)=\phi(a_1b_1)+\phi(a_1b_2)+\cdots+\phi(a_1b_1)+\phi(a_2b_2)+\cdots+\phi(a_xb_1)+\phi(a_xb_2)+\cdots+\phi(a_xb_y)
F(mn)=ϕ(a1b1)+ϕ(a1b2)+⋯+ϕ(a1b1)+ϕ(a2b2)+⋯+ϕ(axb1)+ϕ(axb2)+⋯+ϕ(axby)根据欧拉函数公式,可继续有
ϕ
(
a
1
)
(
ϕ
(
b
1
)
⋯
ϕ
(
b
y
)
)
+
ϕ
(
a
2
)
(
ϕ
(
b
1
)
ϕ
(
b
1
)
⋯
ϕ
(
b
y
)
)
+
⋯
+
ϕ
(
a
x
)
(
ϕ
(
b
1
)
⋯
ϕ
(
b
y
)
)
\phi(a_1)(\phi(b_1)\cdots\phi(b_y))+\phi(a_2)(\phi(b_1)\phi(b_1)\cdots\phi(b_y))+\cdots+\phi(a_x)(\phi(b_1)\cdots\phi(b_y))
ϕ(a1)(ϕ(b1)⋯ϕ(by))+ϕ(a2)(ϕ(b1)ϕ(b1)⋯ϕ(by))+⋯+ϕ(ax)(ϕ(b1)⋯ϕ(by))
=
(
ϕ
(
a
1
)
⋯
ϕ
(
a
x
)
)
(
ϕ
(
b
1
)
⋯
ϕ
(
b
y
)
)
=
F
(
m
)
F
(
n
)
=(\phi(a_1)\cdots\phi(a_x))(\phi(b_1)\cdots\phi(b_y))=F(m)F(n)
=(ϕ(a1)⋯ϕ(ax))(ϕ(b1)⋯ϕ(by))=F(m)F(n)
得证。
( 6 ) (6) (6)根据提示:任意整数n都是素数的乘积,即 n = p 0 k 0 p 1 k 1 ⋯ p t k t n=p_0^{k_0}p_1^{k_1}\cdots p_t^{k_t} n=p0k0p1k1⋯ptkt,则 F ( n ) = F ( p 0 k 0 p 1 k 1 ⋯ p t k t ) F(n)=F(p_0^{k_0}p_1^{k_1}\cdots p_t^{k_t}) F(n)=F(p0k0p1k1⋯ptkt),根据 ( 5 ) (5) (5)的结论可知上式等于 F ( p 0 k 0 ) F ( p 1 k 1 ) ⋯ F ( p t k t ) F(p_0^{k_0})F(p_1^{k_1})\cdots F(p_t^{k_t}) F(p0k0)F(p1k1)⋯F(ptkt),再由 ( 3 ) (3) (3)中的结论可知上式可继续等于 p 0 k 0 ⋯ p t k t = n p_0^{k_0}\cdots p_t^{k_t}=n p0k0⋯ptkt=n得证。