演算法題 高斯消元解異或線性方程組(Python)

2021-10-13 13:15:32 字數 1686 閱讀 2000

輸入乙個包含n個方程n個未知數的異或線性方程組。

方程組中的係數和常數為0或1,每個未知數的取值也為0或1。

求解這個方程組。

異或線性方程組示例如下:

m[1][1]x[1] ^ m[1][2]x[2] ^ … ^ m[1][n]x[n] = b[1]

m[2][1]x[1] ^ m[2][2]x[2] ^ … ^ m[2][n]x[n] = b[2]

…m[n][1]x[1] ^ m[n][2]x[2] ^ … ^ m[n][n]x[n] = b[n]

其中「^」表示異或(xor),m[i][j]表示第i個式子中x[j]的係數,b[i]是第i個方程右端的常數,取值均為0或1。

輸入格式

第一行包含整數n。

接下來n行,每行包含n+1個整數0或1,表示乙個方程的n個係數以及等號右側的常數。

輸出格式

如果給定線性方程組存在唯一解,則輸出共n行,其中第i行輸出第i個未知數的解。

如果給定線性方程組存在多組解,則輸出「multiple sets of solutions」。

如果給定線性方程組無解,則輸出「no solution」。

資料範圍

1≤n≤100

輸入樣例:

3

1 1 0 1

0 1 1 0

1 0 0 1

輸出樣例:

1

00

n = int(input())

a =

for i in range(n):

def guass():

global n

r = 0

for c in range(n):

t = r

# 首先找到當前列中的1

for i in range(r, n):

if a[i][c] == 1:

t = i

break

# 如果都為0就continue

if a[t][c] == 0: continue

# 交換

a[r], a[t] = a[t], a[r]

# 將這一列為1的與第r行異或

for i in range(r+1, n):

if a[i][c] == 1:

for j in range(c, n+1):

a[i][j] ^= a[r][j]

r += 1

if r < n:

for i in range(r, n):

if a[i][n] == 1: return 1 # 無解

return 2 # 無窮解

for i in range(n-1, -1, -1):

for j in range(i):

if a[j][i] == 1:

a[j][n] ^= a[i][n]

return 0

ret = guass()

if ret == 1: print('no solution')

elif ret == 2: print('multiple sets of solutions')

else:

for i in range(n): print(a[i][n])

高斯消元法解異或線性方程組

對於一組線性方程組,列舉每一列進行如下步驟 1 找到首元非零行 2 將這一行交換到第一行 3 將這一行的第乙個數變成1,對當前這一行進行操作,不涉及矩陣的初等變換 4 將下面所有行的當前列全部消成0,利用矩陣的初等變換 對於原異或方程組進行變換後 如果得到的矩陣是乙個完美的上三角矩陣,則說明方程組有...

高斯消元解線性方程組

高斯消去法是消去法的一種特殊形式,它包括消元和回帶兩個過程。高斯消去法求解線性方程組分為以下兩大步 1 將係數矩陣a經過一系列的初等行變換程式設計右上三角矩陣,其常數向量b也同時做相應的變換,即 在變換過程中,採用原地工作,即經變換後的元素仍存放在原來的儲存單元中。為了實現上述目標,對於k從1到n ...

高斯消元解線性方程組

高斯消元可以通過初等行列變化把 增廣矩陣 轉換成 階梯型矩陣,進而求解 n 個線性方程組的解,其時間複雜為o n 3 初等行列變換 對乙個方程組進行以下三個操作不會影響方程的解 例如線性方程組為 a11x1 a12x2 a13x3 a1nxn b1 a21x1 a22x2 a23x3 a2nxn b...