大数取模 详解

大数取模详解

大数取模(Modular Arithmetic for Large Numbers)是计算机科学和数学中的常见问题,尤其是在密码学、数论和高效算法中广泛使用。由于大数超出常规数据类型的范围,无法直接存储或计算,因此需要采用特殊的算法和技巧来高效计算取模结果。


1. 取模运算的定义

取模运算是求两个数相除后的余数,表示为:
a m o d m = r a \mod m = r amodm=r
其中:

  • a a a是被除数。
  • m m m是模数。
  • r r r是余数,满足 0 ≤ r < m 0 \leq r < m 0r<m

例如:
13 m o d 5 = 3 ( 因为  13 = 5 × 2 + 3 ) 13 \mod 5 = 3 \quad (\text{因为 } 13 = 5 \times 2 + 3) 13mod5=3(因为 13=5×2+3)

对于大数 a a a,直接计算 a m o d m a \mod m amodm可能不可行,因此需要优化算法。


2. 常见场景

  1. 大整数取模

    • a a a是一个非常大的数,例如几百位甚至上千位。
    • 目标是高效计算 a m o d m a \mod m amodm
  2. 模运算性质

    • 利用模运算的性质简化计算,例如:
      ( a + b ) m o d m = [ ( a m o d m ) + ( b m o d m ) ] m o d m (a + b) \mod m = [(a \mod m) + (b \mod m)] \mod m (a+b)modm=[(amodm)+(bmodm)]modm

      ( 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

  3. 模幂运算

    • 计算 a b m o d m a^b \mod m abmodm,如快速幂算法。

3. 大数取模算法

(1) 基本取模方法

直接法(逐位取模)

通过逐位处理大数的每一位数字来计算取模结果。例如,对于 a = 12345678901234567890 a = 12345678901234567890 a=12345678901234567890,可以按位逐步计算 a m o d m a \mod m amodm

计算公式:
r = ( r × 10 + d i ) m o d m r = (r \times 10 + d_i) \mod m r=(r×10+di)modm
其中:

  • r r r是当前余数。
  • d i d_i di是数字 a a a的第 i i i位。
代码实现
public class BigNumberModulo {public static int bigMod(String num, int m) {int result = 0; // 初始余数为 0for (int i = 0; i < num.length(); i++) {int digit = num.charAt(i) - '0'; // 取当前位的数字result = (result * 10 + digit) % m; // 更新余数}return result;}public static void main(String[] args) {String num = "12345678901234567890"; // 大数作为字符串输入int m = 7;System.out.println(bigMod(num, m)); // 输出:6}
}
运行原理

对于大数 12345678901234567890 12345678901234567890 12345678901234567890和模数 m = 7 m = 7 m=7

  1. 从左到右逐位读取数字。
  2. 依次更新当前余数:
    • 初始 r = 0 r = 0 r=0
    • 第 1 位: r = ( 0 × 10 + 1 ) m o d 7 = 1 r = (0 \times 10 + 1) \mod 7 = 1 r=(0×10+1)mod7=1
    • 第 2 位: r = ( 1 × 10 + 2 ) m o d 7 = 5 r = (1 \times 10 + 2) \mod 7 = 5 r=(1×10+2)mod7=5
    • 以此类推,最终得出 r = 6 r = 6 r=6
时间复杂度
  • 时间复杂度为 O ( n ) O(n) O(n),其中 n n n是大数的位数。

(2) 模运算性质

性质 1:分配律

模运算满足以下分配律,可用于化简运算:

  • 加法:
    ( a + b ) m o d m = [ ( a m o d m ) + ( b m o d m ) ] m o d m (a + b) \mod m = [(a \mod m) + (b \mod m)] \mod m (a+b)modm=[(amodm)+(bmodm)]modm

  • 乘法:
    ( 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

  • 减法:
    ( a − b ) m o d m = [ ( a m o d m ) − ( b m o d m ) + m ] m o d m (a - b) \mod m = [(a \mod m) - (b \mod m) + m] \mod m (ab)modm=[(amodm)(bmodm)+m]modm

性质 2:幂运算结合律

对于幂运算:
( a b ) m o d m = ( ( a m o d m ) b ) m o d m (a^b) \mod m = ((a \mod m)^b) \mod m (ab)modm=((amodm)b)modm


(3) 快速幂取模

快速幂取模算法用于高效计算 a b m o d m a^b \mod m abmodm,通过指数的二进制分解减少运算量。

核心思想

利用:
a b m o d m = { ( a b / 2 m o d m ) 2 m o d m (b 为偶数) ( a ⋅ ( a b − 1 m o d m ) ) m o d m (b 为奇数) a^b \mod m = \begin{cases} (a^{b/2} \mod m)^2 \mod m & \text{(b 为偶数)} \\ (a \cdot (a^{b-1} \mod m)) \mod m & \text{(b 为奇数)} \end{cases} abmodm={(ab/2modm)2modm(a(ab1modm))modm(b 为偶数)(b 为奇数)

迭代实现
public class FastExponentiation {public static long modularExponentiation(long a, long b, long m) {long result = 1;a = a % m; // 先取模,简化后续运算while (b > 0) {if ((b & 1) == 1) { // 如果当前指数最低位为 1result = (result * a) % m;}a = (a * a) % m; // 平方底数b >>= 1; // 指数右移一位}return result;}public static void main(String[] args) {System.out.println(modularExponentiation(2, 10, 1000)); // 输出:24}
}
运行示例

计算 2 10 m o d 1000 2^{10} \mod 1000 210mod1000

  1. 初始 a = 2 , b = 10 , m = 1000 a = 2, b = 10, m = 1000 a=2,b=10,m=1000,结果 r e s u l t = 1 result = 1 result=1
  2. b = 10 b = 10 b=10(偶数),更新 a = 4 a = 4 a=4(平方), b = 5 b = 5 b=5
  3. b = 5 b = 5 b=5(奇数),结果 r e s u l t = 1 × 4 = 4 result = 1 \times 4 = 4 result=1×4=4,更新 a = 16 a = 16 a=16 b = 2 b = 2 b=2
  4. b = 2 b = 2 b=2(偶数),更新 a = 256 a = 256 a=256 b = 1 b = 1 b=1
  5. b = 1 b = 1 b=1(奇数),结果 r e s u l t = 4 × 256 m o d 1000 = 24 result = 4 \times 256 \mod 1000 = 24 result=4×256mod1000=24

最终结果为 24 24 24

时间复杂度
  • 快速幂算法的时间复杂度为 O ( log ⁡ b ) O(\log b) O(logb)

(4) 大数与模结合

在处理大数与模运算时,常将大数分解为部分,通过逐步取模或其他分治技术避免直接计算大数。

例:大数相乘取模

如果 a a a b b b都是大数,可以用以下公式分解:
( a ⋅ b ) m o d m = [ ( a m o d m ) ⋅ ( b m o d m ) ] m o d m (a \cdot b) \mod m = [(a \mod m) \cdot (b \mod m)] \mod m (ab)modm=[(amodm)(bmodm)]modm

实现
public class BigMultiplyModulo {public static long multiplyMod(long a, long b, long m) {long result = 0;a %= m;while (b > 0) {if ((b & 1) == 1) { // 如果最低位为 1result = (result + a) % m;}a = (a << 1) % m; // 左移并模b >>= 1; // 右移一位}return result;}public static void main(String[] args) {System.out.println(multiplyMod(123456789012345678L, 987654321098765432L, 1000000007)); // 示例}
}

4. 应用场景

  1. 密码学
    • RSA 加密算法中需要大量模运算。
  2. 大整数运算
    • 如大数阶乘取模、斐波那契数取模。
  3. 数论
    • 解决同余方程、逆元计算。

5. 总结

算法适用场景时间复杂度
快速幂取模幂运算、大指数取模 O ( log ⁡ b ) O(\log b) O(logb)
大数相乘取模两个大数相乘后的取模 O ( log ⁡ b ) O(\log b) O(logb)
模运算分配律多次加、减、乘结合取模 O ( 1 ) O(1) O(1)(单次)

大数取模的核心思想

  1. 化整为零
    • 大数通过逐步分解(如逐位取模或逐步幂运算)解决,避免一次性直接计算。
  2. 模运算性质
    • 充分利用模运算的分配律和结合律,将复杂运算转化为小数范围内的运算。
  3. 算法优化
    • 针对幂运算和乘法,通过快速幂、逐位乘法等算法降低计算复杂度。

总结应用

大数取模是数论和密码学中的重要工具,掌握其算法和性质可以有效解决诸如大数相乘、大指数幂计算等复杂问题,同时优化程序性能。

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

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

相关文章

一个关于 CSS Modules 的陷阱

我在引用 less 文件样式的时候&#xff0c;发现 index.less .drag_upload {width: 100%;height: 90vh;padding: 20px; }index.jsx import React, { useState, useEffect } from react; import styles from ./index.less;export default ({ }) > {return (<div classNa…

基于STM32的智能家居电器控制系统

目录 引言环境准备 2.1 硬件准备 2.2 软件准备智能家居电器控制系统基础 3.1 控制系统架构 3.2 功能描述代码实现&#xff1a;实现智能家居电器控制系统 4.1 数据采集模块 4.2 控制逻辑与设备管理 4.3 通信与远程控制实现 4.4 用户界面与数据可视化应用场景&#xff1a;家庭自…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

vue3【实战】响应式的登录界面

效果预览 WEB 端效果 移动端效果 技术方案 vue3 vite Element Plus VueRouter UnoCSS TS vueUse AutoImport 技术要点 响应式设计 移动端&#xff1a;图片切换为绝对定位&#xff0c;下移一层&#xff0c;成为背景图片 <el-imageclass"w-screen h-screen lt-md…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

AIGC学习笔记(6)——AI大模型开发工程师

文章目录 AI大模型开发工程师005 OpenAI大模型案例实践1 AI 翻译助手需求分析项目起源市场价格和市场前景基于大模型的翻译软件核心功能设计 2 AI 翻译助手架构设计架构设计代码结构设计 3 AI 翻译助手核心功能文档解析文档操作PDF文档操作表格操作图片操作 Prompt封装 4 AI 翻…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

【C++笔记】数据结构进阶之二叉搜索树(BSTree)

【C笔记】数据结构进阶之二叉搜索树(BSTree) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】数据结构进阶之二叉搜索树(BSTree)前言一.二叉搜索树的概念二.二叉搜索树的性能分析三.二叉搜索树的实现3.1二叉树的中序…

无线图传下的低延迟视频传输播放技术探讨

技术背景 无线图传技术即无线图像传输技术&#xff0c;是指不用布线&#xff08;线缆&#xff09;利用无线电波来传输图像数据的技术。 一、工作原理 无线图传技术主要涉及图像采集、编码、调制、发射、接收、解调、解码和图像显示等环节。 图像采集&#xff1a;通过摄像头…

Linux的开发工具(三)

条件编译 预处理本质&#xff1a;对代码进行裁剪 像网易云音乐有vip和普通用户&#xff0c;可以通过条件编译来&#xff0c;这样只用写一份代码&#xff0c;也只用维护一份代码&#xff0c;是vip就走vip代码&#xff0c;不是就普通用户代码&#xff0c;条件编译来动态裁剪。 …

VSCode 汉化教程【简洁易懂】

VSCode【下载】【安装】【汉化】【配置C环境&#xff08;超快&#xff09;】&#xff08;Windows环境&#xff09;-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;…

Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成

Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 1、 Doxygen简介 Doxygen 是一个由 C 编写的、开源的、跨平台的文档生成系统。最初主要用于生成 C 库的 API 文档&#xff0c;但目前又添加了对 C、C#、Java、Python、Fortran、PHP 等语言的支持。其从源代码中提取注释&…

Linux网络——网络层

网络层的作用&#xff1a;在复杂的网络环境中确定一个合适的路径。 一.IP协议 IP存在的意义&#xff1a;IP地址提供一种能力&#xff0c;使得数据能够从主机B跨网络、可靠的送至主机A。 1.协议头格式 能够看出IP协议的格式与TCP协议存在很多相似之处&#xff0c;同样拥有4为首…

Shiro-550反序列化漏洞分析

&#x1f338; 环境配置 代码下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/refs/tags/shiro-root-1.2.4 下载完成之后&#xff0c;需要修改一下pom文件&#xff1a; 修改一下红色框中的配置。然后配置一下tomcat&#xff1a; 点击部署&#xff0c;然后…

【Rhino】【Python】Create a series of Blocks according to Value of object Property

文章目录 1. Complete Code Display2. Detailed Code Analysis2.1 Import and Setup2.2 Function Structure and Initial Setup2.3 Object Collection and Filtering2.4 Story Management System2.5 Locating Point Processing2.6 Object Organization by Story2.7 Block Creat…

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

【探寻密码的奥秘】-001:解开密码的神秘面纱

目录 1、密码学概述1.1、概念1.2、目的1.3、应用场景 2、密码学的历史2.1、第一时期&#xff1a;古代密码时代2.2、第二时期&#xff1a;机械密码时代2.3、第三时期&#xff1a;信息密码时代2.4、第四时期&#xff1a;现代密码时代 3、密码学的基本概念3.1、一般通信系统3.2、保…