Sieve of Eratosthenes

def sieve_of_eratosthenes(limit):
    # Create a boolean array "prime[0..limit]" and initialize
    # all entries as true. A value in prime[i] will finally
    # be false if i is Not a prime, else true.
    prime = [True] * (limit + 1)
    prime[0] = prime[1] = False  # 0 and 1 are not prime numbers

    for p in range(2, int(limit**0.5) + 1):
        # If prime[p] is not changed, then it is a prime
        if prime[p]:
            # Update all multiples of p
            for i in range(p**2, limit + 1, p):
                prime[i] = False

    # Return the list of prime numbers
    return [i for i in range(2, limit + 1) if prime[i]]

# Example usage:
limit = 50
result = sieve_of_eratosthenes(limit)
print(f"Prime numbers up to {limit}: {result}")