本文源自http://zh.wikipedia.org/wiki/User:Gqqnb/笔记/计算机安全与数论。
本文已经完整解释了有关问题,若对扩展欧几里得算法不甚理解,可参考《扩展欧几里得算法是干什么用的?》。
通常谈到[[最大公因数]]时, 我们都会提到一个非常基本的事实: 给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)。[1]
有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解。
例如,用类似[[辗转相除法]],求47x+30y=1的整数解。
* 47=30*1+17
* 30=17*1+13
* 17=13*1+4
* 13=4*3+1
然后把它们改写成“余数等于”的形式
* 17=47*1+30*(-1) //式1
* 13=30*1+17*(-1) //式2
* 4=17*1+13*(-1) //式3
* 1=13*1+4*(-3)
然后把它们“倒回去”
* 1=13*1+4*(-3) //应用式3
* 1=13*1+[17*1+13*(-1)]*(-3)
* 1=13*4+17*(-3) //应用式2
* 1=[30*1+17*(-1)]*4+17*(-3)
* 1=30*4+17*(-7) //应用式1
* 1=30*4+[47*1+30*(-1)]*(-7)
* 1=30*11+47*(-7)
得解x=-7, y=11。
这个方法疑似就是[[扩展欧几里德算法]]。
模运算
例题1:试求同余方程 x + 11 ≡ 7 (mod 17) 的解。
解:x ≡ 7 - 11 ≡ -4 ≡ 13 (mod 17) 。余数可以是负的,所以-4便是答案。但当我们在模 n 之下工作时,喜欢将最后的答案表示为介于 0 与 n - 1 之间的整数。
除法原理:在模 n 下,若要两边同除以某数,该数须与 n 互质。
例题2:利用除法原理,求同余方程 4x + 11 ≡ 7 (mod 17) 的解。
解:4x ≡ 7 - 11 ≡ -4 (mod 17), 所以 x ≡ -1 ≡ 16 (mod 17)。 被 4 除没问题,因为 gcd(4,17) = 1。
例题3:试求同余方程 3x +12 ≡ 17 (mod 21) 的解。
读者可以自行尝试一下,再继续看本文。
这些同余方程可以转化为整系数二元一次方程之整数解的问题。
- 3x +12 ≡ 17 (mod 21)
- => 3x+12=17+21y
- => 3x+21y=5(y的正负无所谓)。
读者可能还没试到解,其实,[[贝祖等式]]说因为3和21(x和y的系数)的最大公约数是3,不是5的倍数,所以此方程无解。
同余方程的线性表示
对于任意的同余方程a ≡ b (mod n),都有
(根据定义,a,b同余,m就是它们在模n下的余数),然后a-b=(x-y)n =>
a-b=kn。
例题4:试求同余方程 5x + 7 ≡ 11 (mod 17) 的解。
解:5x ≡ 4 (mod 17)。两边可以除以5,因为5和17互质。但<math>\frac{4}{5}</math>在模 17 之下是什么意思呢? 我们知道 4 ≡ 21 ≡ 38 ≡ 55 ≡ ··· (mod 17), 所以 5x ≡ 4 (mod 17) 与 5x ≡ 55 (mod 17) 是一样的。恰好55又是5的倍数,所以现在我们可除以 5 得到 x ≡ 11 (mod 17) 为其答案。 注意 4 ≡ 11* 5 (mod 17), 所以在模 17 之下 11 就如同是一样。到了这里,就可以引入模反元素这个概念了。
模反元素
例题4也可以这么算:不知怎么的,我们知道了5 * 7 ≡ 1 (mod 17)。就如同
,
是5的[[乘法逆元]]一样,我们把7称为5在模17下的'''[[模反元素]]'''。
疑似模反元素可以为负数,只要绝对值小于模就可以了(可以参考[[余数]]的范围);但人们往往喜欢把它“正过来”。
求模反元素
已知a,求a在模b下的模反元素。
设有ax ≡ 1 (mod b),然后把它写成线性方程 ax-1=by => ax+by=1。
已知扩展欧几里德算法可求形如ax+by=1的方程的整数解,于是ExtendedGCD(a,b)={1,x,y},得模反元素为x。
参考
[http://www.youtube.com/watch?v=FjliV5u2IVw Diophantine Equation: ax+by=gcd(a,b) ]
[1]. 沈渊源. 数论轻松游 [2012-11-27] (zh-TW).