基于值域预处理的快速 GCD

功能简述

可在 \(\mathcal{O}(v)-\mathcal{O}(1)\) 的时间内多次询问 \(\gcd(n,m)(1\le n,m\le v)\)

算法过程

定理:对于任意正整数 \(n\),存在三个正整数 \(a,b,c\) 满足 \(abc=n\)\(a,b\le\sqrt{n}\)\(c\le\sqrt{n}\)\(c\in\mathbb{P}\) 中有至少一个成立。

证明:

采用数学归纳法,易得 \(n=1\) 时成立。

对于正整数 \(n\),设 \(p\) 为其最小质因数,\(a',b',c'\)\(\dfrac{n}{p}\) 的一合法分解(\(a'\le b'\le c'\)),则:

  • \(p\le\sqrt[4]{n}\),则因为 \(a'\le\sqrt[3]{\dfrac{n}{p}}\),所以 \(pa'\le p\sqrt[3]{\dfrac{n}{p}}=\sqrt[3]{np^2}\le\sqrt{n}\),所以 \(pa',b',c'\) 为一符合条件的解;
  • \(p>\sqrt[4]{n}\),则若 \(a'>p\),则 \(n=pa'b'c'>p^4>n\),矛盾!故 \(a'<p\),而又有 \(p\)\(n\) 的最小质因数,所以 \(a'=1\),故 \(p,b,c\) 为一符合条件的解。

综上所述,原命题成立。

这也揭示了将 \(n\) 分解为满足上述条件的 \(a,b,c\) 的方法:线性筛后将 \(n\) 最小素因子 \(p\) 乘给 \(\dfrac{n}{p}\) 分解成的三个数中最小的数即可。

所以当询问 \(\gcd(n,m)\) 时,可以将 \(n\) 分解为这样的 \(abc\),每次求 \(t=\gcd(a/b/c,m)\) 后,将最终结果乘上 \(t\) 并将 \(m\) 除以 \(t\),即可得解。

具体地,若此时考虑到的数 \(x\) 为素数,则求 \(\gcd(x,m)\) 是简单的;否则必有 \(x\le\sqrt{n}\),而 \(\gcd(x,m)=\gcd(x,m\bmod x)\),所以只需预处理出 \(\sqrt{v}\) 内任意两个数的 \(\gcd\)\(\mathcal{O}(1)\) 查询即可。

时间复杂度:\(\mathcal{O}(\sqrt{v}^2)=\mathcal{O}(v)\) 预处理,\(\mathcal{O}(1)\) 查询。

posted @ 2025-11-12 09:17  hhoppitree  阅读(72)  评论(0)    收藏  举报