欧拉 totient 函数

给定一个整数 INLINECODE025b72a8,我们需要找到 欧拉 Totient 函数 的值,记作 Φ(n)。该函数 Φ(n) 表示小于或等于 INLINECODE4b33b665 且与 n 互质 的正整数的个数。

> 对于输入 n,欧拉 Totient 函数 Φ(n) 是集合 {1, 2, 3, …, n-1} 中与 n 互质的数的计数,即这些数与 n 的 GCD (最大公约数) 为 1。

>

> 如果 n 是一个正整数,且其质因数分解为:n = p1^{e1} \cdot p2^{e2} \cdot \ldots \cdot pk^{ek}

> 其中 p1, p2, \ldots, p_k​ 是 n 的不同质因数,那么:

> \phi(n) = n \cdot \left(1 – \frac{1}{p1}\right) \cdot \left(1 – \frac{1}{p2}\right) \cdot \ldots \cdot \left(1 – \frac{1}{p_k}\right).

在 GfG 练习上试一试<img src="https://www.geeksforgeeks.org/problems/euler-totient-function4604/1" alt="redirect icon" />
示例:

> 输入: n = 11

> 输出: 10

> 解释: 从 1 到 11,1,2,3,4,5,6,7,8,9,10 都与 11 互质。

>

> 输入: n = 16

> 输出: 8

> 解释: 从 1 到 16,1,3,5,7,9,11,13,15 都与 16 互质。

目录

  • [朴素方法] 迭代 GCD 法
  • [期望方法] 欧拉乘积公式
  • 欧拉 Totient 函数的一些有趣性质

[朴素方法] 迭代 GCD 法

> 一个简单的解决方案是遍历从 1 到 n-1 的所有数字,并计算与 n 的最大公约数为 1 的数字个数。下面是用于计算输入整数 n 的欧拉 Totient 函数的简单方法的实现。

C++


CODEBLOCK_4c1b37f1

Java


CODEBLOCK_522fbcc6

Python


CODEBLOCK_a9b275c0

C#


CODEBLOCK_e8d6bebb

JavaScript


CODEBLOCK_989db18c

输出

10

时间复杂度: O(n log n)
辅助空间: O(log min(a,b)),其中 a,b 是 gcd 函数的参数。

[期望方法] 欧拉乘积公式

这个想法基于欧拉乘积公式,该公式指出 totient 函数的值等于 n 的所有质因数 p 的乘积。

!Euler‘s-Product-Formula

> 1) 将 result 初始化为 n

> 2) 考虑每一个数字 ‘p‘(其中 ‘p‘ 从 2 变化到 Φ(n))。

> 如果 p 能整除 n,则执行以下操作

> a) 从 1 到 n 减去 p 的所有倍数 [p 的所有倍数

> 与 n 的 gcd 将大于 1(至少为 p)]

> b) 通过重复将 n 除以 p 来更新 n。

> 3) 如果约简后的 n 大于 1,则移除所有倍数

>

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/49678.html
点赞
0.00 平均评分 (0% 分数) - 0