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

python 实现eulers totient欧拉方程算法

eulers totient欧拉方程算法介绍

欧拉函数(Euler’s Totient Function),通常表示为 𝜑(𝑛),是一个与正整数 𝑛相关的函数,它表示小于或等于 𝑛的正整数中与 𝑛 互质的数的数目。欧拉函数在数论和密码学中有广泛的应用。

欧拉函数的性质
1.**对于质数 𝑝,有 φ ( p ) = p − 1 ∗ ∗ φ(p)=p−1^{**} φ(p)=p1∗∗
2.**如果 𝑛是质数 𝑝 的 𝑘 次幂,即 n = p k n=p^k n=pk,则 φ ( n ) = p k − p k − 1 = p k − 1 ( p − 1 ) ∗ ∗ φ(n)=p^k−p^{k−1}=p^{k−1}(p−1)** φ(n)=pkpk1=pk1(p1)
3.**如果 𝑚和 𝑛是互质的,则 φ ( m n ) = φ ( m ) φ ( n ) ∗ ∗ φ(mn)=φ(m)φ(n)^{**} φ(mn)=φ(m)φ(n)∗∗
欧拉函数的计算
基于上述性质,我们可以设计一个算法来计算任意正整数 𝑛 的欧拉函数 𝜑(𝑛)。

算法步骤
质因数分解:首先,将 𝑛分解为质因数的乘积形式,即 n = p 1 e 1 ⋅ p 2 e 2 ⋯ p k e k n=p_{1}^{e1}⋅p_{2}^{e2}⋯p_{k}^{ek} n=p1e1p2e2pkek
应用欧拉函数的性质:根据性质 2,对于每个质因数 p i p_i pi,有 φ ( p i e i ) = p i e i − 1 ( p i − 1 ) φ(p_{i}^{ei})=p_{i}^{ei−1}(p_i−1) φ(piei)=piei1(pi1)
利用性质 3:由于 p 1 , p 2 , … , p k p_1,p_2,…,p_k p1,p2,,pk是互质的,所以 φ ( n ) = φ ( p 1 e 1 ) ⋅ φ ( p 2 e 2 ) ⋯ φ ( p k e k ) φ(n)=φ(p_{1}^{e1})⋅φ(p_{2}^{e2})⋯φ(p_{k}^{ek}) φ(n)=φ(p1e1)φ(p2e2)φ(pkek)
Python 实现

def euler_phi(n):
    phi = n
    # 遍历从2到sqrt(n)的所有数
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            # 根据性质更新phi
            phi = phi // i * (i - 1)
            # 如果i是n的因子,那么n//i也是n的因子,除非它们是同一个数
            while n % i == 0:
                n //= i
        # 如果n此时已经是质数,则直接返回phi*(n-1)
        if n == 1:
            break
    # 如果n此时大于1,说明n是质数
    if n > 1:
        phi = phi // n * (n - 1)
    return phi

# 测试
print(euler_phi(10))  # 输出 4
print(euler_phi(20))  # 输出 8

这个算法首先尝试找到 𝑛的所有质因数,并应用欧拉函数的性质来逐步计算 𝜑(𝑛)。注意,在遍历过程中,如果 𝑛 能被 𝑖整除,我们就更新 𝑛 和 𝜑(𝑛),直到 𝑛变为 1 或 𝑖超出 𝑛的平方根。如果最后 𝑛 大于 1,说明 𝑛 是一个质数,我们还需要再应用一次性质 1 来更新 𝜑(𝑛)。

eulers totient欧拉方程算法python实现样例

欧拉函数(Euler’s totient function)是一个数论函数,表示小于等于n的正整数中与n互质的数的个数。可以通过欧拉函数来求解模数为n的群的个数。

欧拉函数的计算公式为:

φ(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)

其中p1, p2, …, pk 是 n 的所有质因数。

下面是一个用 Python 实现欧拉函数的算法:

def euler_totient(n):
    phi = n
    p = 2
    while p * p <= n:
        if n % p == 0:
            while n % p == 0:
                n //= p
            phi -= phi // p
        p += 1
    if n > 1:
        phi -= phi // n
    return phi

这个算法的时间复杂度是 O(sqrt(n)),其中 n 是给定的数。

使用示例:

n = 10
result = euler_totient(n)
print(f"φ({n}) = {result}")

输出结果为:

φ(10) = 4

这表示小于等于 10 的正整数中与 10 互质的数的个数为 4。


http://www.kler.cn/news/310511.html

相关文章:

  • 尤雨溪推荐的拖拽插件,支持Vue2/Vue3 VueDraggablePlus
  • 免费开源微信机器人 教程/文档/开发
  • 828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
  • WAAP解决方案:守护数字时代的安全盾牌
  • 从底层原理上解释clickhouse查询为什么快
  • istio中如何使用serviceentry引入外部服务
  • MySQL常用语句(一)
  • 【w0网页制作】Html+Css网页制作影视主题之庆余年Ⅱ含轮播表单(5页面附源码)
  • Android Room 数据库自动升级与迁移策略
  • 探索IT行业的无限潜力:技术、发展与职业前景
  • python 2024-9
  • 拓扑排序基础
  • Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)
  • Kafka性质小结
  • 学习使用SQL Server Management Studio (SSMS)
  • 计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 期货量化跟单系统演示
  • Leetcode Hot 100刷题记录 -Day17(搜索二维矩阵II)
  • 如何在Windows系统上使用谷歌浏览器进行远程工作
  • 51单片机按键数码管(简单设计)
  • Matlab对状态机建模的方法
  • 【C++】猜数字小游戏
  • 什么是 PHP? 为什么用 PHP? 有谁在用 PHP?
  • 【机器学习导引】ch2-模型评估与选择
  • Spring6梳理9—— 依赖注入之注入对象类型属性
  • array和linked list的区别
  • 从IPC摄像机读取视频帧解码并转化为YUV数据到转化为Bitmap
  • 探索Java中的设计模式:原则与实例
  • ubuntu24系统普通用户免密切换到root用户
  • 整流器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型