原理
\[a^n=\begin{matrix} \underbrace{ a*a*…*a } \\ n \end{matrix}\\ a^{13}=a^{(1101)_2}=a^8*a^4*a^1 \]应用
矩阵快速幂和多次置换
计算斐波那契数列可以构建\(2*2\)的转移矩阵从\(F_i,F_{i+1}\)到\(F_{i+1},F_{i+2}\)的变换,将转移矩阵用快速幂优化到\(n^3logk\)
把序列置换\(k\)次,将置换快速幂自乘\(k\)次
加速线性变换
三维空间中
\[\begin{bmatrix}1 & 0 & 0 & a \\0 & 1 & 0 & b \\0 & 0 & 1 & c \\0 & 0 & 0 & 1\end{bmatrix}*\begin{bmatrix}x\\y\\z\\1\end{bmatrix}=*\begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix} \]将\(x\)加\(a\),\(y\)加\(b\),\(z\)加\(c\)
\[\begin{bmatrix} a & 0 & 0 & 0 \\ 0 & b & 0 & 0 \\ 0 & 0 & d & 0 \\ 0 & 0 & 0 & 1\end{bmatrix} \]\(x\)放大\(a\)倍,\(y\)放大\(b\)倍,\(z\)放大\(c\)倍
\[\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & sin\theta & 0 \\ 0 & -sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1\end{bmatrix} \]绕\(x\)轴旋转\(\theta\)度
模意义下大整数乘法
龟速乘:将乘法拆分成二进制加放放置爆long long
快速乘:
\[a*b\ mod\ m=a*b-\lfloor\frac{ab}{m}\rfloor*m \]利用\(unsigned\ long\ long\)的自然溢出,减法前后两部分都自然溢出,差值不变
\[a*b\ mod\ m=a*b-\lfloor\frac{ab}{m}\rfloor*m=(a*b-\lfloor\frac{ab}{m}\rfloor*m)\ mod\ 2^{64} \]对于\(\lfloor\frac{ab}{m}\rfloor\)可以用\(long\ double\)算
因为浮点数误差,运算结果应该返回\((ret+m)\ mod\ m\)
快速乘的一点转化:
当模数小于\(10^{12}\)时
\[x*y\ mod\ P\\ A=(x*(y>>25))\% P*(1<<25)\%P\\ B=(x*(y\&((1<<25)-1))\%P\\ x*y\ mod\ P=(A+B)\ mod\ P \]利用分配律可以完全做到\(O(1)\)
光速幂
要求同一底数,同一模数,\(O(\sqrt{n})\)预处理,\(O(1)\)查询
选定一个数\(s\),预处理出\(a^0\)到\(a^s\)和\(a^{0*s}\)到\(a^{\lceil\frac{p}{s}\rceil}\)
每次询问\(a^b\ mod\ p\),将\(b\)拆分为\(\lfloor\frac{b}{s}\rfloor*s+b\ mod\ s\),则\(a^b=a^{\lfloor\frac{b}{s}\rfloor*s}*a^{b\ mod\ s}\)
\(s\)选择\(\sqrt{p}\)可以做到根号平衡,选择合适大小的\(2\)的次幂可以位运算优化