数论及Python实践
从排列与组合的python实现到”生日问题”的解释
如果两个数之差能被 m 整除,我们就说 a 和 b 对模数 m 同余(关于 m 同余)。我们常把 amod3=1 记做 a≡1(mod3) 。
之所以把同余当做一种运算,是因为同余满足运算的诸多性质。(如何发明新的数学?:-D)
顾名思义,余数相同,记为:
基本性质如下:
整除性
也就是一般同余式的左侧大于右侧( a≥b )
等价性
同余运算只关心余数,而不关心”整数”的部分;
可通过最后几位判别:
ar 表示的是一个十进制数的每一位,下标由小到大(从又向做), 123=3×100+2×101+1×102 ,同余的含义即是如果想求得左端对某个数的余数等价于右端对每个数的余数,而右端是对左端的一种截断(保留其中的 k 位)。
可得如下的一些小结论:
±2 ( 2k(k=1) ),则 ∑r=0k−110rar ,只保留最后一位,也即 a0 是否能够被2整除,也即判断最后一位是否为0,2,4,6,8
±4 ( 2k(k=2) ),也即判断最后两位是否能被4整除
±8 ( 2k(k=3) ),也即判断最后3位是否能被8整除
±5 ( 5k(k=1) ),也即判断最后一位是否被5整除,也即为5/0
±10 ( 10k(k=1) ),也即判断最后一位是否被10整除,也即为 0
来证明小学三年级的题:
一个数能否被2整除,只需要看它的个位能否被2整除即可。
这是因为10能被2整除,因此一个数 10a+b 能被2整除当且仅当 b (也即是个位数)能被2整除。(同理可证一个数能被5整除,10*a+b,b能被5整除,b为0或5)
一个数能被3整除只需看各位数之和是否能被3整除。
因为 10n−1 总能被3整除,例如 2345=2(999+1)+3(99+1)+4(9+1)+5=2∗999+3∗99+4∗9+2+3+4+5 。
我们来看其他进制的情况,是因为 10≡1(mod3)⇒10n≡1(mod3) ,我们来考虑36进制的情况,其与1同余(关于7),也即 36≡1(mod7)⇒36n≡1(mod7)⇒36n−1≡0(mod7) ,所以同理,判断一个数是否能被7整除,也是它的各位之和能被7整除。 1114=1(363−1+1)+1(362−1+1)+1(361−1+1)+4=(363−1)+(362−1)+(361−1)+1+1+1+4 ,也是其各位之和。
我们再来一个常规的,如十六进制关于5(或者关于3), 16≡1(mod5)⇒16n≡1(mod5)⇒16n−1≡0(mod5) ,
以上情况都是在判断某种进制下的数 a 能否被某个数 b 整除时,转化为该数 a 的各位之和能否被数 b 整数来判断。
[1] 同余——07年NOIp模拟赛by Matrix67 解题报告