def partial_pivoting(a, b):
l = len(a)
for step in range(l):
max = abs(a[step][step])
q = step

for i in range(q, l):
if abs(max) < abs(a[i][q]):
q = i
max = a[i][q]

if max == 0:
return None

a[step], a[q] = a[q], a[step]
b[step], b[q] = b[q], b[step]

for i in range(step + 1, l):
width = len(a[0])
ratio = a[i][step] / a[step][step]
for w in range(step, width):
a[i][w] -= ratio * a[step][w]

b[i] -= ratio * b[step]
return a, b
def gauss_jordan_elimination(a, b):
a, b = partial_pivoting(a, b)
if a == None:
return None
for i in range(len(a)):
if a[i][i]==0:
return None
for j in range(i+1,len(a[0])):
for k in range(j,len(a)):
a[i][k]-=a[i][j]/a[j][j]*a[j][k]
b[i]-=a[i][j]/a[j][j]*b[j]
b[i]/=a[i][i]
return b
def rotate(M):
h=len(M)
w=len(M[0])
L= [ [None] * h for i in range(w)]
for i in range(h):
for j in range(w):
L[j][i]=M[h-i-1][j]
return L

def inverse(a):
b=[[None]*len(a) for i in range(len(a))]
for i in range(len(a)):
L=a
result=[0]*len(a)
result[i]=1
b[i]= gauss_jordan_elimination(L,result)
return rotate(b)
print(inverse([[2,-1,0],[1,0,-1],[1,0,1]]))

def partial_pivoting(a, b):

    l = len(a)

    for step in range(l):

        max = abs(a[step][step])

        q = step


        for i in range(q, l):

            if abs(max) < abs(a[i][q]):

                q = i

                max = a[i][q]


        if max == 0:

            return None


        a[step], a[q] = a[q], a[step]

        b[step], b[q] = b[q], b[step]


        for i in range(step + 1, l):

            width = len(a[0])

            ratio = a[i][step] / a[step][step]

            for w in range(step, width):

                a[i][w] -= ratio * a[step][w]


            b[i] -= ratio * b[step]

    return a, b        

  

def gauss_jordan_elimination(a, b):

    a, b = partial_pivoting(a, b)

    if a == None:

        return None

    for i in range(len(a)):

        if a[i][i]==0:

            return None

        for j in range(i+1,len(a[0])):

            for k in range(j,len(a)):

                a[i][k]-=a[i][j]/a[j][j]*a[j][k]

                b[i]-=a[i][j]/a[j][j]*b[j]

        b[i]/=a[i][i]         

    return b

    

def rotate(M):

    h=len(M)

    w=len(M[0])

    L= [ [None] * h for i in range(w)]

    for i in range(h):

        for j in range(w):

            L[j][i]=M[i][j]

    return L            

        

        


def inverse(a):

    b=[[None]*len(a) for i in range(len(a))]

    for i in range(len(a)):

        if a[i][i]==0:

            return None

        L=a

        result=[0]*len(a)

        result[i]=1

        b[i]= gauss_jordan_elimination(L,result)

    return rotate(b)

   

print(inverse([[2,-1,0],[1,0,-1],[1,0,1]]))

가우스 조르단 소거법으로 역행렬구하려는데 왜 안되는거지