模运算的概念和性质

0x00 模运算的概念

整数除法运算中,被除数 A,除数 B,运算结果商为 Q,余数为 R,表示如下:
A B = Q  remainder  R \frac{A}{B} = Q\text{ remainder }R BA=Q remainder R

其中:

  • A is the dividend
  • B is the divisor
  • Q is the quotient
  • R is the remainder

利用上面的算式我们将模运算表示为:
A  mod  B = R A \text{ mod } B = R A mod B=R

数论中的模运算 (Modulo Operation) 与解析几何中的模 (Norm) 没有任何关联。


0x01 模运算和余运算的区别

模运算(Modulo Operation)和余运算(Remainder Operation)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。模运算主要用于计算机术语中,余运算则更多是数学概念。

对于整数 a, b 来说,模运算或者余运算的方法都是:

  1. 求整数商: c = [ a / b ] c = \lbrack a / b \rbrack c=[a/b]
  2. 计算模或者余数: r = a − c ⋅ b r = a - c \cdot b r=acb

求模运算和求余运算在第一步不同:

  • 模运算在计算 c 的值时使用 floor() 函数;
  • 余运算在取 c 的值时使用 fix() 函数;

四种取整运算

  • floor() // 向 − ∞ -\infty 方向取整
  • ceil() // 向 + ∞ +\infty + 方向取整
  • fix() // 向 0 方向取整
  • round() // 四舍五入到最近的整数

例如:

  • ( − 7 )  mod  4 = − 7 − ( − 2 ) ⋅ 4 = 1 (-7) \text{ mod } 4 = -7 - (-2) \cdot 4 = 1 (7) mod 4=7(2)4=1
  • ( − 7 )  rem  4 = − 7 − ( − 1 ) ⋅ 4 = − 3 (-7) \text{ rem } 4 = -7 - (-1) \cdot 4 = -3 (7) rem 4=7(1)4=3

在不同的计算机语言中 % 运算符的含义不同,例如 C/C++/Go/Java/JavaScript 为余运算,而 Python 为模运算;
专业的数学软件语言中会将模运算和余运算区分开,例如 MATLAB 中的 modrem


0x02 模运算的性质

模运算与基本四则运算有些相似,除法例外。其规则如下:

( a + b )  %  p = ( a  %  p + b  %  p )  %  p (1) (a + b)\text{ \% } p = (a \text{ \% } p + b \text{ \% } p)\text{ \% } p \tag{1} (a+b) % p=(a % p+b % p) % p(1)
( a  -  b )  %  p = ( a  %  p  -  b  %  p )  %  p (2) (a \text{ - } b)\text{ \% } p = (a \text{ \% } p \text{ - } b \text{ \% } p)\text{ \% } p \tag{2} (a - b) % p=(a % p - b % p) % p(2)
( a ⋅ b )  %  p = ( a  %  p ⋅ b  %  p )  %  p (3) (a \cdot b) \text{ \% } p = (a \text{ \% } p \cdot b \text{ \% } p) \text{ \% } p \tag{3} (ab) % p=(a % pb % p) % p(3)
( a  ^  b )  %  p = ( ( a  %  p )  ^  b )  %  p (4) (a \text{ \textasciicircum\ } b) \text{ \% } p = ((a \text{ \% } p) \text{ \textasciicircum\ } b) \text{ \% } p \tag{4} (a ^ b) % p=((a % p) ^ b) % p(4)

结合律:
( ( a + b )  %  p + c )  %  p = ( a + ( b + c )  %  p )  %  p (5) ((a + b) \text{ \% } p + c) \text{ \% } p = (a + (b+c) \text{ \% } p) \text{ \% } p \tag{5} ((a+b) % p+c) % p=(a+(b+c) % p) % p(5)
( ( a ⋅ b )  %  p ⋅ c )  %  p = ( a ⋅ ( b ⋅ c )  %  p )  %  p (6) ((a \cdot b) \text{ \% } p \cdot c) \text{ \% } p = (a \cdot (b \cdot c) \text{ \% } p) \text{ \% } p \tag{6} ((ab) % pc) % p=(a(bc) % p) % p(6)

交换律:
( a + b )  %  p = ( b + a )  %  p (7) (a + b) \text{ \% } p = (b+a) \text{ \% } p \tag{7} (a+b) % p=(b+a) % p(7)
( a ⋅ b )  %  p = ( b ⋅ a )  %  p (8) (a \cdot b) \text{ \% } p = (b \cdot a) \text{ \% } p \tag{8} (ab) % p=(ba) % p(8)

分配律:
( ( a + b )  %  p ⋅ c )  %  p = ( ( a ⋅ c )  %  p + ( b ⋅ c )  %  p )  %  p (9) ((a +b) \text{ \% } p \cdot c) \text{ \% } p = ((a \cdot c) \text{ \% } p + (b \cdot c) \text{ \% } p) \text{ \% } p \tag{9} ((a+b) % pc) % p=((ac) % p+(bc) % p) % p(9)

