我也遇到過類似的問題,在我偶然發現這個問題之前,我最終實現了我自己的解決方案。我的似乎在減少手術次數方面做得更好。然而,我的也對所有變數的組合做了乙個暴力風格的集合。因此,它的執行時在變數數量上呈指數級增長。otoh,我已經在乙個不合理的(但遠不是實時的)時間量內執行了它。在
有可能有一些方法可以修剪這裡的一些搜尋分支,但我沒有為此煩惱。歡迎進一步優化。在def collect_best(expr, measure=sympy.count_ops):
# this method performs sympy.collect over all permutations of the free variables, and returns the best collection
best = expr
best_score = measure(expr)
perms = itertools.permutations(expr.free_symbols)
permlen = np.math.factorial(len(expr.free_symbols))
print(permlen)
for i, perm in enumerate(perms):
if (permlen > 1000) and not (i%int(permlen/100)):
print(i)
collected = sympy.collect(expr, perm)
if measure(collected) < best_score:
best_score = measure(collected)
best = collected
return best
def product(args):
arg = next(args)
try:
return arg*product(args)
except:
return arg
def rcollect_best(expr, measure=sympy.count_ops):
# this method performs collect_best recursively on the collected terms
best = collect_best(expr, measure)
best_score = measure(best)
if expr == best:
return best
if isinstance(best, sympy.mul):
return product(map(rcollect_best, best.args))
if isinstance(best, sympy.add):
return sum(map(rcollect_best, best.args))
為了說明效能,this *****(paywalled,對不起)有7個公式,它們是7個變數中的5次多項式,最多有29個項和158個擴充套件形式的運算。在應用rcollect_best和@smichr的iflfactor之後,7個公式中的運算次數為:
^$以及[32, 37, 113, 73, 40, 15, 2]
分別。iflfactor的運算量比其中乙個公式的rcollect_best多433%。此外,擴充套件公式中的運算次數為:[39, 49, 158, 136, 79, 27, 2]
不可摸數(陣列真因子和)
不可摸數 描述有一種很神奇的數。s n 是正整數n的真因子之和,即小於n且整除n的因子和.例如s 12 1 2 3 4 6 16.如果任何 數m的s m 都不等於n,則稱n為不可摸數.輸入包含多組資料,首先輸入t,表示有t組資料.每組資料1行給出n 2 n 1000 是整數。輸出如果n是不可摸數,輸...
Python計算 sympy解數學方程
solve f,symbols,flags 函式說明 f 轉化成右端等於0 形式的表示式 symbols 未知數 coding utf 8 file sympy demo.py date 2018 08 15 author peng shiyu from sympy import solve fro...
《用Python進行科學計算》 SymPy
sympy是python的數學符號計算庫,用它可以進行數學公式的符號推導。e i 1 0 e是自然指數的底,i是虛數單位,是圓周率。驗證這個公式 from sympy import print e i pi 1 0尤拉恒等式可以用下面的公式運算 e ix cos x i sin x coding u...