快速幂

我们从一个简单的问题开始。 $ 6^{208}\%23 $等于多少。解这个题目最笨的方法是把$6^{208}$算出来,然后再算$6^{208}\%23$。接下来我们讲解一种快速计算的方法。此方法在ACM-ICPC中非常重要,在密码学考试中一样相当重要。

首先我们来计算一下$6^{208}$是多少吧。

先上幂运算代码(clisp):

(defun pow (x n)
    (if (= n 0)
        1
        (* x (pow x (1- n)))))

运行结果

* (defun pow (x n)
    (if (= n 0)
        1
        (* x (pow x (1- n)))))

POW
* (pow 6 208)

716902475118262214817011779393196661223001384517326117611478588644678638278414107572257870390965072733283553862876694482148415089417201250632070732438043011055616
* (mod (pow 6 208) 23)

4

接下来上快速幂代码(clisp):

;;;; pow_mod function
(defun pow_mod (x n mod_value)
    (if (= n 0)
        1
        (if (= n 1)
            (mod x mod_value)
            (mod
                (*
                    (mod (pow (pow_mod x (floor (/ n 2)) mod_value) 2) mod_value)
                    (pow_mod x (mod n 2) mod_value)
                )
                mod_value))))

最后计算出来等于4

那么接下来在说快速幂之前我们先讲一个公式: $ (a \times b) \% n = [ (a \% n) \times (b \% n) ] \% n $