2016-10-11 105 views
1

我有70個變量的60個方程。 所有的人都在一個列表:sympy求解線性方程XOR,NOT

(X0,X1,...,x239)是sympy符號

list_a = [Xor(Not(x40), Not(x86)), Xor(x41, Not(x87)), ...] 

,我的問題是,是否有可能以某種方式改變這個方程模型或解決了他們。 我認爲,它可以有多個解決方案。

+0

看起來像布爾空間上的線性方程組完全解決爲實數上的線性方程組。您能否在您的問題中澄清一下,您是否在尋找算法,或者如何實現您已有的算法,或者兩者兼而有之? – Vovanrock2002

+0

聽起來有點像SAT問題。 –

+0

我正在尋找both.Algorithm以及從列表到矩陣的轉換。 –

回答

1

對邏輯表達式系統的解決方案與對錶達式的連接(And)檢查SAT是一樣的。

In [3]: list_a = [Xor(Not(x40), Not(x86)), Xor(x41, Not(x87))] 

In [4]: list_a 
Out[4]: [¬x₄₀ ⊻ ¬x₈₆, x₄₁ ⊻ ¬x₈₇] 

In [5]: satisfiable(And(*list_a)) 
Out[5]: {x87: False, x40: True, x86: False, x41: False} 

如果你願意,你可以通過all_models=True所有的解決方案,但請注意,在一般情況下,有很多呈指數級的解決方案。

+0

感謝您的解決方案,但如果我有120個變量的60個方程需要很長時間。有沒有可能讓它更快? –

+0

這取決於什麼部分正在變慢。一般來說,轉換到cnf或SAT解決方案的速度都很慢。您可以單獨爲系統運行'to_cnf(And(* list_a))'來檢查。 – asmeurer