由浅入深一文详解同余原理

由浅入深一文详解同余原理

    • 一、同余原理的基本概念
      • 1.1 同余的定义
      • 1.2 剩余类与完全剩余系
    • 二、同余原理的基本性质
      • 2.1 自反性
      • 2.2 对称性
      • 2.3 传递性
      • 2.4 加减性
      • 2.5 乘性
      • 2.6 幂性
    • 三、同余原理的运算与应用
      • 3.1 同余运算在计算中的应用
      • 3.2 密码学中的应用
      • 3.3 日期与周期问题
    • 四、案例分析:快速幂取模
      • 问题描述
      • 核心原理
      • 代码实现:快速幂取模算法
        • Python实现
        • C++实现
        • Java实现
      • 代码解析
      • 同余原理案例中的应用
      • 应用扩展:RSA加密中的模幂运算

同余原理是数论中一个基础且重要的概念,它为我们研究整数之间的关系提供了独特的视角和强大的工具,在数学、计算机科学、密码学、信息安全等实际应用中发挥着关键作用。本文我将深入探讨同余原理的基本概念、性质、运算规则以及实际应用,带你全面理解这一重要原理,废话不多说直接发车。

一、同余原理的基本概念

1.1 同余的定义

给定一个正整数 m m m,如果两个整数 a a a b b b 满足 a − b a - b ab 能够被 m m m 整除,即 ( a − b ) ÷ m (a - b) \div m (ab)÷m 的结果是整数,那么就称整数 a a a b b b 对模 m m m 同余,记作 a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm)。其中, m m m 称为模, ≡ \equiv 是同余符号 。例如,因为 17 − 5 = 12 17 - 5 = 12 175=12 12 12 12 能被 6 6 6 整除,所以可以表示为 17 ≡ 5 ( m o d 6 ) 17 \equiv 5 \pmod{6} 175(mod6);再如 25 − 10 = 15 25 - 10 = 15 2510=15 15 15 15 能被 5 5 5 整除,即 25 ≡ 10 ( m o d 5 ) 25 \equiv 10 \pmod{5} 2510(mod5)

从直观上理解,同余表示两个整数在除以同一个模 m m m 时,具有相同的余数。例如, 17 ÷ 6 = 2 ⋯ ⋯ 5 17 \div 6 = 2\cdots\cdots5 17÷6=2⋯⋯5 5 ÷ 6 = 0 ⋯ ⋯ 5 5 \div 6 = 0\cdots\cdots5 5÷6=0⋯⋯5,它们除以 6 6 6 的余数都是 5 5 5,这也是同余的另一种等价理解方式。

1.2 剩余类与完全剩余系

  • 剩余类:对于给定的模 m m m,所有与整数 a a a 同余的整数构成的集合,称为 a a a 关于模 m m m 的剩余类,记作 [ a ] m [a]_m [a]m。例如,对于模 3 3 3 [ 0 ] 3 = { ⋯ , − 3 , 0 , 3 , 6 , ⋯ } [0]_3 = \{ \cdots, -3, 0, 3, 6, \cdots \} [0]3={,3,0,3,6,} [ 1 ] 3 = { ⋯ , − 2 , 1 , 4 , 7 , ⋯ } [1]_3 = \{ \cdots, -2, 1, 4, 7, \cdots \} [1]3={,2,1,4,7,} [ 2 ] 3 = { ⋯ , − 1 , 2 , 5 , 8 , ⋯ } [2]_3 = \{ \cdots, -1, 2, 5, 8, \cdots \} [2]3={,1,2,5,8,}。每个剩余类中的任意两个整数都对模 m m m 同余,并且整数集可以被划分为 m m m 个互不相交的剩余类。

  • 完全剩余系:从模 m m m 的每个剩余类中各取一个整数,得到的由 m m m 个整数组成的集合,称为模 m m m 的一个完全剩余系。例如,对于模 4 4 4 { 0 , 1 , 2 , 3 } \{0, 1, 2, 3\} {0,1,2,3} 是一个完全剩余系, { 4 , 5 , 6 , 7 } \{4, 5, 6, 7\} {4,5,6,7} 同样也是模 4 4 4 的一个完全剩余系 。

