数学 – NTh方形自由半素数

我试图找到第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);
点赞