首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高python程序的执行速度,找到两个未知变量并给出结果

提高python程序的执行速度,找到两个未知变量并给出结果
EN

Stack Overflow用户
提问于 2022-05-02 09:19:38
回答 1查看 69关注 0票数 1

我目前正在努力提高函数的执行速度,以返回数学方程的两个未知变量。

设ab(a+b)=n,n已知。

代码语言:javascript
复制
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都是正整数。

诚挚的问候。

EN

回答 1

Stack Overflow用户

发布于 2022-05-02 12:05:48

我尝试了一种使用保理和几种sympy方法的方法。

不幸的是,与您所做的(对于给定的示例)相比,这是way solwer。如果ab都是素数,那么它可能比您的解决方案更有效。

不管怎么说我都发出去了。也许你可以想出一个改进的方法:

代码语言:javascript
复制
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 lst
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72084684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档