#include<iostream>
using namespace std;
struct Barret {
int p;
int k;
int u;
int bk_1, bka1;
Barret(int p) {
this->p = p;
k = (int)log2(p) + 1;
u = (1<<(2*k))/p;
bk_1 = 1 << (k - 1);
bka1 = 1 << (k + 1);
}
int calc(int z) {
int q_ = (z / bk_1 * u / bka1);
int r = (z & (bka1 - 1)) - (q_ * p & (bka1 - 1));
if (r < 0)r = r + bka1;
while (r >= p)r = r - p;
return r;
}
};
int main(int argc, char** argv) {
auto t=Barret(255);
cout<<t.calc(300045)<<' '<<300045%255;
}
barrett约减
猜你喜欢
转载自blog.csdn.net/weixin_39057744/article/details/121310425
今日推荐
周排行