习题1.26

解释题,说简单也简单,难在如何表达清楚。

首先解释下代码的变化

(defn expmod[base exp m]
  (cond (= exp 0) 1
        (even? exp) (mod (square (expmod base (/ exp 2) m)) m)
        :else (mod (* base (expmod base (- exp 1) m)) m)
        )
  )

(defn expmod[base exp m]
  (cond (= exp 0) 1
   ;///这里变了
        (even? exp) (mod (* (expmod base (/ exp 2) m) (expmod base (/ exp 2) m)) m) 
        :else (mod (* base (expmod base (- exp 1) m)) m)
        )
  )

之所以会从对数级变成线性级,主要原因在于代码的展开方式,在使用square方法的时候,先计算一遍expmod 函数内的值,然后对计算结果进行平方计算。在使用乘法的时候,是计算了两次expmod函数内的值,然后再将结果进行相乘计算,在偶数的情况下 每次都会将同一个运算多做一次。

假设我们要计算的exp为1024,那么使用square总共要计算expomd表达式10次,即以2为底1024的对数。使用乘号的话,需要2+4+8+++1024=2046 ,可以简略看做2*1024也就是线性级函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值