barrett约减


#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39057744/article/details/121310425
今日推荐