[英]NTh square free semi prime
您要計算第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.