import math
分解结果 = dict()
已知素数 = [2, 3]
当前素数序号 = 0
def getPrime(待分解数: int) -> str:
global 分解结果, 已知素数, 当前素数序号
assert isinstance(待分解数, int)
assert 待分解数 > 1
def 判断素数(_判断所用因数们: list, _待判断数: int):
_待判断数平方根 = math.floor(math.sqrt(_待判断数))
for _当前因数 in _判断所用因数们:
if _待判断数 % _当前因数 == 0:
return False # 不是素数
elif _当前因数 > _待判断数平方根:
return True # 是素数
def 更新素数表():
_下一个素数 = 已知素数[-1]+2
while not 判断素数(已知素数, _下一个素数):
_下一个素数 += 2
已知素数.append(_下一个素数)
return
def 递归处理(待分解因数: int) -> None: # **这一次**待分解的数字
global 当前素数序号
待分解因数平方根 = math.floor(math.sqrt(待分解因数)) # 待分解的数字的平方根
当前素数 = 已知素数[当前素数序号] # 取一个素数
print(f'{待分解因数}分解开始')
print(f'当前素数:{当前素数}')
if 待分解因数 == 1: # 乘以一不用写了,乘不乘没区别
print(f'当前无需分解,分解结果:{分解结果}')
return
# (*)
if 待分解因数 == 当前素数: # 待分解的数就是这次的素数,直接算进去
print(f'{待分解因数}就是当前素数,加入分解结果')
if 待分解因数 in 分解结果:
分解结果[待分解因数] += 1
else:
分解结果.update({待分解因数: 1})
return
if not 待分解因数 % 当前素数:
print(f'可以直接用{当前素数}分解{待分解因数}进行递归')
else:
print(f'更新素数以后才能找到分解{待分解因数}的方法或者确定它是素数')
while 待分解因数 % 当前素数: # 待分解的数字不能被当前素数整除
# 如果某因数在待分解数中的指数大于一
# 当待分解数从最小的素数开始分解
# 会先除到剩下某因数的N次方的倍数
# 当某因数以下的素数都被分解出去了
# 某因数成为最小的素数
# 因此当前素数会一直走到某因数
# 此时不满足循坏条件,直接退出循环,进行递归处理。
# 然后这个递归处理会分别处理某因数,和某因数的N-1次方的倍数
# 而此时当前素数已经走到某因数了!
# 因此,指数大于一的因数不会再(#)被加入!!!
if 当前素数 > 待分解因数平方根: # (#)
print(f'当前素数大于待分解因数平方根,{待分解因数}直接加入分解结果')
# 待分解因数不能被此前的任何素数整除
# 甚至此时当前素数也没有走到待分解因数
# 因此待分解因数此前没有被从(*)加入
# 而当前素数没有走到待分解因数,就说明递归处理中没有处理过“待分解因数的平方的倍数”
# 就说明待分解因数在待分解数中的指数为一
分解结果.update({待分解因数: 1})
return
else:
# 取一个新的素数
当前素数序号 += 1
if 当前素数序号 == len(已知素数):
更新素数表()
当前素数 = 已知素数[当前素数序号]
print(f'更新当前素数:{当前素数}')
递归处理(当前素数) # 递归处理的就是当前素数,所以直接在(*)加入,后面的操作都不会进行
递归处理(待分解因数//当前素数) # 接着分,最后就是把最后一个(最大的一个)素因数分解出去以后这边就是1,然后这个函数就该一层层return出去了
print(f'{待分解因数}分解完毕')
递归处理(待分解数)
res = f'{待分解数}={"*".join([f"{k}^{v}^" for k, v in 分解结果.items()])}'
res = res.replace('*', '\\*').replace('^1^', '')
分解结果.clear()
当前素数序号 = 0
return res
print(getPrime(36))