1. 程式人生 > >幾種簡單的求素數算法的復雜度分析

幾種簡單的求素數算法的復雜度分析

二層 == lse range 復雜度 現在 求素數算法 及其 兩種

素數的算法有很多種,現在主要講兩種算法及其改進版本的復雜度分析,解釋性能提升的幅度。現以求100000內素數為例,兩種算法分別是:   1.基礎思路是去掉偶數,包括取模的範圍,代碼如下:    print(2)

     for i in range(3,100000,2):
      for a in range(3,int(i*0.5)+1,2):
       if i%a == 0:
       break
       else:
         print(i,end = ‘ ‘)
此兩層循環的算法的復雜度為0.5n((n**0.5+1)/2)

          2.應用一個素數定理:大於6的素數一定與6的倍數相鄰,代碼如下:
              print(2,3,end = ‘ ‘)

    t = 100000 // 6 + 1
    for i in range(1,t):
     x = 6 * i - 1
    for j in range(3,int(x**0.5)+1,2):
    if x % j == 0:
    break
     else:
      print(x ,end = ‘ ‘)

     y = 6 * i + 1
     for j in range(3, int(y0.5)+1,2):
     if y % j == 0:
     break
    else:
      print(x ,end = ‘ ‘)
此算法的復雜度為(n/3052)(n
0.5+1)/2,將總範圍分成30為一塊,則6的倍數有5個,相鄰的數就是10個。

                     優化思路:
                     對於1號算法,我們知道末尾是5的數一定能被5整除,所以末位是5的數一定不是素數,復雜度可以降為0.4*n*((n**0.5+1)*0.4)。不是偶數且末為不是5,就剩(1,3,7,9),所以4/10=0.4,第二層循環也是如此。優化效率提升56%(0.5**2/0.4**2-1=0.56)。
                     對於2號算法,思路也是刨去末位為5的數。例如,30~60這一塊內,6的倍數有(36,42,48,54,60),相鄰的數是(35,37,41,43,47,49,53,55,59,61),有兩個末位是5的數(35,55),所以將總範圍分成30為一塊,只需計算8個數,優化後復雜度為(n/30*(5*2-2))*(n**0.5+1)*0.4=4/15*n*(n**0.5+1)*0.4。相比優化後的1號算法,優化後的2號算法效率提升50%(其余項約分,只剩0.4/(4/15),所以0.4/(4/15)-1=0.5)。

                    綜上可見,降低算法復雜度是提高解決問題效率的不二法門。

幾種簡單的求素數算法的復雜度分析