python中真因子 sympy中的因子分解

2021-10-11 12:45:29 字數 1662 閱讀 5739

我也遇到過類似的問題,在我偶然發現這個問題之前,我最終實現了我自己的解決方案。我的似乎在減少手術次數方面做得更好。然而,我的也對所有變數的組合做了乙個暴力風格的集合。因此,它的執行時在變數數量上呈指數級增長。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...