证明: ( a b )  %  p = ( ( a  %  p ) b )  %  p (a ^ b) \text{ \% } p = ((a \text{ \% } p) ^ b) \text{ \% } p (ab) % p=((a % p)b) % p

  • 假设 a / p = Q , a % p = R a / p = Q, a \% p = R a/p=Q,a%p=R,可以得到 a = p Q + R a = pQ + R a=pQ+R
  • 将 a 代入 ( a b )  %  p (a^b) \text{ \% } p (ab) % p,得到 ( ( p Q + R ) b )  %  p ((pQ + R)^b) \text{ \% } p ((pQ+R)b) % p
  • 由二项式定理: ( p Q + R ) b = ∑ r = 0 b C b r ( p Q ) b − r ( R ) r (pQ + R)^b = \sum_{r=0}^{b}C_{b}^{r}(pQ)^{b-r}(R)^{r} (pQ+R)b=r=0bCbr(pQ)br(R)r ,当 b − r ≠ 0 b-r \neq 0 br=0 时,存在 p p p 的算子中都可以被 p p p 整除,所以: ( ( p Q + R ) b )  %  p = C b b ( p Q ) 0 ( R ) b = ( R ) b  %  p = ( a  %  p ) b  %  p ((pQ + R)^b) \text{ \% } p = C_{b}^{b}(pQ)^{0}(R)^{b} =(R)^{b} \text{ \% } p = (a \text{ \% } p)^b \text{ \% } p ((pQ+R)b) % p=Cbb(pQ)0(R)b=(R)b % p=(a % p)b % p

参考文档

  1. https://en.wikipedia.org/wiki/Modulo_operation
  2. https://baike.baidu.com/item/%E5%8F%96%E6%A8%A1%E8%BF%90%E7%AE%97
  3. https://crypto.stanford.edu/pbc/notes/numbertheory/
  4. https://www.khanacademy.org/computing/computer-science/cryptography#modarithmetic
快速运算是一种常用的数学计算方法,用于求解大数的幂运算问题。它的原理基于数学中的取运算和幂运算,而快速幂运算则是求解幂运算的一种高效的方法。 首先,我们需要了解以下两个数学概念: 1. 取运算:取运算就是将一个数除以另一个数后所得到的余数。例如,5除以2的余数为1,即5 mod 2 = 1。 2. 幂运算:幂运算就是将一个数乘以自己若干次的结果。例如,2的3次方等于8,即2^3 = 8。 接下来,我们来讲解快速幂的原理和过程: 假设要求解 a^b mod c 的值,其中 a、b、c 均为正整数,其中 b 可以非常大,达到几百万甚至更大,此时计算 a^b mod c 的常规方法是直接计算 a 的 b 次方,然后再对 c 取。这种方法的时间复杂度是 O(b)。如果 b 很大,计算时间就会很长,效率很低。 快速幂算法的核心思想是利用幂运算性质和取运算性质将 b 分解为若干个二进制位,然后对每个二进制位进行计算。具体过程如下: 1. 将 b 转换为二进制数,例如,b=13,二进制表示为:1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将对应的幂运算结果乘到最终结果中,否则直接忽略。 3. 在计算过程中,用已经计算出来的结果不断平方,然后对 c 取,这样可以避免重复计算,提高计算效率。 举个例子,我们要计算 2^13 mod 7 的值,可以使用快速幂算法进行计算: 1. 将 13 转换为二进制数,即 13 = 1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将相应的幂运算结果乘到最终结果中,否则直接忽略。计算过程如下: - 2^1 mod 7 = 2 - 2^2 mod 7 = 4 - 2^4 mod 7 = 2 - 2^8 mod 7 = 4 - 2^13 mod 7 = 2 * 4 * 2 * 4 * 2 mod 7 = 8 mod 7 = 1 因此,2^13 mod 7 的值为 1。 快速幂算法是求解幂运算的一种高效的方法,其核心思想是利用幂运算性质将指数进行二进制分解,然后利用分治思想进行计算。具体过程如下: 1. 将指数 b 转化成二进制数,例如,b=13,二进制表示为:1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将底数 a 的对应次方乘到最终结果中,否则直接忽略。 3. 在计算过程中,用已经计算出来的结果不断平方,这样可以避免重复计算,提高计算效率。 举个例子,我们要计算 2^13 的值,可以使用快速幂算法进行计算: 1. 将 13 转换为二进制数,即 13 = 1101。 2. 从右往左扫描二进制数,对于每一位,若该位为 1,则将相应的幂运算结果乘到最终结果中,否则直接忽略。计算过程如下: - 2^1 = 2 - 2^2 = 4 - 2^4 = 16 - 2^8 = 256 - 2^13 = 2 * 4 * 16 * 256 * 2 = 32768 因此,2^13 的值为 32768。 快速幂算法和快速幂算法都是常用的数学计算方法,在实际应用中经常被使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值