神奇的模运算
来源:互联网 发布:网络教室软件 编辑:程序博客网 时间: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),另外还有关于二次剩余的概念。
当然,模运算美妙的地方还在于它在生活中的奇妙应用。比如,时钟…… 比如,模幂运算,凯撒密码……
- 神奇的模运算
- 神奇的 取模运算
- 模运算——神奇的9
- ++运算符的神奇!
- 神奇的位运算
- 神奇的位运算
- 神奇的位运算
- 神奇的位运算
- 神奇的位运算
- 神奇的位运算
- 神奇的异或运算
- 神奇的取反运算
- 神奇的C++位运算& | << >> ^ ~ %
- 神奇的运算符——取模
- zoj 3432 神奇的位运算。。
- [短码基础] 神奇的位运算
- 算法之神奇的位运算
- 神奇的位运算(bitwise trick)
- android touch事件解析
- Handler的使用
- 五年软件开发的一点自我总结
- 关于ndk和sdk旧版本的下载方法
- 使用Batch_Compiler把bat,cmd命令行转成exe
- 神奇的模运算
- LeetCode - Surrounded Regions
- IOS NSDictionary和NSMutableDictionary例子
- c++ 画图像直方图
- hdu - 1026 - Ignatius and the Princess I
- Android入门进阶教程(1)-android扫盲
- eclipse或者SpringToolSuite里访问tomcat首页出现404错误解决之法
- CodeSmith&NetTiers Step by Step [转]
- wxPython in Action (wx.ListBox)