二、同余原理的基本性质

2.1 自反性

对于任意整数 a a a 和正整数 m m m,都有 a ≡ a ( m o d m ) a \equiv a \pmod{m} aa(modm)。这是因为 a − a = 0 a - a = 0 aa=0 0 0 0 能被任何正整数 m m m 整除,所以一个整数自身必然与自身对模 m m m 同余。

2.2 对称性

a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm),则 b ≡ a ( m o d m ) b \equiv a \pmod{m} ba(modm)。因为 a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) 意味着 a − b a - b ab 能被 m m m 整除,那么 b − a = − ( a − b ) b - a = -(a - b) ba=(ab) 也能被 m m m 整除,所以 b b b a a a 对模 m m m 同余。

2.3 传递性

a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) b ≡ c ( m o d m ) b \equiv c \pmod{m} bc(modm),则 a ≡ c ( m o d m ) a \equiv c \pmod{m} ac(modm)。由 a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) 可得 a − b = k m a - b = km ab=km k k k 为整数),由 b ≡ c ( m o d m ) b \equiv c \pmod{m} bc(modm) 可得 b − c = l m b - c = lm bc=lm l l l 为整数),那么 a − c = ( a − b ) + ( b − c ) = ( k + l ) m a - c = (a - b) + (b - c) = (k + l)m ac=(ab)+(bc)=(k+l)m,即 a − c a - c ac 能被 m m m 整除,所以 a a a c c c 对模 m m m 同余。

2.4 加减性

a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) c ≡ d ( m o d m ) c \equiv d \pmod{m} cd(modm),则 a + c ≡ b + d ( m o d m ) a + c \equiv b + d \pmod{m} a+cb+d(modm) a − c ≡ b − d ( m o d m ) a - c \equiv b - d \pmod{m} acbd(modm)。因为 a − b = k m a - b = km ab=km c − d = l m c - d = lm cd=lm,所以 ( a + c ) − ( b + d ) = ( a − b ) + ( c − d ) = ( k + l ) m (a + c) - (b + d) = (a - b) + (c - d) = (k + l)m (a+c)(b+d)=(ab)+(cd)=(k+l)m ( a − c ) − ( b − d ) = ( a − b ) − ( c − d ) = ( k − l ) m (a - c) - (b - d) = (a - b) - (c - d) = (k - l)m (ac)(bd)=(ab)(cd)=(kl)m,都能被 m m m 整除。

2.5 乘性

a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm) c ≡ d ( m o d m ) c \equiv d \pmod{m} cd(modm),则 a c ≡ b d ( m o d m ) ac \equiv bd \pmod{m} acbd(modm)。将 a = b + k m a = b + km a=b+km c = d + l m c = d + lm c=d+lm 代入 a c − b d ac - bd acbd 可得: a c − b d = ( b + k m ) ( d + l m ) − b d = b d m + b l m 2 + k d m + k l m 2 ac - bd = (b + km)(d + lm) - bd = bdm + blm^2 + kdm + klm^2 acbd=(b+km)(d+lm)bd=bdm+blm2+kdm+klm2,显然 a c − b d ac - bd acbd 能被 m m m 整除。

2.6 幂性

a ≡ b ( m o d m ) a \equiv b \pmod{m} ab(modm),那么对于任意正整数 n n n,有 a n ≡ b n ( m o d m ) a^n \equiv b^n \pmod{m} anbn(modm)。可以通过乘性进行递推证明,当 n = 1 n = 1 n=1 时显然成立,假设 a k ≡ b k ( m o d m ) a^k \equiv b^k \pmod{m} akbk(modm),由乘性可得 a k + 1 = a k ⋅ a ≡ b k ⋅ b = b k + 1 ( m o d m ) a^{k + 1} = a^k \cdot a \equiv b^k \cdot b = b^{k + 1} \pmod{m} ak+1=akabkb=bk+1(modm)

