我想计算范围[1,x]中n的共素数。我已经尝试过使用euler phi函数,但是它给出了[1,n]。任何人都建议修改euler phi或任何其他方法来做到这一点? 我使用了(1-(1 / p))的phi(n)= n *乘积,其中p是n的素因子。
答案 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
首先找到该数字的唯一素因子。 (他们的人数不得超过10-12)。唯一的素数因子N = {2,3,5}。
查找每个因素的产品 PAIR 。 {2x3,2x5,3x5或6,10,15}。
查找每个因素 TRIPLET 的产品:{2x3x5或30}。
重复直到所有因素相乘:{N = 30且不再需要步骤}。
从步骤1中找出X除以每个因子的总和:{X = 35:(35/2)+(35/3)+(35/5)=(17 + 11 + 7)= 35}
在步骤2中找出X除以每个数字的总和:{X = 35:35/65 + 3 + 2 = 10}
在步骤3中找出X除以每个数字的总和:{X = 35:1}
重复直至吸收步骤4的所有结果:{x = 35不再需要步骤}
范围[1..X] = X - 步骤5 +步骤6 - 步骤7等中的N的共素数。{N = 30,X = 35由35 - 35 + 10 - 1给出= 9}。
对于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这样的大数字。)
我希望这会有所帮助!!