模方程

来源:互联网 发布:泛型 java 编辑:程序博客网 时间:2024/05/18 18:45

不定方程

定义

给出一个方程ax+by=c,求x,y。

方法

不难发现,如果(a,b)不|c,肯定是无解的,因为ax+by是(a,b)的倍数,但是c不是(a,b)的倍数,所以ax+by≠c。

(a,b)|c时,我们会联想到这么一个方程:
ax+by=(a,b)
这显然就是扩展欧几里得算法的经典问题,我们很容易就可以求出一组x,y。然后我们会发现x0=x*c/(a,b),y0=y*c/(a,b)肯定就是一组解。

模方程

定义

给出一个方程ax≡c(mod b),求x。

方法

转化一下就可以得到ax+by=c,那么就变成了不定方程,稍有不同的是,我们不用管y。设d=(a,b),同理得到x0=x*c/d是一个解。

但是很多时候我们都想要最小正整数解。对于这个问题我们可以先算出解的最小正间隔,但什么是最小正间隔呢?

最小正间隔就是一个可行解和另一个可行解的最小间距,可以把最小正间距设出来,然后分析:
设dis为最小正间距,x0是一组可行解,则a(x0+dis)≡c(mod b)
将此式与ax0≡c(mod b)相减,可以得到:
a*dis≡0(mod b)即a*dis mod b=0
显然dis的最小值就是b/(a,b)=b/d(设a的质因子集合为A,b的质因子集合为B,则d的质因子集合为A∩B,即a有b也有的质因子集合,所以b/d的质因子集合为{x∈素数集合|x∉A且x∈B},即为最优解)
ps:推出最小正间距之后,不难发现x0+k*b/d,k∈Z就是所有解。
再ps:对于不定方程,显然x0+k*b/d,y0-k*a/d,k∈Z就是所有解。

算出最小正间距之后,我们就可以算出最小正整数解了。对于x0这个解,不停减去最小正间距dis即可(当然不要真的拿来减,取模即可),但是问题就是x0可能是负数,其实不难推出通项公式:(x0%dis+dis)%dis。

运用

模方程在许多定理中都有出现,用扩展欧几里得求解就特别简单了。

0 0