三、同余原理的运算与应用

3.1 同余运算在计算中的应用

同余运算可以简化复杂的数值计算。例如,计算 2345 × 6789 m o d 11 2345 \times 6789 \bmod 11 2345×6789mod11,如果直接计算 2345 × 6789 2345 \times 6789 2345×6789 再取模,计算量较大。利用同余的乘性,先分别计算 2345 m o d 11 = 1 2345 \bmod 11 = 1 2345mod11=1 6789 m o d 11 = 5 6789 \bmod 11 = 5 6789mod11=5,然后计算 1 × 5 m o d 11 = 5 1 \times 5 \bmod 11 = 5 1×5mod11=5,这样就大大简化了计算过程。

3.2 密码学中的应用

同余原理在密码学中有着广泛的应用,例如在 RSA 加密算法中,同余运算起到了核心作用。RSA 算法基于大整数分解的困难性,通过同余运算实现加密和解密过程。在加密时,利用同余的幂性对明文进行运算得到密文;解密时,同样依据同余原理进行反向运算恢复明文 。

3.3 日期与周期问题

在处理日期和周期相关的问题时,同余原理也非常有用。例如,已知今天是星期一,求 100 100 100 天后是星期几。一周有 7 7 7 天,以 7 7 7 为模, 100 m o d 7 = 2 100 \bmod 7 = 2 100mod7=2,因为今天是星期一,经过 100 100 100 天相当于在星期一的基础上再过 2 2 2 天,所以 100 100 100 天后是星期三。

四、案例分析:快速幂取模

问题描述

计算 a b m o d m a^b \mod m abmodm 的值,其中 a a a b b b 是非常大的整数(例如 b b b 10 5 10^5 105 级别的指数),直接计算 a b a^b ab 会导致数值溢出或计算效率低下。利用同余原理的幂性模运算性质,可以高效地求解该问题。

核心原理

根据同余的幂性:若 a ≡ c ( m o d m ) a \equiv c \pmod{m} ac(modm),则 a b ≡ c b ( m o d m ) a^b \equiv c^b \pmod{m} abcb(modm)
结合快速幂算法(二分法),将指数 b b b 分解为二进制位,通过不断平方并取模,避免大数运算。

代码实现:快速幂取模算法

以下代码均实现 f ( a , b , m ) = a b m o d m f(a, b, m) = a^b \mod m f(a,b,m)=abmodm,适用于大数场景。

Python实现
def fast_pow_mod(a, b, m):result = 1a = a % m  # 先对底数取模,避免初始值过大while b > 0:if b % 2 == 1:result = (result * a) % m  # 奇数指数时乘入结果a = (a * a) % m  # 底数平方并取模b = b // 2  # 指数减半return result# 示例:计算 3^100 mod 7
a = 3
b = 100
m = 7
print(f"{a}^{b} mod {m} = {fast_pow_mod(a, b, m)}")  # 输出: 3^100 mod 7 = 4
C++实现
#include <iostream>
using namespace std;long long fast_pow_mod(long long a, long long b, long long m) {long long result = 1;a = a % m;  // 底数取模while (b > 0) {if (b % 2 == 1) {result = (result * a) % m;  // 奇数指数时乘入结果}a = (a * a) % m;  // 底数平方取模b = b / 2;  // 指数减半}return result;
}int main() {long long a = 3, b = 100, m = 7;cout << a << "^" << b << " mod " << m << " = " << fast_pow_mod(a, b, m) << endl;  // 输出: 3^100 mod 7 = 4return 0;
}
Java实现
public class FastPowMod {public static long fastPowMod(long a, long b, long m) {long result = 1;a = a % m;  // 底数取模while (b > 0) {if (b % 2 == 1) {result = (result * a) % m;  // 奇数指数时乘入结果}a = (a * a) % m;  // 底数平方取模b = b / 2;  // 指数减半}return result;}public static void main(String[] args) {long a = 3, b = 100, m = 7;System.out.println(a + "^" + b + " mod " + m + " = " + fastPowMod(a, b, m));  // 输出: 3^100 mod 7 = 4}
}

代码解析

