Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm euler-phi函数的计算 intphi(intn){ int结果=n; 对于(int i=2;i*i 1) 结果-=结果/n; 返回结果; }_Algorithm_Math_Implementation - Fatal编程技术网

Algorithm euler-phi函数的计算 intphi(intn){ int结果=n; 对于(int i=2;i*i 1) 结果-=结果/n; 返回结果; }

Algorithm euler-phi函数的计算 intphi(intn){ int结果=n; 对于(int i=2;i*i 1) 结果-=结果/n; 返回结果; },algorithm,math,implementation,Algorithm,Math,Implementation,我看到了上面的Euler phi函数的实现,它是O(sqrt n)。我不知道使用I*II*I这个函数是通过试除法直接实现的整数因式分解,除了在发现因子时报告因子外,函数使用因子计算φ。通过使用更好的算法查找因子,可以在小于O(sqrt n)的时间内完成phi的计算;实现这一点的最佳方法取决于n的大小。如果您想要的最大数量(比如说)足够小,您可以在内存中拥有一个大小为n的表,那么您可以在每次评估中做得更好,但代价是在任何评估之前都必须构建一个表 一种方法是首先建立一个素数表,然后使用最多sqrt(

我看到了上面的Euler phi函数的实现,它是O(sqrt n)。我不知道使用
I*I
I*I这个函数是通过试除法直接实现的整数因式分解,除了在发现因子时报告因子外,函数使用因子计算φ。通过使用更好的算法查找因子,可以在小于O(sqrt n)的时间内完成phi的计算;实现这一点的最佳方法取决于n的大小。

如果您想要的最大数量(比如说)足够小,您可以在内存中拥有一个大小为n的表,那么您可以在每次评估中做得更好,但代价是在任何评估之前都必须构建一个表

一种方法是首先建立一个素数表,然后使用最多sqrt(n)的每个素数的试除,而不是使用最多sqrt(n)的每个整数的试除


您可以通过构建一个表(而不是素数表)来改进这一点,该表给出(对于每个整数2..N)除以数字的最小素数。可以使用对常规的简单修改来构建这样的表。然后,为了计算一个数的totent,你可以用这个表找到除以这个数的最小素数(并将它累加到你的答案中),然后用这个表项除以这个数,用这个表找到除以这个数的最小素数,等等。

找到因子的更好的算法是什么意思?请提及算法的名称:rho和p-1算法、SQUFOF、连分数、椭圆曲线算法、二次筛、数域筛,以及许多目前不在脑海中的其他算法。请注意,其中一些只在专家手中有效。@d为什么不在您引用的页面上的链接上找到“比O(sqrt(n))更快的phi?”之后,再点击该链接呢?该链接回答了这个问题,这不应该令人惊讶,因为它还说“分解的有效算法”它描述了像Pollard rho分解这样的东西,它比20+位数字的试除法要好。我不明白你怎么能读到那页,却不愿意关注上面的链接。
int phi (int n) {
    int result = n;
    for (int i=2; i*i<=n; ++i)
        if (n % i == 0) {
            while (n % i == 0)
                n /= i;
            result -= result / i;
        }
    if (n > 1)
        result -= result / n;
    return result;
}