Barrett Reduction

Barrett reduction

给定位长\(\omega\),被除数\(n\)和除数\(m\),满足\(m\in[2,2^{\omega}),n\in[0,2^{\omega-1})\),记\(k=\lfloor\log(m-1)\rfloor,x=\lceil\frac{2^{k+\omega}}m\rceil\),那么我们有:\(\lfloor\frac nm\rfloor=\lfloor\frac{nx}{2^{k+\omega}}\rfloor\)

既然能快速计算除法,那么我们也就能快速计算取模了。
一般来说对\(10^9\)级别的数取模会消耗\(1\)\(\text{int128}\)的乘法、\(1\)\(\text{int128}\)的右移和\(1\)\(\text{long long}\)的乘法。
实际上如果你是对一个常数取模/除以常数,在开启\(\text{O2}\)等编译优化选项之后编译器会自动采用Barrett reduction优化。

posted @ 2020-05-27 20:04  Shiina_Mashiro  阅读(1137)  评论(0)    收藏  举报