首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >欧拉整体:优化

欧拉整体:优化
EN

Stack Overflow用户
提问于 2013-11-01 12:36:00
回答 2查看 529关注 0票数 1
代码语言:javascript
复制
int main(void)
{
  int n, div, a, b;
  double phi;
  printf("Enter n:\n");
  if (scanf("%d", &n) < 1 || n <= 0)
  {
    printf("Wrong input.\n");
    return 1;
  }

  a = n;
  div = 2;
  phi = n;

  while (n != 1)
  {
    if (n % div != 0)
      div++;
    else
    {
      n = n / div;
      if (b != div)
      {
        b = div;
        phi = phi * (1.0 - 1.0 / div);
      }
    }
  }

  printf("phi(%d) = %.f\n", a, phi);

  return 0;
}

这是我作为学校作业所做的Eulers Totient的代码。这个程序似乎运行得很好,但仍然很慢。请问怎样才能使它更快?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-01 13:00:59

第一次检查div=2

在此之后,只需检查奇数,就可以使用div += 2。这应该可以把时间缩短一半。

票数 1
EN

Stack Overflow用户

发布于 2013-11-01 13:37:31

我不确定是否有更好的算法,但我们可以从低挂水果开始:您正在测试n的所有数字,以找到它的除数。从φ(n)的定义来看,这是多余的,我们知道我们只需要它的素因子。

很好,有人可能会说,我们刚刚把线性搜索变成了一个超多项式问题。

不一定。

以P6主候选生成器为例:

代码语言:javascript
复制
def P6():
    yield 2
    yield 3
    i = 5
    while True:
        yield i
        if i % 6 == 1:
            i += 2
        i += 2

让我们在此基础上构建一个分解函数:

代码语言:javascript
复制
def factors(n):
    d = {}
    primes = p6()
    for p in primes:
        while n % p == 0:
            n /= p
            d[p] = d.setdefault(p, 0) + 1
        if n == 1:
            return d

现在找到φ(n)是很简单的。尝试在C中实现这一点,并度量差异。如果您需要它更快,像GMP这样的库可以提供更快的分解例程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19726898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档