如何在一个范围[1,x]中计算协素数到n其中x可以不同于n

How to count co-prime to n in a range [1,x] where x can be different from n?

本文关键字:计算 不同于 其中 一个 范围      更新时间:2023-10-16

我想计算范围[1,x]中n的余素数。我试过用欧拉函数但它给出了[1,n]。有谁能提出对欧拉的修改或者其他方法吗?我用(n) = n* (1-(1/p))其中p是n的质因数

您可以使用包容-排除原则

求N的唯一素因子(不能大于10-12,考虑N和X =10^10)

现在你可以通过除法找到<=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 or 30}。

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

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

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

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

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

  9. 从[1..]到N的共素数个数X] = X - step5 + step6 - step7等{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 = -62 + 20 - 2 = 16。

假设X = 10。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中,我们可以减去底面(X/p),你就会得到[1,X]中相对于p素数的数。

在这个例子中,有10个数字。能被2整除的数是10/2,也就是5。所以,10-5 = 5个数相对于2是质数。类似地,有10/3=3的数是3的倍数。那么,我们能说有5-3=2的数相对于2和3是质数吗?不。因为你重复计算了!为什么?6已被包括在p = 2和3的计数中。所以我们必须通过2和3的倍数来解释这个。在[1,10]中,2和3的倍数只有一个,即6。所以加1。也就是说,答案是10 - 5 - 3 + 1 = 3,这是正确的。

这是包含和排除原则的推广。对于每一个n,我们只要求它的质因数,我知道它肯定小于10左右。这是用埃拉托色尼筛法完成的,然后是质因数分解。(自X <10^9,一个数的最大质因数数小于10^9。试着找出前10个质数的乘积。它将是:6469693230,大约是~ 64*10^9。(我认为最大限度是10^10。这可以很容易地扩展到像10^18这样的大数字。

我希望这有助于!!