zoukankan      html  css  js  c++  java
  • 「数学」快速幂

    原理

    [a^n=egin{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)

    加速线性变换

    三维空间中

    [egin{bmatrix}1 & 0 & 0 & a \0 & 1 & 0 & b \0 & 0 & 1 & c \0 & 0 & 0 & 1end{bmatrix}*egin{bmatrix}x\y\z\1end{bmatrix}=*egin{bmatrix}x'\y'\z'\1end{bmatrix} ]

    (x)(a)(y)(b)(z)(c)

    [egin{bmatrix} a & 0 & 0 & 0 \ 0 & b & 0 & 0 \ 0 & 0 & d & 0 \ 0 & 0 & 0 & 1end{bmatrix} ]

    (x)放大(a)倍,(y)放大(b)倍,(z)放大(c)

    [egin{bmatrix} 1 & 0 & 0 & 0 \ 0 & cos heta & sin heta & 0 \ 0 & -sin heta & cos heta & 0 \ 0 & 0 & 0 & 1end{bmatrix} ]

    (x)轴旋转( heta)

    模意义下大整数乘法

    龟速乘:将乘法拆分成二进制加放放置爆long long

    快速乘:

    [a*b mod m=a*b-lfloorfrac{ab}{m} floor*m ]

    利用(unsigned long long)的自然溢出,减法前后两部分都自然溢出,差值不变

    [a*b mod m=a*b-lfloorfrac{ab}{m} floor*m=(a*b-lfloorfrac{ab}{m} floor*m) mod 2^{64} ]

    对于(lfloorfrac{ab}{m} floor)可以用(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^{lceilfrac{p}{s} ceil})

    每次询问(a^b mod p),将(b)拆分为(lfloorfrac{b}{s} floor*s+b mod s),则(a^b=a^{lfloorfrac{b}{s} floor*s}*a^{b mod s})

    (s)选择(sqrt{p})可以做到根号平衡,选择合适大小的(2)的次幂可以位运算优化

  • 相关阅读:
    Windows环境下Unicode编程总结
    我的CS脚本autoexec.cfg
    完成端口与高性能服务器程序开发[引用]
    调用未知DLL中的导出函数
    兼容Vista 赛门铁克公测新杀毒软件
    I Love You的真正含义
    码根码
    木马经典十大藏身地点大搜查
    Windows调试器及不同平台符号包下载地址(收集)
    “千般路”与“磨豆腐”
  • 原文地址:https://www.cnblogs.com/knife-rose/p/15321940.html
Copyright © 2011-2022 走看看