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优化。

浙公网安备 33010602011771号