def sieve(n):
    is_prime = [True] * (n + 1)
    is_prime[0] = False
    is_prime[1] = False
    i = 2
    while i * i <= n:
        if is_prime[i]:
            j = i * i
            while j <= n:
                is_prime[j] = False
                j = j + i
        i = i + 1
    primes = []
    for k in range(2, n + 1):
        if is_prime[k]:
            primes.append(k)
    return primes

print(sieve(30))
