关于取模

很多地方用到模运算,这里说明模运算的一些规律,并加以证明。 后续会对这些理论实际的应用加以记录和说明。


1. 模运算是取余运算(记做 % 或者 mod),具有周期性的特点。 m%n的意思是n除m后的余数,当m递增时m%n呈现周期性特点,并且n越大,周期越长,周期等于n。
    例如
       0 % 20 = 0,1 % 20 = 1, 2 % 20 = 2, 3 % 20 = 3, ..., 19 % 20 =19
      20 % 20 = 0,21 % 20 = 1,22 % 20 = 2,23 % 20 = 3, ...,39 % 20 =19
2. 如果 m % n = r,那么可以推出如下等式
    m = k * n + r (k为大于等于0的整数, r <= m)
3. 同余式, 表示正整数a,b对n取模,它们的余数相同,记做 a ≡ b mod n或者a = b (mod n)。
    根据2的等式可以推出 a= kn + b 或者 a - b = kn
   证明:   ∵ a = k1 * n + r1
             b = k2 * n + r2
          ∴ a - b = (k1 - k2) * n + (r1 - r2)
            a = k * n + (r1 - r2) + b
          ∵ a, b对n取模同余,r1 = r2
          ∴ a = k * n + b (k = k1 - k2)
4. 模运算规则, 模运算与基本四则运算有些相似,但是除法例外。其规则如下
    (a + b) % n= (a % n + b % n) %n            (1)
    (a - b) % n= (a % n - b % n) %n            (2)
    (a * b) % n= (a % n * b % n) %n            (3)
   ab % n = ((a % n)b) %n                     (4)


(1)式证明
∵ a = k1*n + r1


   b = k2*n + r2


a % n = r1


b % n = r2


∴(a+b) % n = ((k1+k2)*n + (r1+r2)) % n = (r1+r2) % n = (a % n +b % n)% n
    得证
(2)式证明同上
(3)式证明
    a = k1*n + r1
     b = k2*n + r2
    (a*b) % n = (k1k2n2+ (k1r2+k2r1)n + r1r2) % n = r1r2 % n = (a %n * b %n ) % n
(4)式证明
      设 a % n = r
     ab %n= (a * a * a * a…*a) %n = (a %n * a %n * a %n * … *a %n) %n = rb % n = ((a % n) b) % n


模运算看起来不是很直观,但是可以用来推导出一些有用的东西。 例如(4)式可以用来降幂运算,例如计算6265 3,直接计算的话需要算出6265 利用(4)式可以进行降幂运算。
   6265 % 133
= 62 * 6264 % 133
= 62 * (622)32 % 133
= 62 * 384432 % 133
= 62 * (3844 % 133)32 % 133
= 62 * 12032 % 133


= 62 * 3616 % 133
= 62 * 998 % 133
= 62 * 924 % 133
= 62 * 852 % 133
= 62 * 43 % 133
= 2666 % 133
= 6


比如:N%M=r;则有N=M*y+r;


同理:N=M1*y+M1-a;N+a=M1(y+1);必有(N+a)%M1=0。


 a%k%m!=a%m%k   a%km%m==a%m%km a%km%k=a%k%km 


a/b%m = a%(b*m)/b = a*(b%m)^-1%m
### 运算概述 运算是计算两个数相除后的余数的一种基本算术操作,在多种编程语言中都有广泛的应用。以下是关于运算的一些重要特性和示例。 #### Java 中的特性 在 Java 中,运算遵循固定的规则:`a % b` 的结果符号与 `a` 相同[^1]。如果被除数为零,则会引发异常 `ArithmeticException`。下面是一个简单的错误处理示例: ```java try { int result = 10 % 0; // 这里会抛出 ArithmeticException } catch (ArithmeticException e) { System.out.println("除数不能为零!"); } ``` #### Python 中的行为 Python 提供了内置的支持来执行运算,其语法简单明了。对于正数和负数的情况,Python 的运算返回的结果始终是非负数[^2]。例如: ```python print(9 % 4) # 输出 1 print(-9 % 4) # 输出 3 print(9 % -4) # 输出 -3 print(-9 % -4) # 输出 -1 ``` 上述代码展示了不同情况下运算的结果如何变化。 #### C/C++ 中的应用实例 C 和 C++ 对于运算也有类似的语法规则。需要注意的是,当涉及负数时,不同的编译器可能有不同的实现方式。以下是一个基于分数转换的例子[^4]: ```c #include<stdio.h> int main() { int score = 5; score = (score / 20) * 100; // 结果为 0 printf("%d\n", score); return 0; } ``` 在这个例子中,由于 `(score / 20)` 是整数除法,因此最终结果会被截断到最接近的较小整数值。 #### 逆元的概念及其应用场景 除了常规用途外,还常用于密码学领域,特别是 RSA 加密算法中涉及到逆元的计算。为了找到一个数 `a` 关于 `p` 的逆元 `a_inv`,需满足条件 `(a * a_inv) % p = 1`[^3]。这是一个重要的理论基础,通常借助扩展欧几里得算法完成实际计算。 ### 示例总结 以上分别介绍了几种主流编程语言下的功能以及它在一个高级场景——即寻找逆元中的作用。每种环境都提供了独特的工具集让用户能够高效地解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值