我目前正在努力提高函数的执行速度,以返回数学方程的两个未知变量。
设ab(a+b)=n,n已知。
import math
def f(n):
# ab(a+b)=n
m = int(math.sqrt(n))
r = range(2, m + 1)
c = set()
for i in r:
a = i
if n % a or a in c:
continue
while a < m:
b = int((-math.pow(a,2) + math.sqrt(math.pow(a, 4) + 4 * a * n)) / (2 * a))
if n == a * b * (a + b):
return (a, b)
c.add(a)
a = a*2
return (0,0)
print(f(102123161417560384731630000))也许你们中的一些人知道改进算法的方法,或者有加速python执行的方法。
我现在的执行时间大约是10秒,我的目标是< 3s。
编辑:忘记提到,a和b都是正整数。
诚挚的问候。
发布于 2022-05-02 12:05:48
我尝试了一种使用保理和几种sympy方法的方法。
不幸的是,与您所做的(对于给定的示例)相比,这是way solwer。如果a和b都是素数,那么它可能比您的解决方案更有效。
不管怎么说我都发出去了。也许你可以想出一个改进的方法:
from sympy.utilities.enumerative import factoring_visitor
from sympy.utilities.enumerative import multiset_partitions_taocp
from sympy import factorint
def solve(n):
primes, multiplicities = zip(*factorint(n).items())
states = multiset_partitions_taocp(multiplicities)
for lst in (factoring_visitor(state, primes) for state in states):
if len(lst) != 3:
continue
lst.sort()
if sum(lst[:2]) == lst[2]:
break
else:
raise ValueError("no solution found")
return lsthttps://stackoverflow.com/questions/72084684
复制相似问题