当前位置: 首页 > news >正文

别再死记硬背了!用Python和JavaScript代码实例,5分钟搞懂模运算的加减乘除规律

别再死记硬背了!用Python和JavaScript代码实例,5分钟搞懂模运算的加减乘除规律

模运算在编程中无处不在,从简单的循环索引到密码学算法都离不开它。但很多初学者面对那些看似复杂的模运算公式时,往往选择死记硬背——这不仅痛苦,而且容易遗忘。本文将用Python和JavaScript两种语言的代码实例,带你在实际运行中直观理解模运算的规律,告别枯燥的公式记忆。

1. 模运算基础:从概念到代码验证

模运算本质上是求余数的运算,在编程中用%符号表示。但它的行为有时会出乎意料,特别是涉及负数时。让我们先用代码验证几个基本特性:

# Python中的模运算示例 print(17 % 5) # 输出2,因为17÷5商3余2 print(-3 % 5) # 输出2,这是Python的特性
// JavaScript中的模运算 console.log(17 % 5); // 2 console.log(-3 % 5); // -3,与Python不同!

关键发现

  • Python的%总是返回与除数同号的余数
  • JavaScript的%则保留被除数的符号
  • 两种语言中,(a % b)的结果绝对值都小于b

提示:跨语言开发时,负数的模运算差异是常见bug来源,务必注意。

2. 模运算的四大基本规律验证

模运算的加减乘除规律看起来像普通算术,但需要验证才能确信。让我们用代码测试这些规律是否成立。

2.1 加法分配律

公式:(A + B) % M == (A % M + B % M) % M

def test_add_rule(a, b, m): left = (a + b) % m right = (a % m + b % m) % m return left == right print(test_add_rule(17, 23, 5)) # True print(test_add_rule(-4, 9, 7)) # True

2.2 乘法分配律

公式:(A * B) % M == [(A % M) * (B % M)] % M

function testMulRule(a, b, m) { const left = (a * b) % m; const right = ((a % m) * (b % m)) % m; return left === right; } console.log(testMulRule(12, 7, 5)); // true console.log(testMulRule(-3, 8, 6)); // true

2.3 幂运算规律

公式:(A^n) % M == [(A % M)^n] % M

def test_pow_rule(a, n, m): left = pow(a, n) % m right = pow(a % m, n) % m return left == right print(test_pow_rule(3, 4, 7)) # True print(test_pow_rule(5, 3, 11)) # True

2.4 结合律验证

function testAssociative(a, b, c, m) { const left = ((a + b) % m + c) % m; const right = (a + (b + c) % m) % m; return left === right; } console.log(testAssociative(4, 7, 2, 5)); // true

3. 模逆元:密码学中的关键概念

模逆元在RSA等加密算法中至关重要。数a在模m下的逆元b满足:(a * b) % m == 1

3.1 暴力搜索法求逆元

def find_mod_inverse(a, m): for b in range(1, m): if (a * b) % m == 1: return b return None # 不存在逆元 print(find_mod_inverse(3, 7)) # 输出5,因为3*5=15≡1 mod7

3.2 使用扩展欧几里得算法

更高效的算法实现:

function extEuclid(a, b) { if (b === 0) return [a, 1, 0]; const [gcd, x1, y1] = extEuclid(b, a % b); const x = y1; const y = x1 - Math.floor(a / b) * y1; return [gcd, x, y]; } function modInverse(a, m) { const [gcd, x, y] = extEuclid(a, m); return gcd === 1 ? (x % m + m) % m : null; } console.log(modInverse(3, 7)); // 5

4. 实战应用:循环队列与哈希函数

理解了模运算规律后,让我们看两个实际应用。

4.1 实现循环队列

class CircularQueue: def __init__(self, size): self.size = size self.queue = [None] * size self.head = self.tail = 0 def enqueue(self, item): next_pos = (self.tail + 1) % self.size if next_pos == self.head: raise Exception("Queue is full") self.queue[self.tail] = item self.tail = next_pos def dequeue(self): if self.head == self.tail: raise Exception("Queue is empty") item = self.queue[self.head] self.head = (self.head + 1) % self.size return item

4.2 简单哈希函数实现

class SimpleHashTable { constructor(size) { this.size = size; this.table = new Array(size); } hash(key) { let hash = 0; for (let i = 0; i < key.length; i++) { hash = (hash * 31 + key.charCodeAt(i)) % this.size; } return hash; } set(key, value) { const index = this.hash(key); this.table[index] = value; } }

模运算的这些特性在实际编程中远比我们想象的更有用。比如在开发一个轮播组件时,用current_index % total_slides就能实现无限循环的效果;在处理大型数组的分块操作时,模运算可以帮助我们均匀分配任务。

http://www.jsqmd.com/news/828224/

相关文章:

  • CCSv3.3安装配置避坑全记录:从补丁失败到硬件连接,手把手搞定DSP开发环境
  • 防患于未然:CSRF 防护原理与中间件拦截机制详解
  • 告别卡顿!CXPatcher:让Mac上的Windows游戏性能飙升的终极修复工具
  • C#如何优雅处理引用类型的深拷贝
  • 告别手动写测试报告:用AI自动生成可视化测试总结
  • RocketMQ 5.1.1 Topic管理:从创建到删除,一份完整的mqadmin命令行实战手册
  • 基于Circuit Playground Express与MakeCode的互动拳套制作指南
  • 如何免费获取经典优雅的EB Garamond 12字体:完整安装与使用指南
  • 新手必看:J-Link OB驱动安装与常见问题排查(附百度云资料包)
  • Claude与Codex双引擎协作:AI代码生成的新范式与实践
  • 树莓派Zero无音频接口?PWM+RC滤波实现模拟音频输出全攻略
  • 保姆级教程:在Ubuntu 22.04上用ROS2 Humble和Gazebo搞定TurtleBot3仿真(从安装到建图导航)
  • 一文掌握逆向注入工具 Inject Tool:从底层原理到攻防实战
  • Page Assist终极指南:在浏览器侧边栏中运行本地AI助手的完整教程
  • 零成本自建搜索 API:用 SearXNG 搭建免费、无限制的元搜索引擎
  • OmenSuperHub深度解析:3个关键技术突破彻底改变惠普游戏本性能管理体验
  • SDEP协议与SPI-BLE数据传输:从理论到实战的深度解析
  • 手把手教你用MPU6050和nRF52832做手环计步:避开数据读取卡死的坑
  • 5分钟快速上手:用Tinke免费工具轻松解包修改NDS游戏资源
  • AI代码助手Cursor高效配置指南:从工具使用到工作流集成
  • C++中的 const 与 volatile:比C强大十倍
  • Code-Act框架:让AI通过代码生成与执行实现智能体“动手”能力
  • Cursor Free VIP:突破AI编程助手使用限制的完整解决方案
  • 麒麟服务器版(ARM架构)离线安装 telnet
  • Py-GPT:本地化多模型AI助手与自动化工作流实战指南
  • 终极指南:如何快速解决iPhone在Windows上的USB网络共享问题
  • ArcGIS实战:手把手教你拼接与裁剪全国10米建筑高度栅格数据(以武汉为例)
  • SuperMap iServer实战:5分钟搞定ArcGIS在线服务的代理与二次开发(REST API调用详解)
  • 杰理之开混合录音插设备播放不了【篇】
  • 对比按量计费与Token Plan套餐在长期项目中的成本感受