1. 模取幂问题
计算模取幂a^n mod m时,可使用如下算法(偷懒一下,直接给scheme代码),时间复杂度为log(n),效率很高。
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (square (expmod base (/ exp 2) m)) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
但当指数n不直接给出,而是由其他函数定义时,上述算法可能不太适用。例如计算a^(b^n) mod m,无法按照上述算法直接对n进行降次。
按照一般的经验,序列a^n mod m, n=1,2,3...是具有周期性的,例如下面分别计算当a=2和3,m=7和11,序列的前20项如下,其周期分别为3和5