修改Euler Totient函数

时间:2012-10-03 13:43:05

标签: algorithm math

计算与N共同素数和小于N的整数个数,我们可以简单地计算它的ETF。然而,为了计算与N共同质数但小于M的整数的数量,其中M <1。 N,我们如何修改/计算它? 我已经尝试过代码来计算ETF,但无法继续修改​​它以获得所需的结果。

代码:

int etf(int n) 
{ 
   int result = n; 
   int i;
   for(i=2;i*i <= n;i++) 
   { 

        if (n % i == 0) result -= result / i; 
        while (n % i == 0) n /= i;
   } 
   if (n > 1) result -= result / n; 
   return result; 
 }

由于

1 个答案:

答案 0 :(得分:4)

您需要使用inclusion-exclusion principle。让我们举个例子:假设你想计算整数的数量为30 = 2 * 3 * 5且小于20。

首先要注意的是,您可以将非互质的数字计算为30并将其从总数中减去,这样会容易得多。小于20的2的倍数是20/2 = 10,3的倍数是20/3 = 6(起发底线),5的倍数是20/5 = 4。

然而,请注意,我们计算的数字如6 = 2 * 3不止一次,两者都是2的倍数和3的倍数。为了解释这一点,我们必须减去每个数字的倍数。两个素数的产物。

另一方面,这超过了必要的三次素数的倍数 - 因此你必须将该计数加到最后。这样做,交替出现符号,直到达到除以N的素数总数。在这个例子中,答案是

20/1 - 20/2 - 20/3 - 20/5 + 20/2 * 3 + 20/3 * 5 + 20/2 * 5 - 20/2 * 3 * 5 = 20 - 10 - 6 - 4 + 3 + 1 + 2 - 0 = 6.

(我们计算的数字是1,7,11,13,17和19。)