取模运算(多用于计算机)与 取余运算(多用于数学概念) 有重叠当不完全一致,
主要区别在于对 负整数进行除法运算时操作不同, 对于正整数两者结果一致。
取模运算 对于负数是 向负无穷的方向舍入, 如 -7 % 4 = 1
计算步骤:
1. 求整数商 c = a/b = -7/4 = -1.75 = -2 ( 此时向负无穷的方向舍入!!)
2. 计算模和余数 m = a - b * c = -7 - (4 * -2) = 1
取余运算 对于负数是 向0方向舍入, 如 -7 % 4 =-3
计算步骤:
1. 求整数商 c = a/b = -7/4 = -1.75 = -1 ( 此时向0方向舍入!!)
2. 计算模和余数 m = a - b * c = -7 - (4 * -1) = -3
可以看出主要是计算出商的结果 导致取模和取余的结果不一致
不同的编程语言 %运算符的含义也有所不同, 比如c/c++, java, javascript 为取余, 而python则为取模
即 python中执行 -7 % 4 结果是 1
javascript 中执行 结果是-3
取模运算的结果一定是非负数
对应 % 是取余运算的编程语言 可以使用 【
例如 -7 % 4 = ((-7 % 4) +4) %4 = 1 (在javascript环境下的%)
对应 % 是取模运算的编程语言 可以使用 【
例如 -7 % 4 = -7 - (-7 /4 的商, -1.75 向0方向舍入, 即 -1 ) *4 = -3 (在python环境下的%)
p | a 表示 p 能整除(即余数0) a,即 a 是 p 的倍数。 例如: 7|21 、 5|20 、 3 |10 (因为3不能整除10)
同余数: 正整数a, b对p取模, 它们的余数相同, 记做
正负只有除数相关: n % p 正负由被除数n决定,与p无关, 例 7 % 4 = 3, -7 % 4 = -3, 7 % -4 = 3, -7 % -4 = -3
若 p|(a-b), 则 a ≡ b mod p。 例如 "7|(11-4)" 等同 "11 ≡ 4 mod 7" 即 "11 mod 7 = 4 mod 7"
模运算的实际应用:
时钟 17点是几点? 17 % 12 = 5, 下午5点
奇偶数判断: x % 2 结果 0 则是偶数 1 则是奇数
素数的判断 x % {0,1,...i} 遍历,如果有 取模等于0时非1或者本身, 则是非素数
...
⚠️由于 "a - b" 可能是负数,所以可以加上 "+p" 以确保结果非负
⚠️ 注意 上面的 加法、减法、乘法 公式最终都得 再 mod p
例如: 加法运算 当 a = 7, b = 8, p = 10 如果 右侧的
原理:
如果 a = 3, p = 5的情况下
根据自反性
此时 只要找到一个正整数 x 使
可以计算的出 x = 2 满足该 条件
1 mod 任何数都为1, 可得
最终 :
性质:
互为逆元: a 在 模p 下 有逆元 x, 那么 x在模p下逆元即是 a
逆元唯一: a 在 模p 下乘法逆元是唯一的, 如 模5 下 2 和3 互为逆元,且没有别的逆元了!!
逆元可能是本身:
如 1在不管模哪个整数,都以自己为逆元;
模5的情况下, 4 * 4等于1, 即 模5下 4的乘法逆元即为本身;
模4的情况下 3 * 3等于1, 即 模4下 3的乘法逆元为本身
乘法逆元不一定存在,需 “gcd(a,p) =1” ,即a和 p最大公约数是1(互素), 模n下才会有 a的乘法逆元
例如 2 * x ≡ 1 (mod 4), 此时 在模4下 不存在2的乘法逆元 1 mod 4则 一定是奇数, 而 2 * x 一定是偶数 所以该条件不成立
求模逆:
1. 扩展的欧几里得算法
设a和b的最大公约数是d即 `gcd(a,b) = d` 那么一定存在两个数 s 和t 使得
回到求模逆,前提条件就需要 `gcd(a,p) = 1` 代入
此时两边同时进行 模 p 处理可得
可以 看出 模 n 下a的逆元就是 s,使用扩展的欧几里得算法可求出s
2. 快速幂法(费马定理)
待定...
要计算:
例如:
可得