如何在一个范围[1,x]中计算co-prime到n,其中x可以与n不同?

时间:2013-06-15 06:12:24

标签: c++ algorithm primes

我想计算范围[1,x]中n的共素数。我已经尝试过使用euler phi函数,但是它给出了[1,n]。任何人都建议修改euler phi或任何其他方法来做到这一点? 我使用了(1-(1 / p))的phi(n)= n *乘积,其中p是n的素因子。

1 个答案:

答案 0 :(得分:2)

您可以使用Inclusion-Exclusion Principle

找出N的唯一素因子(它们不能超过10-12,考虑N和X <= 10 ^ 10)。

现在你可以找到数字的数量&lt; = x并且可以通过除以'y'整除。为y 尝试n的所有因子组合(在最坏的情况下,你只得到2 ^ 10(1024))。 现在使用包含排除来查找n小于x的共素。

  

这个想法是,如果一个数字不是n的共同素数,那么它将具有   与n。

共同的至少一个主要因素

对于我们这里的例子,我们可以考虑X = 35和N = 30

  1. 首先找到该数字的唯一素因子。 (他们的人数不得超过10-12)。唯一的素数因子N = {2,3,5}。

  2. 查找每个因素的产品 PAIR 。 {2x3​​,2x5,3x5或6,10,15}。

  3. 查找每个因素 TRIPLET 的产品:{2x3x5或30}。

  4. 重复直到所有因素相乘:{N = 30且不再需要步骤}。

  5. 从步骤1中找出X除以每个因子的总和:{X = 35:(35/2)+(35/3)+(35/5)=(17 + 11 + 7)= 35}

  6. 在步骤2中找出X除以每个数字的总和:{X = 35:35/65 + 3 + 2 = 10}

  7. 在步骤3中找出X除以每个数字的总和:{X = 35:1}

  8. 重复直至吸收步骤4的所有结果:{x = 35不再需要步骤}

  9. 范围[1..X] = X - 步骤5 +步骤6 - 步骤7等中的N的共素数。{N = 30,X = 35由35 - 35 + 10 - 1给出= 9}。

  10.   

    对于N = 30,X = 60,您将拥有:

         

    60 - (60/2 + 60/3 + 60/5)+(60/6 + 60/10 + 60/15) - (60/30)= 60 -   (30 + 20 + 12)+(10 + 6 + 4) - 2 = 60-62 + 20 - 2 = 16.

    假设X = 10.N = 6 = 2 * 3.

    我们有数字{1,2,3,...,10}。

    删除所有的2的倍数。你得到:{1,3,5,7,9}。

    删除所有3的倍数。你得到:{1,5,7}。

    我们如何有效地计算?尝试回答这个问题:[1,X]中有多少个可以被p整除的数字?楼层(X / p),对吗?即,p,2p,...,kp,其中kp <= X.因此,从X,我们可以减去Floor(X / p), 你会得到[1,X]中p相对素数的数字。

    在此示例中,有10个数字。被2整除的数字的数量是10/2,即5。因此,10-5 = 5个数字相对于2的素数。相似,有10/3 = 3个数字是3的倍数。所以,我们可以说有5-3 = 2个数字是2和3的相对素数?不,因为你有双倍数!为什么? p = 2和3的计数中包括6个。因此我们必须通过加上2和3的倍数来解释这个。在[1,10]中只有2和3的一个倍数,即6。所以,添加1.这意味着,答案是10 - 5 - 3 + 1 = 3,这是对的。

    这是对包含和排除原则的概括。对于每一个n,我们只是找到它的主要因素,我知道肯定会少于10个左右。这是使用Eratosthenes筛,然后进行素因子分解。 (由于X <10 ^ 9,一个数将具有的素数因子的最大数量较少。尝试找出前10个素数的乘积。它将是:6469693230,约为~64 * 10 ^ 9。(我认为最大限制为10 ^ 10.这可以很容易地扩展到像10 ^ 18这样的大数字。)

    我希望这会有所帮助!!