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:
2025-12-15 12:12:03 +08:00
parent d1af6aa880
commit 65999c8456
7 changed files with 203 additions and 2 deletions

View File

@@ -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}