Skip to content

Commit 95fa61c

Browse files
Improve factor() recipe and fix its tests (GH-100576)
(cherry picked from commit 2d52406) Co-authored-by: Raymond Hettinger <[email protected]>
1 parent de62128 commit 95fa61c

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

Doc/library/itertools.rst

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -860,18 +860,16 @@ which incur interpreter overhead.
860860

861861
def factor(n):
862862
"Prime factors of n."
863-
# factor(97) --> 97
864-
# factor(98) --> 2 7 7
865863
# factor(99) --> 3 3 11
866-
for prime in sieve(n+1):
867-
while True:
864+
for prime in sieve(math.isqrt(n) + 1):
865+
while n >= prime:
868866
quotient, remainder = divmod(n, prime)
869867
if remainder:
870868
break
871869
yield prime
872870
n = quotient
873-
if n == 1:
874-
return
871+
if n >= 2:
872+
yield n
875873

876874
def flatten(list_of_lists):
877875
"Flatten one level of nesting"
@@ -1236,33 +1234,35 @@ which incur interpreter overhead.
12361234
>>> set(sieve(10_000)).isdisjoint(carmichael)
12371235
True
12381236

1239-
list(factor(0))
1237+
>>> list(factor(0))
12401238
[]
1241-
list(factor(1))
1239+
>>> list(factor(1))
12421240
[]
1243-
list(factor(2))
1241+
>>> list(factor(2))
12441242
[2]
1245-
list(factor(3))
1243+
>>> list(factor(3))
12461244
[3]
1247-
list(factor(4))
1245+
>>> list(factor(4))
12481246
[2, 2]
1249-
list(factor(5))
1247+
>>> list(factor(5))
12501248
[5]
1251-
list(factor(6))
1249+
>>> list(factor(6))
12521250
[2, 3]
1253-
list(factor(7))
1251+
>>> list(factor(7))
12541252
[7]
1255-
list(factor(8))
1253+
>>> list(factor(8))
12561254
[2, 2, 2]
1257-
list(factor(9))
1255+
>>> list(factor(9))
12581256
[3, 3]
1259-
list(factor(10))
1257+
>>> list(factor(10))
12601258
[2, 5]
1261-
all(math.prod(factor(n)) == n for n in range(1, 1000))
1259+
>>> list(factor(999953*999983))
1260+
[999953, 999983]
1261+
>>> all(math.prod(factor(n)) == n for n in range(1, 1000))
12621262
True
1263-
all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000))
1263+
>>> all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000))
12641264
True
1265-
all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000))
1265+
>>> all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000))
12661266
True
12671267

12681268
>>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))

0 commit comments

Comments
 (0)