mirror of
https://github.com/python/cpython.git
synced 2025-10-03 05:35:59 +00:00
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:
parent
95fa61cbce
commit
9120450b25
1 changed files with 15 additions and 5 deletions
|
@ -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')]))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue