haskell - Sieve gets stuck at the beginning -
i wrote following sieve:
isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0) sieve :: [integer] sieve = 2 : [i | <- [3,5..], isprime sieve] but don't understand why gets stuck after first value. running take 10 sieve results in [2, , nothing happens. has infinite recursion. may problem sieve growing , @ same time it's used inside isprime? reason tried modifying isprime follows, without success:
isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0) . takewhile (<n) edit: surprisingly, @jubobs's modification works:
isprime :: integer -> [integer] -> bool isprime n = (\i -> n `mod` /= 0) . takewhile (\p -> p^2 <= n) i cannot understand why version of takewhile works while other not. see previous version tested many unnecessary divisors, in finite number nontheless.
the code should equivalent following python code:
def is_prime(n, ps): in ps: if n % == 0: return false return true def sieve(): yield 2 n = 3 ps = [2] while true: if is_prime(n, ps): yield n ps.append(n) n += 2
you cause infinite recursion applying all entire sieve , not values sieved far. i.e. second element, isprime tests all values in sieve instead of 2.
in python version, wrote
is_prime(n, ps) which tests n against numbers sieved far. python equivalent of did in haskell basically
is_prime(n, sieve()) now, using takewhile (<n) won't because requires calculating sieve elements. imagine happens second element of sieve (which should 3): tests values of sieve < 3 holds, in order test need evaluate sieve elements. still have infinite recursion.
Comments
Post a Comment