埃式篩法和尤拉篩判斷素數

2021-09-26 05:51:31 字數 1511 閱讀 3466

一般要判斷是是否為素數,我們通常找出了1和它本身之外是否存在可以被它整除的數。

接著對判斷可以進行優化,出去偶數,判斷的邊界設定為math.sqrt(number)。

如 以輸入101-200之間的素數為例

public static void fun1()else flag=true;

}if (flag)}}

還有一種時間複雜度上更加優秀的解法,就是埃式篩法:

給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,

把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......

static boolean isprime=new boolean[200] ;

public static void eratosthenes()

for (int i=2;i<200;i++)}}

}

埃氏篩法

時間複雜度 nlog(logn)

初始乙個布林陣列,全部記為 true ,先判斷2和2的倍數,全部為合數 記為false;

再判斷3和3的倍數,全部為合數,記為false;

以此類推,就是對所有合數和素數進行標記。

但是埃式篩法對於例如 16這樣的數,它是2的倍數,也是4,的倍數,也是8的倍數,也就是在標記時會對某些元素重複標記,因

此也可以對埃式篩法優化,也就是尤拉篩法 。

尤拉篩法:保證每個合數只會被它的最小質因數篩掉,時間複雜度降低到o(n)。

public static int euler()

for (int i=2;i<1000;i++)

for (int j = 0; j < count; j++)

isprime[i*prime[j]]=false;

//保證每個合數製備最小的因子篩掉

if (i % prime[j] == 0) }}

return prime;

}//參考位址

還有一種方法也是可以判斷是否為素數,叫做六素數法。

對於大於等於5的數字,我們可以用6的倍數來表示它,

即,6x-1, 6x, 6x+1, 6x+2, 6x+3, 6x+4的輪迴;

6x+2 = 2(3x+1), 6x+3 = 3(2x+1), 6x+4 = 2(3x+2), 6x顯然這些

並不是素數;那麼,我們可以總結為,對4以上的數字來說,

只有6的倍數的左右兩位才有可能是素數;

具體來講:如果判斷的數n%6!=-1或1的話,不符合就不是素數,

如果滿足條件,它有可能是質數,做進一步判定。

埃式篩法 尤拉篩法

埃氏篩法是通過從小到大篩去乙個已知素數的倍數進而實現篩選的。假如我們想篩掉1 100間的所有合數,步驟如下 2是質數,篩掉所有2的倍數 3是質數,篩掉所有3的倍數 4不是質數,跳過 5是質數,篩掉所有5的倍數 6不是質數,跳過 7是質數,篩掉所有7的倍數 8不是質數,跳過 9不是質數,跳過 10不是...

素數判斷 埃氏篩法和尤拉篩法(線性篩法)

埃氏篩法的原理是 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去 任何乙個大於1的自然數 n,如果n不是素數,都可以唯一分解成有限個素數的乘積。例...

素數篩法 埃氏篩及尤拉篩

在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...