2025.7.18 闲话
图


介于有人问 EI 的取模还原分数是什么道理,并且 EI 也没有解释 . 我通过逆向工程大概解释一下正确性,个中道理可能涉及深刻就不解释了(
问题:给定 \(p\in\mathbb P,q\),求尽可能小的 \(a,b\) 使得 \(\frac ab\equiv q\pmod p\) .
动态维护 \((x,y,a,b)\) 使得 \(\frac xa\equiv\frac yb\equiv q\pmod p\)(初始取 \((x,y,a,b)=(q,p,1,0)\)),每次迭代:
\[(x,y,a,b)\to\left(y\bmod x,x,b-\left\lfloor\frac yx\right\rfloor a,a\right)
\]
\(x\) 足够小时停止 .
Remark.
考虑到:
\[x\equiv qa\pmod p\qquad y\equiv qb\pmod p \]右边减 \(\left\lfloor\frac yx\right\rfloor\) 倍的左边:
\[y-\left\lfloor\frac yx\right\rfloor x\equiv qa-q\left\lfloor\frac yx\right\rfloor b\pmod p \]也即
\[y\bmod x\equiv q\left(a-\left\lfloor\dfrac yx\right\rfloor b\right)\pmod p \]
这里 \(x,y\) 的降落速度由 Euclid 算法给出,由于有 \(x,y\) 可以立得唯一的 \(a,b\) 所以 \(a,b\) 的降落速度可以不用管 .
附带 EI 代码压行版:
pair<int, int> approx(int p, int q, int A) // x <= A
{
int x = q, y = p, a = 1, b = 0;
while (x > A) tie(x, y, a, b) = make_tuple(y % x, x, b - y / x * a, a);
return make_pair(x, a);
}
upd. 请看 killer_joke 的解释 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18991114
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ

浙公网安备 33010602011771号