From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sun, 18 Sep 2022 03:11:29 +0000 (-0700) Subject: Simplify sieve() recipe. Add edge case tests. (GH-96892) X-Git-Tag: v3.11.1~474 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1448e2a42bf8bc53e486427d4515bce20b387d02;p=thirdparty%2FPython%2Fcpython.git Simplify sieve() recipe. Add edge case tests. (GH-96892) (cherry picked from commit 78359b1d45608439f8e03b8e86174fe7b04d3e08) Co-authored-by: Raymond Hettinger --- diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 41aff25d1f79..13fb80a29154 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -818,7 +818,7 @@ which incur interpreter overhead. data = bytearray([1]) * n data[:2] = 0, 0 limit = math.isqrt(n) + 1 - for p in compress(count(), islice(data, limit)): + for p in compress(range(limit), data): data[p+p : n : p] = bytearray(len(range(p+p, n, p))) return compress(count(), data) @@ -1168,6 +1168,9 @@ which incur interpreter overhead. >>> list(sieve(30)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] + >>> small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59] + >>> all(list(sieve(n)) == [p for p in small_primes if p < n] for n in range(60)) + True >>> len(list(sieve(100))) 25 >>> len(list(sieve(1_000))) @@ -1178,6 +1181,9 @@ which incur interpreter overhead. 9592 >>> len(list(sieve(1_000_000))) 78498 + >>> carmichael = {561, 1105, 1729, 2465, 2821, 6601, 8911} # https://oeis.org/A002997 + >>> set(sieve(10_000)).isdisjoint(carmichael) + True >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')])) ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']