- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我想编写 totient 函数,一种方法(假设我们有一个 primeFactors
函数,它返回一个包含多重性的列表。)如下:
totient:: Integer->Integer
totient m = product [(p - 1) | p <- primeFactors m]
这很好,但还有另一种方法可以做到这一点,即对 (1-1/p) 进行乘积,然后将乘积乘以 n。然而,这里存在一个“类型”问题,因为 1-1/p 从来都不是整数,所以像
totientRevisited n =n* product map (\x->1-1/x) (primeFactors n)
不会按照编写的那样在 Haskell 中运行。
我的问题是是否有一种简单的方法可以在函数之间传递到新类型。我怀疑有某种柯里化(Currying)方法,但我一直无法解决。
最佳答案
有两个原因:
totientRevisited n = n * product map (\x->1-1/x) (primeFactors n)
不起作用。
首先,product
需要一个参数 (a (Num a, Foldable t) => t a
),你给它三个 (map
、(\x->1-1/x)
和 (primeFactors n)
)。这是 $
的典型用例。产品周围也缺少括号。我们这样写:
totientRevisited n = n * (product $ map (\x->1-1/x) (primeFactors n))
其次,您遇到数字类型问题。您正在将 1
除以一个整数。然而 /
需要两个小数:
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
您必须将 x
转换为小数。使用 fromIntegral
函数:
totientRevisited n = (fromIntegral n) * (product $ map (\x->1-1/(fromIntegral x)) (primeFactors n))
您必须使用 fromIntegral n
因为 (*)
需要两个相同类型的 Num:
Prelude> :t (*)
(*) :: Num a => a -> a -> a
现在它运行了,但它返回一个分数。
只需对结果进行轮
即可获得整数(再次注意$
),然后就完成了:
totientRevisited n = round $ (fromIntegral n) * (product $ map (\x->1-1/(fromIntegral x)) (primeFactors n))
编辑精度:我写道“product
”需要一个参数 (a (Num a, Foldable t) => t a
),而你给它三个(map
、(\x->1-1/x)
和 (primeFactors n)
)”。从技术上讲,这是不正确的:你不能给一个函数提供三个参数,因为 Haskell 中的函数总是接受一个参数,并且可能返回另一个接受另一个参数的函数......这就是“柯里化(Currying)”方法。因此,您向 product
提供了参数 map
,但它需要一个可折叠的,因此出现错误。
关于haskell - 在haskell中重写euler-totient函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49591643/
作为我研究的一部分,我正在使用不同的并行计算语言实现 Totient 求和(Euler 的 Totient),老实说,我在 MapReduce 方面相当吃力。主要目标是对运行时、效率等进行基准测试..
经过一番浏览,我找到了这段代码,用于使用 Eratostenes 筛法在线性时间内计算欧拉的 phi 值。但是未能理解这段代码中使用的主要逻辑,特别是内部 for 循环中所做的事情和使用的想法这个循环
int main(void) { int n, div, a, b; double phi; printf("Enter n:\n"); if (scanf("%d", &n) < 1
我在一个编码平台上看到这段代码可以有效地计算不同值的欧拉 totient。我无法理解这个实现。我真的很想学这个。谁能帮我解释一下? for(int i = 1; i < Maxn; i++) { //
我正试图找到一种有效的方法来计算 Euler's totient function . 这段代码有什么问题?它似乎不起作用。 def isPrime(a): return not ( a <
这是欧拉 Totient 的例子。输入 n 的欧拉 Totient 函数 ?(n) 是 {1, 2, 3, …, n} 中与 n 互质的数字的计数,即与 n 的 GCD(最大公约数)为 1 的数字。我
来自Python ProblemSet我想测试以下函数,但似乎无法定义 mult 和 coprime 。我尝试导入数学,但这没有帮助。有什么建议吗? >>> import itertools >>>
要计算与 N 互质且小于 N 的整数的数量,我们可以简单地计算它的 ETF .然而,要计算与 N 互质但小于 M 的整数数量,其中 M 1) result -= result / n; ret
我一直在努力tackle this problem ,但我很难理解它: Let φ be Euler's totient function, i.e. for a natural number n,
对于自然数 n,欧拉的 totient 函数定义为集合 {1,...n} 中与 n 互质的自然数的数量>。我必须用 C 语言编写一个程序,以便对于输入 n,输出是 n 的欧拉总函数。这是我的尝试: #
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我很难使用 Hadoop map reduce 来计算两个值之间的总和。 例如,我想计算 [1, 15000] 的总和。但据我所知,map-reduce 处理具有共同点(标签)的数据。 我设法理解了该
我正在解决ETF SPOJ的问题。我使用埃拉托色尼筛法来计算素数,然后使用 Phi 的基本定义,但 SPOJ 给出了错误的答案。我已经在 GCC 编译器上对其进行了测试,其中提到的范围为 0 到 10
我已经设法让 Eulers Totient Function 的一个版本工作,尽管它适用于较小的数字(与我需要它计算的 1024 位数字相比,此处较小的数字更小) 我的版本在这里- public st
以清晰易懂的方式重新发布它,没有任何未正确显示的复杂 MathJax: 为了好玩,我浏览了一些计算机科学/数论挑战网站,他们提出了以下问题,具体如下: 让P(n) = sum{1 {
我正在制作一个有趣的加密程序,但我在做一些数学运算时遇到了问题。我需要:“Compute φ(n) = φ(p)φ(q) = (p − 1)(q − 1), where φ is Euler's to
我的老师给了我们一个关于数学问题的 acm 问题。我试过了,但得到了 TLE。 问题来了 欧拉的 Totient 函数 φ (n) [有时称为 phi 函数] 用于确定与 n 互质且小于 n 的数的数
我是一名优秀的程序员,十分优秀!