  1. 初始取模:对底数 a a a 先取模 m m m,确保初始值在合理范围内(利用同余原理 a ≡ a m o d m ( m o d m ) a \equiv a \mod m \pmod{m} aamodm(modm))。
  2. 快速幂逻辑
    • 当指数 b b b 为奇数时,将当前底数 a a a 乘入结果,并对结果取模。
    • 每次将底数 a a a 平方并取模(利用同余的幂性: a 2 ≡ ( a m o d m ) 2 ( m o d m ) a^2 \equiv (a \mod m)^2 \pmod{m} a2(amodm)2(modm))。
    • 指数 b b b 不断减半,直到变为 0,时间复杂度为 O ( log ⁡ b ) O(\log b) O(logb)
  3. 避免溢出:每次乘法后立即取模,防止中间结果超过数据类型范围。

同余原理案例中的应用

  • 幂性应用:通过 a ≡ a m o d m ( m o d m ) a \equiv a \mod m \pmod{m} aamodm(modm),将大数 a a a 转换为等效的小数,简化计算。
  • 模运算封闭性:加法、乘法在模运算下保持同余关系,即 ( a × b ) m o d m = [ ( a m o d m ) × ( b m o d m ) ] m o d m (a \times b) \mod m = [(a \mod m) \times (b \mod m)] \mod m (a×b)modm=[(amodm)×(bmodm)]modm,确保每一步计算结果等价于原始大数运算的结果。

应用扩展:RSA加密中的模幂运算

在RSA加密算法中,加密和解密过程本质上是大数的模幂运算(如 C = M e m o d n C = M^e \mod n C=Memodn M = C d m o d n M = C^d \mod n M=Cdmodn)。上述快速幂取模算法是RSA的核心实现基础,利用同余原理确保加密和解密的正确性,同时通过高效计算应对大数场景。通过同余原理和快速算法,即使 e e e d d d 是数百位的大整数,也能在合理时间内完成计算。

That’s all, thanks for reading!
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案

之前用ArcGIS Pro创建渔网的时候&#xff0c;发现创建出来格网过大&#xff0c;只有几个格网。 后来查阅资料&#xff0c;发现是坐标不对&#xff0c;导致设置格网大小时单位为度&#xff0c;而不是米&#xff0c;因此需要进行坐标系转换&#xff0c;网上有很多资料讲了ArcGIS …

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别&#xff1a; 模态对话框是一种阻塞时对话框&#xff0c;它会阻止用户与应用程序的其他部分进行交互&#xff0c;直到用户与该对话框进行交互并关…

【HW系列】—安全设备介绍(开源蜜罐的安装以及使用指南)

文章目录 蜜罐1. 什么是蜜罐&#xff1f;2. 开源蜜罐搭建与使用3. HFish 开源蜜罐详解安装步骤使用指南关闭方法 总结 蜜罐 1. 什么是蜜罐&#xff1f; 蜜罐&#xff08;Honeypot&#xff09;是一种主动防御技术&#xff0c;通过模拟存在漏洞的系统或服务&#xff08;如数据库…

TI硬件笔试面试题型解析上

本专栏预计更新60期左右。当前第14期. 这个系列通过在国内外网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目(包括模拟题)确实非常巧妙,很有代表性。由于官方没有发布过这样的题库…

Python打卡训练营Day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 数据集地址&#xff1a;Lung Nodule Malignancy 肺结核良恶性判断 进阶&#xff1a;并拆分成多个文件 import os import pandas as pd import numpy as np from…

悲观锁与乐观锁:并发编程中的两种核心控制策略详解

在并发编程中&#xff0c;悲观锁和乐观锁是两种不同的并发控制策略&#xff0c;用于解决多个线程或进程对共享资源的并发访问问题。下面将详细介绍它们的概念、实现方式以及优缺点。 悲观锁 概念 悲观锁认为在并发环境下&#xff0c;多个线程或进程对共享资源的访问大概率会发…

python 如何写4或5的表达式

python写4或5的表达式的方法&#xff1a; python中和是用“and”语句&#xff0c;或是用“or”语句。那么4或5的表达式为“4 or 5” 具体示例如下&#xff1a; 执行结果&#xff1a;

麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力

麻省理工学院电气工程与计算机科学系Pulkit Agrawal教授&#xff0c;介绍了一种新方法&#xff0c;可以让机器人在扫描的家庭环境模拟中接受训练&#xff0c;为任何人都可以实现定制的家庭自动化铺平了道路。 本文将探讨通过Franka机器人在虚拟环境中训练的特点&#xff0c;研…

Linux程序管理练习题

Linux程序管理100题 一、Linux程序与进程&#xff08;1-15&#xff09; 程序、进程、线程的本质区别是什么&#xff1f; 答案&#xff1a;程序是静态指令集&#xff0c;进程是运行中的程序实例&#xff0c;线程是进程内的执行单元 进程的并发性和交往性体现在哪些方面&#xf…

虚幻基础:模型

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 资源模型&#xff1a;骨架/骨骼模型动画&#xff1a;一系列姿势补帧&#xff1a;只需设定关键姿势&#xff0c;则系统在关键帧姿势之间自动生成动画。姿势的变换&#xff1a;即骨骼的变换 动画蓝图&#xff1a;执行…

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购&#xff1a;PC时代的辉煌 1.1 Discuz! 的诞生&#xff1a;康盛创想的开源梦想 2001年&#xff0c;中国互联网正处于萌芽阶段&#xff0c;个人网站和论坛开始兴起。…

如何打包conda环境从一台电脑到另外一台电脑

在 Ubuntu 系统下&#xff0c;使用的是 VSCode 和 Conda 环境开发项目&#xff0c;想要将整个 Conda 环境从一台电脑迁移到另一台电脑&#xff0c;可以通过以下步骤来实现打包和导入&#xff1a; ✅ 一、在原电脑上导出 Conda 环境 1. 激活你要导出的环境 conda activate you…

2025GDCPC广东省赛游记(附赛时代码)

我觉得算是给swan的自证之旅画上一个句号吧...说实话HDU给我带来的不止是排位上的压力&#xff0c;更多的是对自己能力的怀疑&#xff0c;特别是pluto不明说但是我很清楚的看不起&#xff08;没有责备本人的意思&#xff09;&#xff0c;evil和jxj之类的总感觉看到我就是看小丑…

MySQL 修改数据的全链路流程

MySQL 修改数据的全链路流程&#xff08;InnoDB&#xff09; 全链路流程图关键步骤详解1. 建立连接阶段2.SQL解析与优化3. InnoDB内存操作4. 日志记录过程5. 二阶段提交&#xff08;2PC&#xff09; 磁盘同步机制1. Redo Log刷盘策略&#xff08;innodb_flush_log_at_trx_commi…

兰亭妙微十六年高水准交互设计公司

北京兰亭妙微&#xff08;蓝蓝设计&#xff09;成立于 2008 年&#xff08;前身为设计工作室&#xff0c;2011 年正式注册&#xff09;&#xff0c;由清华团队主创&#xff0c;专注软件和互联网 UI/UE 设计开发 16 年。我们提供从需求调研、界面设计到开发落地的全流程服务&…

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源 如Dockerfile中 使用某个源&#xff08;比如 aliyun&#xff09; 假设你的目录结构是&#xff1a; . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把脚本拷贝到镜像中 COPY switch-apt-source.sh /us…

学习日记-day20-6.1

完成目标&#xff1a; 知识点&#xff1a; 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…

个人总结八股文之-基础篇(持续更新)

一、集合的分类有哪些&#xff1f; Java集合框架主要分为两大类&#xff1a;Collection和Map Collection主要分为以下三类&#xff1a; List&#xff1a;有序集合&#xff0c;允许重复元素。常见的实现类有ArrayList、LinkedList和Vector。 Set&#xff1a;无序集合&#xf…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…