模方程

【算法 1】当 a; p 相等时,只需要求出 a 在模 p 意义下的一个幂循环节 t,然后求解bx ≡ t(mod p) 的模方程即可。求解该模方程可以用拓展欧几里得算法。
若a不与p互质,则一定无解。证明:反证法:假设a不与p互质时有解。令d=gcd(a,p),显然d>1;设a=d*t;则a^r=(d^r) * (t^r) = 1 (mod p),即d^r * t^r - py= 1,其中 y = floor(a^r/p);提取公因数d得,d*(d^(r-1) * t^r - p/d*y) = 1;因为d>1,所以上式显然不成立。故原命题成立。证毕!
故a与p必然互质,下面求解方程bx ≡ t (mod p)的解即为原题的解。证明:a^(bx mod p) ≡ a^t (mod p),必然存在正整数x,使得a^x ≡ a^(x+t) (mod p),两边同乘a的逆元c的x次方,得 a^x * c^x ≡ a^(x+t) * c^x (mod p),因为a*c ≡ 1 (mod p),则 (a*c)^x ≡ 1 ≡ a^t (mod p),所以 a^t ≡ 1 (mod p)。故 bx mod p = t mod p 即为原方程的解。证毕!
bx ≡ t (mod p) ,即bx - py = t,故可以用扩展欧几里得算法求解。证明:bx ≡ t (mod p),即 bx -py =t。因为gcd(a,p)=1,所以 存在x',y',满足ax' + py' = 1(裴蜀定理)。两边同乘b得,a*(bx') + p*(by') = b,所以 a(bx') ≡ b (mod p),故 x ≡ bx' (mod p)。证毕!故只需用扩欧求出一组满足条件的x,y,然后将x乘上b,再模上p即可得解。
循环节t的求法:1. 暴力 :从小到大枚举k,找出a^k ≡ 1 (mod p);2.大步小步分块:a^t ≡ 1 (mod p),r = floor(sqrt(p)),设t = kr - s (s∈[0,r),k∈[1,r+1]),(k和s是有关t的函数,k和s一定能表示出t因为是减去s所以k应该不能取到0)
因为a^t ≡ 1 (mod p),一定存在一个s,使得a^(t+s) ≡ a^s (mod p),即a^kr ≡ a^s (mod p);a^kr取值范围:a^0,a^r,a^2r,a^3r,……,a^floor((p/r))*r



原文地址:https://www.cnblogs.com/ninedream/p/11808762.html