Complessità: primo

Pagina 206 del libro di testo

n = int(input("n = "))        # c1
i = 2                         # c2
while(n%i != 0):              # c3
    i = i+1                   # c4
if(i == n):                   # c5   
    print(n, "è primo")       # c6
else:
    print(n, "NON è primo")   # c7
  • T(2) = c1+c2+c3+c5+c7 = 5
  • T(3) = c1+c2+(c3+c4)+c3+c5+c6 = 2*1+5 = 7
  • T(4) = c1+c2+c3+c5+c7 = 5
  • T(5) = c1+c2+(c3+c4)+(c3+c4)+(c3+c4)+c3+c5+c6 = 2*3+5
  • T(6) = c1+c2+c3+c5+c7 = 5

Quindi

  • Caso ottimo: n=2, T(2) = 5
  • … oppure n pari: n=2*m, T(2*m) = 5
  • Caso pessimo
    • Se n è primo falliscono tutte le divisioni per i da 2 a n-1 e ha successo per i=n
    • T(n) = 2*(n-2)+5 = 2*n-4+5 = 2*n+1

Il problema di decidere se un numero n è primo affrontato con l’algoritmo delle divisioni successive porta a una complessità in tempo lineare nel numero delle divisioni.

2

Non è necessario fare le divisioni da 2 a n-1, si può fermare il while a m = \sqrt{n}.

Il problema di decidere se un numero n è primo affrontato con l’algoritmo delle divisioni successive fino alla radice quadrata di n porta a una complessità in tempo polinomiale con esponente 1/2.


Esistono algoritmi con prestazioni migliori… (vedi Wikipedia)