Summation of primes: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Added a Haskell version) |
(→Python :: Functional: Added a more efficient variant (defined over a generator of primes)) |
||
Line 401: | Line 401: | ||
return not any(map(p, range(5, 1 + int(n ** 0.5), 6))) |
return not any(map(p, range(5, 1 + int(n ** 0.5), 6))) |
||
# MAIN --- |
|||
if __name__ == '__main__': |
|||
main()</lang> |
|||
{{Out}} |
|||
<pre>142913828922</pre> |
|||
Or, more efficiently, assuming that we have a generator of primes: |
|||
<lang python>'''Summatiom of primes''' |
|||
from itertools import takewhile |
|||
# sumOfPrimesBelow :: Int -> Int |
|||
def sumOfPrimesBelow(n): |
|||
'''Sum of all primes between 2 and n''' |
|||
return sum(takewhile(lambda x: n > x, primes())) |
|||
# ------------------------- TEST ------------------------- |
|||
# main :: IO () |
|||
def main(): |
|||
'''Sum of primes below 2 million''' |
|||
print( |
|||
sumOfPrimesBelow(2_000_000) |
|||
) |
|||
# ----------------------- GENERIC ------------------------ |
|||
# primes :: [Int] |
|||
def primes(): |
|||
''' Non finite sequence of prime numbers. |
|||
''' |
|||
n = 2 |
|||
dct = {} |
|||
while True: |
|||
if n in dct: |
|||
for p in dct[n]: |
|||
dct.setdefault(n + p, []).append(p) |
|||
del dct[n] |
|||
else: |
|||
yield n |
|||
dct[n * n] = [n] |
|||
n = 1 + n |
|||