Restore early-out to factor(). Strengthen tests. (GH-100591)

(cherry picked from commit c4c5790120)

Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2022-12-28 12:37:58 -08:00 committed by GitHub
parent 95fa61cbce
commit 9120450b25
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -862,12 +862,14 @@ which incur interpreter overhead.
"Prime factors of n." "Prime factors of n."
# factor(99) --> 3 3 11 # factor(99) --> 3 3 11
for prime in sieve(math.isqrt(n) + 1): for prime in sieve(math.isqrt(n) + 1):
while n >= prime: while True:
quotient, remainder = divmod(n, prime) quotient, remainder = divmod(n, prime)
if remainder: if remainder:
break break
yield prime yield prime
n = quotient n = quotient
if n == 1:
return
if n >= 2: if n >= 2:
yield n yield n
@ -1256,13 +1258,21 @@ which incur interpreter overhead.
[3, 3] [3, 3]
>>> list(factor(10)) >>> list(factor(10))
[2, 5] [2, 5]
>>> list(factor(999953*999983)) >>> list(factor(128_884_753_939)) # large prime
[128884753939]
>>> list(factor(999953 * 999983)) # large semiprime
[999953, 999983] [999953, 999983]
>>> all(math.prod(factor(n)) == n for n in range(1, 1000)) >>> list(factor(6 ** 20)) == [2] * 20 + [3] * 20 # large power
True True
>>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000)) >>> list(factor(909_909_090_909)) # large multiterm composite
[3, 3, 7, 13, 13, 751, 113797]
>>> math.prod([3, 3, 7, 13, 13, 751, 113797])
909909090909
>>> all(math.prod(factor(n)) == n for n in range(1, 2_000))
True True
>>> all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000)) >>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(2_000))
True
>>> all(list(factor(n)) == sorted(factor(n)) for n in range(2_000))
True True
>>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')])) >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))