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

Python 中的余数运算及数论中的同余定理

一、引言

余数运算和同余定理在数学和计算机科学中具有重要地位。Python 提供了强大的工具来实现余数运算,并且可以借助这些工具探索数论中的同余定理。本文将详细介绍 Python 中的余数运算方法,以及如何利用 Python 实现数论中的费马小定理、欧拉定理和中国剩余定理。

二、Python 中的余数运算

(一)基本取余操作

在 Python 中,使用 % 运算符可以方便地进行取余操作。其语法为 a % b,其中 a 是被除数,b 是除数,结果即为 a 除以 b 后的余数。

  • 对于正整数 :例如,7 % 3 的结果是 1,因为 7 除以 3 得商 2 余 1;15 % 5 的结果是 0,表示 15 能被 5 整除,余数为 0。
  • 对于负整数 :Python 中取余结果的符号与除数相同。例如,-7 % 3 的结果是 2,这是由于 Python 内部按照 a = b * q + rq 为整数,r 为余数,且 0 <= r < |b|)来计算,-7 = 3 * (-3) + 2,所以余数为 2;-15 % -5 结果为 0,因为 -15 能被 -5 整除。
  • 对于浮点数 :例如,7.5 % 3.2 的结果约为 1.1,计算过程是 7.5 减去 3.2 与 2.0(商)的乘积。

# 基本取余操作示例
print(7 % 3)    # 输出 1
print(15 % 5)   # 输出 0
print(-7 % 3)   # 输出 2
print(7.5 % 3.2)  # 输出 1.0999999999999996

(二)其他余数运算相关操作

  • divmod 函数 :该函数同时返回商和余数。语法为 divmod(a, b),返回一个元组,第一个元素是商,第二个是余数。例如,divmod(7, 3) 返回 (2, 1)divmod(-7, 3) 返回 (-3, 2)
  • math.fmod 函数 :在 math 模块中,fmod 函数用于计算两个浮点数相除后的余数,其结果符号与被除数相同。例如,math.fmod(7.5, 3.2) 返回约 1.1;math.fmod(-7.5, 3.2) 返回约 -1.1。
  • numpy.mod 函数 :在 NumPy 库中,mod 函数适用于数组运算。对数组中的每个元素分别与指定值取余,返回新数组。例如,对于数组 a = numpy.array([7, 15, -7, 10])b = 3numpy.mod(a, b) 返回 array([1, 0, 2, 1])
import math
import numpy as np# divmod 函数示例
print(divmod(7, 3))   # 输出 (2, 1)
print(divmod(-7, 3))  # 输出 (-3, 2)# math.fmod 函数示例
print(math.fmod(7.5, 3.2))   # 输出 1.0999999999999996
print(math.fmod(-7.5, 3.2))  # 输出 -1.0999999999999996# numpy.mod 函数示例
a = np.array([7, 15, -7, 10])
b = 3
print(np.mod(a, b))  # 输出 [1 0 2 1]

三、数论中的同余定理及 Python 实现

(一)费马小定理

  • 定理内容 :若 p 为质数,a 为不能被 p 整除的整数(即 a 和 p 互质),则 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap11(modp),即 a p − 1 a^{p-1} ap1 除以 p 的余数为 1。
  • Python 实现 :利用 Python 的 pow 函数可高效计算模幂运算,该函数有三个参数 pow(a, b, mod),计算 a b m o d m o d a^b \mod mod abmodmod 的值。例如,验证费马小定理,当 p = 7(质数),a = 3 时,pow(3, 7-1, 7) 返回 1。
  • 应用场景 :在 RSA 加密算法中用于模幂运算,以及一些素性测试算法中。
# 费马小定理验证示例
p = 7  # 质数
a = 3
print(pow(a, p-1, p) == 1)  # 输出 True

(二)欧拉定理

  • 定理内容 :欧拉定理是费马小定理的推广。若 a 和 n 互质(即 gcd ⁡ ( a , n ) = 1 \gcd(a, n) = 1 gcd(a,n)=1),则 a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)} \equiv 1 \pmod{n} aϕ(n)1(modn),其中 ϕ ( n ) \phi(n) ϕ(n) 为欧拉函数,表示小于 n 的正整数中与 n 互质的数的个数。
  • Python 实现 :先计算欧拉函数 ϕ ( n ) \phi(n) ϕ(n),再进行模幂运算。例如,计算 ϕ ( 10 ) \phi(10) ϕ(10),其质因数为 2 和 5, ϕ ( 10 ) = 10 × ( 1 − 1 / 2 ) × ( 1 − 1 / 5 ) = 4 \phi(10) = 10 \times (1 - 1/2) \times (1 - 1/5) = 4 ϕ(10)=10×(11/2)×(11/5)=4。验证欧拉定理,当 a = 3,n = 10 时,pow(3, 4, 10) 结果为 1。
  • 应用场景 :在 RSA 加密算法中用于确定公钥和私钥之间的关系。
