2016-10-11 6 views
1

J'ai 60 équations avec 70 variables. tous sont dans une liste:sympy résoudre les équations linéaires XOR, PAS

(x0, x1, ..., x239) sont des symboles sympy

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

et ma question est, s'il est possible de transformer en quelque sorte cette équation à la matrice ou les a résolus. Je pense, qu'il peut avoir plus d'une solution.

+0

On dirait que les systèmes d'équations linéaires sur l'espace booléen sont résolus exactement comme des systèmes d'équations linéaires sur des nombres réels. Pourriez-vous clarifier dans votre question, cherchez-vous un algorithme, ou comment implémenter un algorithme que vous avez déjà, ou les deux? – Vovanrock2002

+0

Cela ressemble à un problème SAT. –

+0

Je cherche à la fois.Algorithme et aussi pour la transformation de la liste à la matrice. –

Répondre

1

Une solution à un système d'expressions logiques est identique à la vérification de SAT pour la conjonction (Et) des expressions.

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} 

Si vous voulez que toutes les solutions que vous pouvez passer all_models=True, bien qu'il faille noter que dans le cas général, il existe de nombreuses solutions de façon exponentielle.

+0

Merci pour la solution, mais si j'ai 60 équations avec 120 variables cela prend beaucoup de temps. Est-il possible de le rendre plus rapide? –

+0

Cela dépend de la partie qui est lente. Il est généralement soit lent dans la conversion en CNF ou la résolution SAT. Vous pouvez vérifier en exécutant 'to_cnf (And (* list_a))' pour votre système séparément. – asmeurer