幂指模运算特别方式

概述

  • 给定一个数\(a\),求它对\(m\)取模的结果,该如何计算?
  • 给定一个数\(a^b\),求它对\(m\)取模的结果,该如何计算?
  • 给定一个数\(a^{b}\),其中\(b\)以数组的形式给出\(b=[b_1,b_2,b_3,...,b_n]\),此时乘积会很大,数值类型将会溢出,如何计算其对\(m\)取模的值?

方法

数组拆分

幂的计算可以写成递归的形式:
\(a^{[b_1,b_2,...,b_n]}=a^{b_n}*{(a^{[b_1,b_2,...,b_{n-1}]})}^{10}\)

取模转换

俩数相乘取模的结果分别为俩数取模结果的乘积在取模。
\((A * B) \% k = (A \% k)(B \% k) \% k\)
假设:

\(A = a_1k+a_2;B = b_1k+b_2\)

\((A*B) \% k = (a_1k+a_2)(b_1k+b_2) \% k\)

\(=(a_1b_1k^2+(a_1b_2+b_1a_2)k+a_2b_2) \% k\)

$=(a_2*b_2) %k $

再有:

\(A \% k = a_2; B \% k = b_2\)

所以:

\(=(a_2*b_2) \% k = (a_2 \% k)(b_2 \% k) \% k\)

初式得证。