P5137 polynomial
这是一篇关于常数的题解,截止 2022 年 12 月 30 日我是最优解。
算法的常数
为了方便分析,假设
如果使用矩阵乘法,两个
一个更好的方法是设
- 当
n 是偶数的时候,A(n) = (A(n/2))^2 ,B(n) = (B(n/2))^2 ,S(n) = S(n/2)\,(A(n/2) + B(n/2)) - A(n/2)\,B(n/2) ,这需要4 次乘法。 - 当
n 是奇数的时候,A(n) = a\,A(n-1) ,B(n) = b\,B(n-1) ,S(n) = a\,S(n - 1) + B(n) ,这需要3 次乘法。
所以计算
当然,当
实现的常数
根据我的 benchmark,在 64 位模数下,Barrett Multiplication 比直接调用 % 快 4 倍。
-------------------------------------------------------------------------------
mod_64 - BarrettMod64T<>
benchmark name samples iterations mean
bench 100 3 4.5259 us
-------------------------------------------------------------------------------
mod_64 - NonConstMod64T<>
benchmark name samples iterations mean
bench 100 1 19.6215 us
===============================================================================
所以你应该使用 Barrett Multiplication。
最后加上快速读入。