以前,有个地方,这里住着东之人和西之人,东之人只能往东走,西之人只能往西走。好在这个地方有公共马车,可以搭载他们向东和向西走。
例如一个东之人,要向他东边4公里的一个地方,马车每隔3公里可以停一下,于是他坐车到3公里处下车,再向东走了一公里。
divmod(4,3)
(1, 1)
而一个西之人,也是要到东边4公里的地方,但是因为他只能往西走,所以他必须坐车经过目的地,在下一站即6公里处下车,此时他做了2站,然后向此时位于他西边的目的地走2公里。
divmod(4,-3)
(-2, -2)
一个东之人向西4公里处:
divmod(-4,3)
(-2, 2)
一个西之人向西4公里处:
divmod(-4,-3)
(1, -1)
参数中的第一个数是到目的地的距离,正数是要向东,负数是要向西。
参数中的第二个数是马车每站地间的距离,正数是东之人,负数是西之人。
结果中的第一个值,是做过几站地,正数是东之人去东边,或西之人去西边。负数,是东之人去西边,或西之人去东边。
结果中的第二个值,是又走了多少路,正数是东之人走的路,负数是西之人走的路。
模数的真正意义,从何诞生,我并不知晓,可能只是数学家的一个小游戏,但据说现在被应用在许多地方,物理学、计算机编程等。
Python基础教程 第三版 第四页
对于整除运算,需要明白的一个重点是它向下圆整结果。因此在结果为负数的情况下,圆整后将离0更远。这意味着对于-10 // 3,将向下圆整到-4,而不是向上圆整到-3。
补充
负数的除法和取模运算(Python 2.7和C的比较)
Python’s modulo operator and floor division
1、取模,来自欧几里得算法
2、数论,有提到负数的取模
3、python中,为了方便使用了向负取整,所以取模就相应的变为以上规则。
x = (x // y) * y + (x % y)
以前的糟粕
之前片面的成果,仅考虑了取模,没考虑取整,考虑取整后,上面的小故事又好理解,又好记忆!
另类的运算符,于是查,啥是模!
modulo:
(in number theory) with respect to or using a modulus of a specified number. Two numbers are congruent modulo a given number if they give the same remainder when divided by that number.(在数论中)关于或使用指定数的模。如果两个数除以一个给定数得到相同的余数,则这两个数是一个给定数的同余模。
“19 and 64 are congruent modulo 5”
modulus:比,率;基本单位,计量单位;系数,指数
A natural number used as a specified divisor in modular arithmetic. 在模运算中用作指定除数的自然数。
modular:模块
a%b=c
我更愿意理解为,B是一个固定的模块,C是A最大整数模块B后,剩下的量。
我在搜索到的视频中,看到一个用时钟来做比较的,但还是听的模糊,因为我并没有理解模到底是个啥,于是用bing和翻译得到以上的结果。了解模到底是啥后,就能用自然语言去概括了。
a%b=c
当模块是个负数时,其他数与他运算得到的模数都是负数,范围是[b+1,0]。
如果是个正数,就是[0,b-1]
当常规的情况下,a和b都是正整数,用最自然的语言去描述,每次减掉b个数,就进入了下一个循环,即当a-b时,下一个循环就是(a-b)-b,如果一个一个的减,当减掉b个数时,他又回到了原点,要去减下一波b,就像是钟表的12与0重合一般。
最后减的不够减了,要么没有了,b被a整除。那模就是0。要么剩下的不够余下的整除,余下的一个一个的填到这个循环里,最后填到几,模就是几。其实就是这个循环时,剩几是几。
但如果引入了负数。
模块这个词我不知道那个年代出现的,假设他是计算机时代在计算机编程运算时出现,那我们就用计算机的思维去理解。就如常数e出现的故事一样。就很容易理解了。如果模就是为了计算机而出现的。
那程序员定义,a%b=c中,b就是个模块。正数就是0到+∞的方向,负数就是0到-∞的方向。但模块循环后,又回到了最初的0,而准备下一个循环,那么就把模块当作一个圆。无论模块b还是数值a,只要是整数,就是顺时针,只要是负数,就是逆时针。
把数一层一层的缠绕,最后的终点就是模数。正好我们假设的结构等同于那真TM黑的运算结果。那就把这个假设当作真实。
然后我们去用一个能套的上的运算式来概括这个缠绕。
a%b=c 参考上面的图
假设a/b仍是常规规则。
如果a>=0,b>0。
c=(a-b*int(a/b))
如果a>=0,b<0
c=-(|b|-(a-|b|*int(a/|b|)))
如果a<0,b>0
c=b-(|a|-int(|a|/b))
如果a<0,b<0
c=-(|a|-|b|*int(|a|/|b|))
要是不理解其本质,强行记公式的话,头晕喷血。
可能是每个人都有每个人的本性吧,我讨厌理科复杂的公式是有一点点本性的原因的,其他的原因就是人生了。
但要是把个绕绕的图记住,那就不是个事了!
那这个模数到底有啥用,真要让编书、教课的老师好好学学历史!
作者:一心月
https://www.bilibili.com/read/cv6406588
出处: bilibili