這篇博文從uvaoj上的問題1560入手,分析xor方程組的高斯消元法。問題鏈結
通過對問題的閱讀,我們可以發現這是一道「0-1矩陣」的處理問題。題目中也有提示,同乙個位置不必被按下多次,因為它始終只有兩種狀態。所以,布林代數該上場了,而這次的主角是異或運算。這道題某種程度上可以看作是另一道題的一種思路的推廣。
根據另一道題的思路,同樣可得出類似下面這樣的異或方程:
p i,
j⊕pi
+1,j
⊕pi−
1,j⊕
pi,j
+1⊕p
i,j−
1=bi
,j
p_\oplus p_\oplus p_\oplus p_\oplus p_=b_
pi,j⊕
pi+1
,j⊕
pi−1
,j⊕
pi,j
+1⊕
pi,j
−1=
bi,j
按照這個思路,可以列出30個這樣的方程。這個原理肯定沒錯。於是,可以想到,如果能夠利用邊界上未知數較少的點首先縮小搜尋的範圍,那麼這個問題便可能得到解決,就像這篇文章一樣。
然而,現實是,由於未知數過多,這題使用迭代實現每步都有許多分支,於是就會非常地繞(以及可能很耗時)。似乎也有人使用這種方法成功地做了出來。有興趣可以把左上角的點帶進去試一試,本文不詳述。
所以,如果有一種能夠直接解決異或的聯立方程的方法,那這個問題就能真正高效又通用地得到解決。
反正博主自己是沒想到。上網一查,有的文章1
表示可以使用高斯消元來解。但是常規的高斯消元只能用於線性代數方程組,你說能移植就能移植?先舉個例子來看看。
比如這個 x\oplus y=1,\\ x\oplus y\oplus z=0,\\ x\oplus z=0.\end
⎩⎪⎨⎪⎧
x⊕y=
1,x⊕
y⊕z=
0,x⊕
z=0.
通過觀察可以發現,只需要把等式與等式之間整體做異或運算,就可以得到解x=1,\\y=0,\\z=1.\end
⎩⎪⎨⎪⎧
x=1,
y=0,
z=1.
所以,似乎只要把加減消元變成異或消元,就能夠用類似於高斯消元的方法解這種方程組。
這篇stackoverflow回答2
還提供了另外一種理解這個問題的思路,即x1⊕
x2⊕⋯
⊕xn=
(x1+
x2+⋯
+xn)
mod2
(1)x_1\oplus x_2\oplus\cdots\oplus x_n=(x_1+x_2+\cdots+x_n)\bmod 2 \tag
x1⊕x2
⊕⋯⊕
xn=
(x1
+x2
+⋯+x
n)m
od2(
1)其中的"+"為代數加法。我們要解的「線性異或方程」形如
a 11x
1⊕⋯⊕
a1nx
n=bn
a_x_1\oplus\cdots\oplus a_x_n=b_n\\
a11x1
⊕⋯⊕
a1n
xn=
bn由(1)
(1)(1
)式可得(a11
x1+⋯
+a1n
xn)m
od2=
bn
(2)(a_x_1+\cdots+a_x_n)\bmod 2=b_n\tag
(a11x
1+⋯
+a1n
xn
)mod
2=bn
(2)
因此,我們只需要把它當作正常的線性方程組來求解,只不過所有計算結果全部模2,效果便等價於將高斯消元中的加減運算變為異或運算。
可以用高斯-約旦消元法實現,具體演算法本文不做討論。
使用c++(c++11或更高標準)實現時,由於消元過程可能需要行交換操作,並且原coefficient matrix需要多次使用,用傳統陣列需要用迴圈實現陣列拷貝。因此,儲存augmented matrix的容器可以用copy-constructable&move-constructable的std::array,使得**較為簡單,同時由於批量處理的緣故,效率也至少不會低於單個拷貝,甚至還可能更高。
#include
#include
#include
using std::array;
using std::cin;
using std::cout;
using std::endl;
arrayint,
31>,30
> a;
arrayint,
31>,30
> a_orig;
int ans[5]
[6];
int diff[5]
[2]=
,,,,
};void
solve_by_gauss()
} std::
swap
(a[k]
, a[j]);
// std::swap is overloaded for std::array
for(
int i =
0; i <
30; i++)if
(a[i]
[j]==1)
}}}for
(int i =
0; i <
30; i++)}
intmain()
}}int c =0;
for(
int i =
0; i < m; i++
)solve_by_gauss()
; cout <<
"puzzle #"
<<
++c << endl;
for(
int i =
0; i <
5; i++
) cout << endl;}}
return0;
}
鏈結 c 解方程組 秩與方程組
今天要講的是兩個結論,通過對這兩個結論的理解和認識可以將很多東西串起來,既算是乙個深化認識,也算是乙個總結。對於方程組ax b 1 如果a是行滿秩的矩陣,那麼方程組要麼有唯一解,要麼有無窮多解。如果a是行滿秩的矩陣,因為矩陣的列秩等於矩陣的行秩,所以矩陣的列秩等於矩陣的行數,所以矩陣的列向量的線性組...
uva 11542 異或方程組
include include include include include includeusing namespace std const int maxn 500 10 const int maxp 100 int vis maxn int prime maxp int gen primes...
之矩陣與方程組
若是你的右眼叫你跌倒,就剜出來丟掉。寧可失去百體中的一體,不叫全身丟在地獄裡。聖經 1.概念 如果線性方程組無解,則稱該方程組是不相容的 inconsistent 如果線性方程組至少存在乙個解,則成為該方程組是相容的 若兩個含有相同變數的方程組具有相同的解集,則稱為他們是等價的 import num...