CINTA——2选做

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+p1=得证。

( 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+p1+p2p=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,pk1,pk2,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+p1+p2p++pkpk1=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+p1+q1+(p1)(q1)=p+q1+pqpq+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 mn相乘可表示为因子相乘,即 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,a1b2a1by,a2b1,a2b2a2by,axb1,axb2axby

那么函数 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=p0k0p1k1ptkt,则 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(p0k0p1k1ptkt),根据 ( 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 p0k0ptkt=n得证。

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值