Improve factor() recipe and fix its tests (GH-100576)

(cherry picked from commit 2d52406835)

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

View file

@ -860,18 +860,16 @@ which incur interpreter overhead.
def factor(n): def factor(n):
"Prime factors of n." "Prime factors of n."
# factor(97) --> 97
# factor(98) --> 2 7 7
# factor(99) --> 3 3 11 # factor(99) --> 3 3 11
for prime in sieve(n+1): for prime in sieve(math.isqrt(n) + 1):
while True: while n >= prime:
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: if n >= 2:
return yield n
def flatten(list_of_lists): def flatten(list_of_lists):
"Flatten one level of nesting" "Flatten one level of nesting"
@ -1236,33 +1234,35 @@ which incur interpreter overhead.
>>> set(sieve(10_000)).isdisjoint(carmichael) >>> set(sieve(10_000)).isdisjoint(carmichael)
True True
list(factor(0)) >>> list(factor(0))
[] []
list(factor(1)) >>> list(factor(1))
[] []
list(factor(2)) >>> list(factor(2))
[2] [2]
list(factor(3)) >>> list(factor(3))
[3] [3]
list(factor(4)) >>> list(factor(4))
[2, 2] [2, 2]
list(factor(5)) >>> list(factor(5))
[5] [5]
list(factor(6)) >>> list(factor(6))
[2, 3] [2, 3]
list(factor(7)) >>> list(factor(7))
[7] [7]
list(factor(8)) >>> list(factor(8))
[2, 2, 2] [2, 2, 2]
list(factor(9)) >>> list(factor(9))
[3, 3] [3, 3]
list(factor(10)) >>> list(factor(10))
[2, 5] [2, 5]
all(math.prod(factor(n)) == n for n in range(1, 1000)) >>> list(factor(999953*999983))
[999953, 999983]
>>> all(math.prod(factor(n)) == n for n in range(1, 1000))
True True
all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000)) >>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000))
True True
all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000)) >>> all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000))
True True
>>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')])) >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))