我试图找到第n个(n <= 2000000)
square free
semi prime.我有以下代码来执行此操作.
int k = 0;
for(int i = 0; i <= 1000; i++)
{
for(int j = i +1 ; j <= 2500; j++ )
{
semiprimes[k++] = (primes[i]*primes[j]);
}
}
sort(semiprimes,semiprimes+k);
primes []是素数列表.
我的问题是,我得到n = 2000000的不同值,对for循环有不同的限制.有人能说出正确计算这些限制的方法吗?
提前致谢..
最佳答案 您想要计算第n个第一个半素数无方格数. “first”表示您必须在特定值下生成所有这些值.您的方法包括生成大量这些数字,对它们进行排序并提取第n个第一个值.
这可能是一个很好的方法,但您必须生成所有数字.在嵌套循环中有两个不同的限制是错过其中一些的好方法(在你的例子中,你不是在计算素数[1001] *素数[1002],它应该是半正数).
为了避免这个问题,你必须计算一个正方形中的所有半素数,比如[1,L] * [1,L],其中L是你对两个循环的限制.
要确定L,您需要的只是计算.
设N是素数[L-1] *素数[L-1]下的半素无方数的数量.
N =(L * L-L)/ 2
L * L是成对乘法的总数. L是平方数.这有两个除以2得到正确的数字(因为primes [i] * primes [j] = primes [j] * primes [i]).
你想选择L使得n <= N.所以对于n = 2000000:
int L = 2001, k = 0;
for(int i = 0; i < L; i++)
{
for(int j = i+1 ; j < L; j++ )
{
semiprimes[k++] = (primes[i]*primes[j]);
}
}
sort(semiprimes,semiprimes+k);