Python 求素數之多方法解析

2021-09-29 20:22:59 字數 3251 閱讀 4925

素數簡介:質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。

素數1、素數的普通解法 直接上**

import mathl=[

2]n=int

(input

("請輸入所求素數的上限:"))

for x in

range(1

,n):

for i in

range(2

,x):

if x%i==0:

break

else

:pass

#只需除到x的根號 挨著除完效率低

if(i>math.sqrt(x)):

#if(i==x-1): 效果一樣

# print(x,",是乙個素數")

break

print

(l)

這種方法求小一點的素數範圍還行,如果數大一點就很慢了。比如輸入n為1000000或者更大,上述方法效率就非常低了,執行時間太長。那怎麼快速的求解呢,請看下面。

2、篩選法求解素數(埃拉託色尼篩選法)

具體原理

計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單:

首先,列出從2開始的所有自然數,構造乙個序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取序列的第乙個數2,它一定是素數,然後用2把序列的2的倍數篩掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取新序列的第乙個數3,它一定是素數,然後用3把序列的3的倍數篩掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

取新序列的第乙個數5,然後用5把序列的5的倍數篩掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …

不斷篩下去,就可以得到所有的素數。

**實現如下:

""" 求1000000以內的素數 """

n =1000000

l1 =

[true

for i in

range

(n+1)]

#生成乙個全是true的的陣列

for i in

range(2

,n+1):

#2開始,遇到2的倍數(4,6,8,10...)都賦值為false

j=i+i #3開始,遇到3的倍數(6,9,12...)都賦值為false

while j#以此類推,把所有數字的倍數都賦值為false

l1[j]

=false

#輸出值是true的陣列下標

j = j + i

print

("素數:")t=

for i in

range(2

,n):

if l1[i]

==true

:print

(i,end=

" ")

以下還有幾種篩選法的不同寫法**,效果一樣

def

countprimes

(n):

""" 初始所有乙個n維陣列 res 表示數都為素數。

從3開始將3的奇數倍標記成false,即不是素數。

之後對每乙個素數此行上一步操作

這裡我們不用管偶數倍,因為我們最後判定時預設所有偶數不是素數

"""if n <3:

return[2

] res =

[true

]* n

for i in

range(3

,int

(n **

0.5)+1

,2):

res[i * i::2

* i]=[

false]*

((n - i * i -1)

//(2* i)+1

)return[2

]+[i for i in

range(3

, n,2)

if res[i]

]print

(countprimes(

1000000

))

i=

int(

input

('please enter an integer:'))

#建立乙個空list

r=list()

#新增元素22)

#從3開始挨個篩選

for a in

range(3

,i):

b=false

#用a除以小於a的質數b

for b in r:

if a % b ==0:

b =false

break

else

: b =

true

if b ==

true

:print

(r)

def

primes

(n):

if n <2:

return

if n ==2:

return[2

] s =

list

(range(3

, n,2)

) mroot = n **

0.5 half =

len(s)

i =0 m =

3while m <= mroot:

if s[i]

: j =

(m * m -3)

//2s[j]=0

while j < half:

s[j]=0

j += m

i = i +

1 m =

2* i +

3return[2

]+[x for x in s if x]

print

(primes(

1000000

))

謝謝點讚。

求素數的方法

如何求取素數呢?其實很簡單,思想呢就是找出所有整數p然後,刪去2 p,3 p。就好了?大該怎麼做呢?我們來真實資料 100以內有25個素數,10 3有168個,10 4有1229個,10 5有9592個,10 6有78498個,10 7有664579個 我們就有例項說明一下 0 n的所有素數 inc...

求素數,求因數的方法

素數的定義是 自己總結 只能被1和自身整除的數。注意 1.最小的素數是2。2.1 既不是素數也不是合數。3.素數不包括負數。一般的求解素數的方法是 include includeusing namespace std bool isprime int n int main void filterpr...

求素數 Python實現

用filter求素數 計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單 首先,列出從2開始的所有自然數,構造乙個序列 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,取序列的第乙個數2,它一定是素數,然後用2把序列的2的倍數篩掉 3,4,5,...