# 欧拉定理验证示例
def euler_phi(n):result = ni = 2while i * i <= n:if n % i == 0:while n % i == 0:n //= iresult -= result // ii += 1if n > 1:result -= result // nreturn resultn = 10
a = 3
phi_n = euler_phi(n)
print(pow(a, phi_n, n) == 1)  # 输出 True

(三)中国剩余定理(CRT)

  • 定理内容 :若有同余方程组,每个方程为 x ≡ a i ( m o d m i ) x \equiv a_i \pmod{m_i} xai(modmi),且模 m i m_i mi 两两互质,则方程组在模 m m m m m m 是所有 m i m_i mi 的乘积)下有唯一解。
  • Python 实现 :以解方程组 x ≡ 2 ( m o d 3 ) x \equiv 2 \pmod{3} x2(mod3) x ≡ 3 ( m o d 4 ) x \equiv 3 \pmod{4} x3(mod4) x ≡ 1 ( m o d 5 ) x \equiv 1 \pmod{5} x1(mod5) 为例,使用 SymPy 库的 solve_congruence 函数可以方便地求解。该函数返回解和模数,表示解为 x ≡ 解 ( m o d 模数 ) x \equiv \text{解} \pmod{\text{模数}} x(mod模数)
  • 应用场景 :在大数分解、密码学(如 RSA 的加速解密)和信号处理等领域广泛应用。
from sympy.ntheory.modular import solve_congruence# 中国剩余定理示例
mods = [3, 4, 5]
remainders = [2, 3, 1]
solution = solve_congruence(*list(zip(remainders, mods)))
print(solution)  # 输出 (11, 60),表示解为 x ≡ 11 mod 60

四、总结

通过 Python 中的余数运算和数论中同余定理的实现,我们可以方便地解决众多数学问题和实际应用中的加密、解密等任务。Python 提供的内置函数和库(如 SymPy)为这些计算提供了强大支持,使得复杂的数论问题也能高效求解。这些工具和方法为相关领域的研究与实践提供了坚实基础,推动了数学理论在实际中的广泛应用。

我重新梳理了内容,按照要求增加了基础概念的介绍,并对代码进行了详细注释和说明。不知道现在是否符合你的要求?如果你对某些部分还有疑问,或者需要更深入的解释,请随时告诉我。

http://www.dtcms.com/a/267004.html

相关文章:

  • 五层协议介绍
  • 指针篇(7)- 指针运算笔试题(阿里巴巴)
  • CSS——圆形头像外嵌光圈
  • springsecurity02
  • js中的FileReader对象
  • ESP32CAM通过ESPHome接入HomeAssistant(含无线刷固件等)
  • Python-GUI-wxPython-控件
  • 语音大模型速览(一)F5-TTS
  • 《汇编语言:基于X86处理器》第6章 复习题和练习,编程练习
  • Selenium 安装使用教程
  • Python 量化交易安装使用教程
  • 深度学习3(向量化编程+ python中实现逻辑回归)
  • 遗传算法的原理与实现示例
  • XION:玩转您的第一个智能合约
  • Seq2seq+Attention 机器翻译
  • Go中使用国家新闻出版署实名认证
  • [C++] # 深入理解C++继承:从原理到实现
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • 结构型智能科技的关键可行性——信息型智能向结构型智能的转换(提纲)
  • CSS知识复习2
  • 3-1 PID算法改进(积分部分)
  • Softhub软件下载站实战开发(十二):软件管理编辑页面实现
  • 科学的第五范式:人工智能如何重塑发现之疆
  • 力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
  • 【Qt】QxORM无法删除和更改主键值为0的行,否则报错:invalid primary key
  • Docker学习笔记:Docker网络
  • DotNetBrowser 2.27.14 版本发布啦!
  • Python 制作 pyd(Windows 平台的动态链接库)
  • 力扣:70. 爬楼梯
  • [Terence Tao访谈] 无限 | 关注模型 | 矢量场 | 策略性“作弊” | Lean