神奇的模运算

来源:互联网 发布:网络教室软件 编辑:程序博客网 时间:2024/05/06 14:29

    小学时,大家应该已经很熟悉“如何判断一个数能否被3或9整除”的问题。然而,为何一个数的各位数的和能被3或9整除时,该数即可以被3或9整除呢?又为何个位数是偶数时,该数即为偶数呢?有没有类似的简单的方法来判断一个数能否被7,被11整除呢?

    模运算可以很好地给出问题的答案。

    什么是模运算呢?学过离散数学基础或是有过编程经验的同学应该都知道这个概念。当我们用一个数d去除另一个数a时,如果不能整除,则会产生余数。即,a÷d=m……n,其中0<n<d.(当n=0时,d|a) 则n即为a模d的结果。

    一般地,如果整数a和b用d除有相同的余数,即有一个整数n使得a-b=nd成立(此处,d为一固定整数),我们就说a和b是摸d同余的,记做a≡b(mod d)。例如,17≡25(mod 4)。

    模运算有哪些性质,让其很有用呢?

    1)自反性。即恒有a≡a(mod d)

    2)交换性。如果a≡b(mod d),则b≡a(mod d)。

    3)传递性。如果a≡b(mod d),且b≡c(mod d),则a≡c(mod d)。

    除以上三个基本性质外,下面几个类似于数学运算中“=”的性质使模运算具有无与伦比的优势。

    如果a≡a'(mod d),b≡b'(mod d),则

    4)可加性。a+b≡a'+b'(mod d)。

    5)可减性。a-b≡a'-b'(mod d)。

    6)可乘性。a×b≡a'×b'(mod d)。


    到这里,我们已经可以解决本文开头所提出的问题了。

    首先我们来讨论下关于能被3和9整除的故事。

    1)对于任何一个在十进制系统中表示的整数z = a_0 + a_1×10 + a_2×10^2 + a_3×10^3 + …,很容易发现1≡10≡10^2≡10^3≡…≡10^n(mod 3)。应用模运算的可乘性和可加性即可知:z≡(a_0+a_1+a_2+a_3+...)mod 3。故,若一个整数的各位数之和能被3整除,即模3余0时,则该整数能被3整除。

    2)关于能被9整除的原因,由于1≡10≡10^2≡10^3≡…≡10^n(mod 9),故同理可得。

    下面我们来看下其他一些特殊的情况。

    3)对于2来说,由于1≡1(mod 2),而0≡10≡10^2≡10^n(mod 2),故z≡a_0(mod 2)。

    4)对于5来说,由于1≡1(mod 5),而0≡10≡10^2≡10^n(mod 5),故z≡a_0(mod 5)。

    接下来,我们可以来看下那些我们不是那么熟悉的情况了。

    5)对于4来说,由于1≡1(mod 4),2≡10(mod 4),而0≡10^2≡10^3≡10^n(mod 4),故z≡(a_0+2×a_2)(mod 4),即一个数的个位数+十位数*2后可以被4整除,则该数可以被4整除。(或者我们可以直接用最后两位数来判断一个数能否被4整除。比如,由于24能被4整除,所以1357872623333324能被4整除)

    6)对于8来说,与4的情况类似。z≡(a_0 + 2×a_2 + 4×a_3)(mod 8)。(即,只看最后三位数能否被8整除即可。)

    7)6在0-9中比较特殊,因为其是唯一一个有两个质数为因数的数。故我们可以用是否能被2和3整除来判断其能否被6整除。(末尾数为偶数,其各位数和可被3整除。)

    8)最为麻烦些的数是7,因为1≡1(mod 7),10≡3(mod 7),100≡2(mod 7),1000≡-1(mod 7),10000≡-3(mod 7),100000≡-2(mod 7),再向下为重复。故z≡(a_0 + 3×a_1 + 2×a_2 - 1×a_3 - 3×a_4 - 2×a_5 + ....)(mod 7)。当然,运算比较麻烦,不过还是比直接除要简单些。其可以大大降低位数,在一些数字类题目中还是有用的。

    9)另一个让我们有些惊喜的数是11。因为1≡1(mod 11),10≡-1(mod 11),100≡1(mod 11),1000≡-1(mod 11)……后面,1和-1便会交替出现了。故z≡(a_0 - a_1 + a_2 - a_3 + a_4 - a_5 + ....)(mod 11)。


    费马还有一个跟模运算有关的定理。a^(p-1)≡1(mod p),另外还有关于二次剩余的概念。

    当然,模运算美妙的地方还在于它在生活中的奇妙应用。比如,时钟…… 比如,模幂运算,凯撒密码……