「数学」快速幂

原理

\[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\)的次幂可以位运算优化

posted @ 2021-09-22 21:58  lovelyred  阅读(61)  评论(0编辑  收藏  举报