Barrett Reduction
ย - Last update: 2023-07-18

Barrett Reduction

Assembly Level์—์„œ ๊ฐ€์žฅ ๋А๋ฆฐ Arithmetic ์—ฐ์‚ฐ์„ ๊ผฝ์œผ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, modular ์—ฐ์‚ฐ์ผ ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต PS์—์„œ๋Š” ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์ด ์†Œ์ˆ˜๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ modular ์—ฐ์‚ฐ์„ ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ์ด ๊ฒฝ์šฐ ์ผ๋‹จ modular ์—ฐ์‚ฐ ์ž์ฒด๋ฅผ ์ค„์ด๋Š”๊ฒŒ ์ฒซ๋ฒˆ์งธ๊ณ , ๋„์ €ํžˆ ์•ˆ๋  ๊ฒฝ์šฐ ์ฐจ์„ ์ฑ…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ modular ์—ฐ์‚ฐ์„ ๊ณฑ์…ˆ๊ณผ if ๋ถ„๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹จ, modular๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฐ’์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. (์ฆ‰, MOD๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋ฉด ์•ˆ๋œ๋‹ค.) ๋˜ํ•œ, ์ด MOD๋Š” 32๋น„ํŠธ ์ž๋ฃŒํ˜• ์•ˆ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— 128๋น„ํŠธ ์ž๋ฃŒํ˜•์ด ์ž ์‹œ ์‚ฌ์šฉ๋œ๋‹ค. MSVC์—์„œ๋Š” ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.

constexpr ll MOD = 1000000007;
constexpr ll IMOD = 0xFFFFFFFFFFFFFFFF / MOD + 1;
inline ll modular(ull n) {
ull x = ull((__uint128_t(n) * IMOD) >> 64);
unsigned int r = n - x * m;
return m <= r ? x - 1 : x;
}

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š”

a = b % MOD;

์œ„ ์ฝ”๋“œ๊ฐ€

a = modular(b);

๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ์„œ๋‘์— ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ IMOD ๊ฐ’์€ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋†€๋ผ์šด ์ ์€ ํ•จ์ˆ˜ ์•ˆ์˜ ๋ชจ์–‘์ด ์ €๋ ‡๊ฒŒ ๋ณต์žกํ•œ๋ฐ๋„ ์ผ๋ฐ˜ modular ์—ฐ์‚ฐ๋ณด๋‹ค ๋น ๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ..

์ฐธ๊ณ ์ž๋ฃŒ

๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: