【科技】線性異或方程組的相關

線性異或方程組其實是比較經常使用的,一個經典的例子就是關燈問題,在這裏不作累述。變量

咱們形式化的表述這個問題。有$n$個變量,$m$個方程,每個方程形如:方法

$$ a_1 x_1 \; xor \; a_2 x_2 \; xor \; a_3 x_3 \; xor \; ... xor \; a_n x_n  = b $$經驗

其中$a, b, x$的取值範圍都是${0, 1}$。co

 關於這個方程組,咱們一般要求:1)任意一組合法解。2)解的個數。3)最優的解(如字典序第$k$小等)。字典

普通的高斯消元對於解異或方程組有很大的借鑑意義,咱們能夠用兩個方程的係數異或來消元。但和普通不一樣的是,由於這裏每一個變量只有兩種取值,因此咱們能夠算出其解的個數。cas

首先,咱們要對方程組作基本的變換以符合咱們的一些想法。枚舉

咱們要對每一個方程引入關鍵元的概念,定義爲每一個方程從左到右第一個係數不爲$0$的變量。

咱們把這些方程看做是逐個添加的過程,而且在這個過程當中始終要保持每個變量最多成爲一個方程的關鍵元,一個變量能夠不成爲關鍵元。

咱們每次添加一個方程$A$的時候,從左到右枚舉每一個係數不爲$0$的變量。對於當前變量,若是它已是某一個方程$B$的關鍵元,那就用$B$來消$A$,消掉這個變量;不然若是$A$尚未關鍵元,那就把這個變量設成$A$的關鍵元。易得,若是這個方程沒有關鍵元那方程左邊確定都是$0$,此時看方程右邊是不是$0$來判無解,判完就能夠扔了;不然咱們就用方程$A$去消以前的方程。

很明顯,咱們在添加方程的過程當中始終保持了每個變量最多成爲一個方程的關鍵元這個條件。假設最終咱們獲得了$t$個帶有關鍵元的方程,那咱們就會有剩餘的$s = n - t$個變量不是關鍵元,咱們稱他們爲自由元。自由元的含義就是不論他們取值如何,剩下的關鍵元總能夠獲得惟一一組解。從形式上來看的確如此,每個自由元並不會影響別的,改變的至關於只是方程右邊的$b$而已。

有經驗的讀者可能會發現,這裏的處理方法和線性基十分類似。

接着咱們來考慮以前那些問題如何解決。

1)求任意一組解如今來講是十分容易的,咱們只要隨便選擇自由元的取值,而後帶到方程中去便可。

2)因爲自由元的任意一組取值都能導出關鍵元的惟一一組解,因此解的個數就是$2^s$。

3)以求字典序第$k$爲例。咱們用一般的逐位肯定的思路來作。咱們從小到大枚舉每個變量,而且用$now$表示目前方程中自由元的個數。若是當前變量$x$是自由元,那無論$x$取什麼,剩下的解數老是$2^{now - 1}$,據此能夠肯定$x$的值,而後$k -= 2^{now - 1},--now$。若是當前變量$x$是關鍵元,而且方程左邊就它一個變量,顯然它的值是固定的,$continue$就好了。不然就是說除了它還有其餘變量,找到關鍵元右邊的第一個係數爲$1$的變量$y$,可知$y$必定是自由元(若是它是關鍵元就會被別的方程消掉),假設咱們任意肯定了$x$的值,而後就把$y$當成關鍵元,這樣以後自由元個數就會減一,因此在這個$case$中咱們一樣只要判斷$2^{now - 1}$來肯定$x$的取值,而後把$y$當成該方程的關鍵元就好了,$k -= 2^{now - 1}, --now$。

相關文章
相關標籤/搜索