簡體   English   中英

NTh方形免費半素

[英]NTh square free semi prime

我試圖找到nth(n <= 2000000) 平方的自由 半素數 我有以下代碼可以做到這一點。

 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個第一個半素數無平方數。 “第一”意味着您必須以一定值生成所有它們。 您的方法包括生成大量這些數字,對其進行排序並提取第n個第一個值。

這可能是一個好方法,但是必須生成所有數字。 在嵌套循環中有兩個不同的限制是錯過其中一些的好方法(在您的示例中,您沒有計算primes[1001]*primes[1002] ,它應該在semiprimes primes[1001]*primes[1002]中)。

為避免此問題,您必須計算一個正方形中的所有半素數,例如[1,L]*[1,L] ,其中L是兩個循環的極限。

要確定L,您只需要計數即可。 令N為primes[L-1]*primes[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);

我認為,通過計算盒子內所有半素數的方法不會在任何合理的時間內起作用。 假設我們繪制了前200萬個半素數的因數(p,q)。 為了使圖形更加對稱,讓我們為(p,q)和(q,p)繪制一個點。 該圖沒有形成漂亮的矩形區域,而是看起來更像雙曲線y = 1 / x。 此雙曲線延伸得很遠,並且在包含這些雙曲線的整個矩形上進行迭代將浪費大量計算資源。

您可能需要考慮首先解決“ N以下有多少個半素”的問題。 然后使用二進制搜索。 每個查詢可以在大約sqrt(N)個步驟中完成(提示:再次執行二進制搜索)。 您將需要一個相當大的素數表,當然至少要有100萬個甚至更多。 盡管可以通過任意大的常數進行一些預計算來減小它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM