密码学 模运算
取模运算(“Modulus Operation”)
它和取余运算(“Remainder Operation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。 模运算在数论和程序设计中都有着广泛的应用,奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题到凯撒密码问题,无不充斥着模运算的身影。虽然很多数论教材上对模运算都有一定的介绍,但多数都是以纯理论为主,对于模运算在程序设计中的应用涉及不多。
“模”是指一个计量系统的计数范围;如时钟,12个整点为计算范围,则模为12;计算机也是一个计量机器,模为32位或者64位;
32位计算机正常理解 在模 范围内能表达的 有 [0, 2³²-1];那么负数该怎么表达呢,所以出现了补码;也就是 正数 + 负数 正好达到模的溢出阀值2³²;所以在计算机中负数是用补码方式表达的原因;
关于补码的例子:在12模的时钟中;假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法
- 倒拨4小时,即:10-4=6 (10-4) mod 12 = 6
- 顺拨8小时:10+8=12+6=6 (10+8)mod 12 = 6
在以12模的系统中,加8和减4效果是一样的;因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中11和1、10和2、9和3、7和5、6和6都有这个特性;共同的特点是两者相加等于模
“取模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数(取模);任何有模的计量器,均可化为加减法运算
5 mod 3 = 2 例子中;模 为 3;2 为取模的值
取模和取余的区别
1.相同
假设有整数a和b,那么取模/取余运算可以分为两步运算:
求整数商:c = a/b; 计算模/余数:2.计算模或者余数: r = a - c*b.
2.不同
取余运算 在计算商值时 商值向0方向舍入;靠近0原则 取模运算 在计算商值时 商值向负无穷方向舍入;尽可能让商值小的原则(不超多商值的最大值)
求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
例子
取模
简述 | 商值 | 取模值 | |
---|---|---|---|
5 mod 3 = 2 | 5/3 = 1.66商取小原则 商=1 | 5 - 3 * 1 = 2 | 2 |
-5 mod 3 = 1 | -5/3 = -1.66 商取小原则 商=-2 | -5 - (3 * -2) = 1 | 1 |
5 mod -3 = -1 | 5/-3 = -1.66 商取小原则 商=-2 | 5 - (-3 * -2) = -1 | -1 |
-5 mod -3 = -2 | -5/-3 = 1.66 商取小原则 商=1 | -5 - (-3 * 1) = 2 | -2 |
取余
简述 | 商值 | 取余值 | |
---|---|---|---|
5 rem 3 = 2 | 5/3 = 1.66 | 商靠0原则 商=1 | 5 - 3 * 1 = 2 2 |
-5 rem 3 = -2 | -5/3 = -1.66 商靠0原则 商=-1 | -5 - (3 * -1) = - 2 | -2 |
5 rem -3 = 2 | 5/-3 = -1.66 商靠0原则 商=-1 | 5 - (-3 * -1) = 2 | 2 |
-5 rem -3 = -2 - | 5/-3 = 1.66 商靠0原则 商=1 | -5 - (-3 * 1) = - 2 | -2 |
java 中 % 是取余运算;Python中 % 是取模运算
Python代码
## 取模,Python中可直接用%,计算模,r = a % b
def mod(a, b):
c = a // b
r = a - c * b
return r
## 取余
def rem(a, b):
c = int(a / b)
r = a - c * b
return r
x=mod(-5,3)
y=rem(-5,3)
print(x,y)
输出结果 1 -2
更多建议: