✨ feat(project):添加欧拉项目第4、5题解决方案及文档
📝 docs(README):更新项目描述并添加核心数学理念说明 🔧 chore(pyproject.toml):更新项目描述信息 ♻️ refactor(euler_3.py):改进质因数分解函数并添加类型注解 💡 docs(readme):添加第4题数学分析文档和算法说明 ✅ test(euler_3.py):添加主函数测试用例验证质因数分解功能
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
"""
|
||||
The prime factors of 13195 are 5, 7, 13and 29.
|
||||
What is the largest prime factor of the number 600851475143 ?
|
||||
"""
|
||||
|
||||
import random
|
||||
from math import gcd
|
||||
from typing import List, Set
|
||||
@@ -34,7 +39,7 @@ def is_probable_prime(n: int, trials: int = 10) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def pollards_rho(n: int, max_iter: int = 100000) -> int:
|
||||
def pollards_rho(n: int, max_iter: int = 100000) -> int | None:
|
||||
"""
|
||||
Pollard's Rho 算法:返回n的一个非平凡因子
|
||||
|
||||
@@ -46,6 +51,7 @@ def pollards_rho(n: int, max_iter: int = 100000) -> int:
|
||||
n的一个因子(可能是质数也可能是合数)
|
||||
若失败返回None
|
||||
"""
|
||||
|
||||
if n % 2 == 0:
|
||||
return 2
|
||||
|
||||
@@ -86,6 +92,8 @@ def factorize(n: int | None) -> List[int | None]:
|
||||
"""
|
||||
if n == 1:
|
||||
return []
|
||||
if n is None:
|
||||
return [None]
|
||||
|
||||
# 如果是质数,直接返回
|
||||
if is_probable_prime(n):
|
||||
@@ -94,6 +102,9 @@ def factorize(n: int | None) -> List[int | None]:
|
||||
# 获取一个因子
|
||||
factor = pollards_rho(n)
|
||||
|
||||
if factor is None:
|
||||
return [None]
|
||||
|
||||
# 递归分解
|
||||
return factorize(factor) + factorize(n // factor)
|
||||
|
||||
@@ -101,3 +112,7 @@ def factorize(n: int | None) -> List[int | None]:
|
||||
def get_prime_factors(n: int) -> Set[int | None]:
|
||||
"""获取所有不重复的质因数"""
|
||||
return set(factorize(n))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(get_prime_factors(60)) # {2, 3, 5}
|
||||
|
||||
Reference in New Issue
Block a user