def classify_state(ar):
r= len(ar)
ab = []
nab = []
for i in range(r):
_sum = sum(ar[i])
if _sum != 0:
nab.append(i)
else:
ab.append(i)
return ab, nab
#create R & Q
def create_RQ(ar, ab, nab):
n= len(ab)
m= len(nab)
_RQ= []
for i in range(m):
_sum = float(sum(ar[nab[i]]))
temp= []
for j in range(n):
temp.append(ar[ nab[i]][ab[j] ] /_sum)
for j in range(m):
temp.append(ar[ nab[i]][nab[j] ] /_sum)
_RQ.append(temp)
del temp
R = []
Q = []
for i in range(len(_RQ)):
R.append(_RQ[i][:n])
Q.append(_RQ[i][n:])
del _RQ
return R, Q
#Creates an identity matrix
def create_In(n):
In = []
for i in range(n):
temp= [0]*n
temp[i]= 1
In.append(temp)
return In
#Performs matrix-inversion
def invert(M):
n = len(M)
inv = create_In(n)
for i in range(n):
x = M[i][i]
for k in range(n):
M[i][k] = M[i][k] / x
inv[i][k] = inv[i][k] / x
for j in range(n):
if j == i:
continue
x = M[j][i]
for k in range(n):
inv[j][k] = round(inv[j][k] - x*inv[i][k], 5)
M[j][k] = M[j][k] - x*M[i][k]
return inv
#Creates the FUndamental matrix
def create_F(Q):
m = len(Q)
In= create_In(m)
for i in range(m):
for j in range(m):
In[i][j] = In[i][j] - Q[i][j]
return invert(In)
#F == F[0, :]
def matrix_multiply(F, R):
n= len(R[0])
m= len(F)
probs = []
for i in range(n):
_sum = 0
for j in range(m):
_sum += F[j] * R[j][i]
probs.append(_sum)
return probs
#Converts decimal to fractions
def decimal_2_fraction(probs):
from fractions import Fraction
fractions= []
for i in probs:
f= Fraction(i).limit_denominator(max_denominator= 100)
fractions.append((f.numerator, f.denominator))
return fractions
def compute_lcm(x, y):
# choose the greater number
if x > y:
greater = x
else:
greater = y
while(true):
if((greater % x == 0) and (greater % y == 0)):
lcm = greater
break
greater += 1
return lcm
def final_answer(fracs):
n = len(fracs)
lcm= fracs[0][1]
for i in range(1, n):
lcm= compute_lcm(lcm, fracs[i][1])
answer = []
for i in range(n):
mul= int(lcm/fracs[i][1])
answer.append( fracs[i][0]*mul )
answer.append(lcm)
return answer
def solution(ip):
ab, nab = classify_state(ip)
R, Q = create_RQ(ip, ab, nab)
print(R)
print(Q)
F= create_F(Q)
probs= matrix_multiply(F[0], R)
fracs= decimal_2_fraction(probs)
ans= final_answer(fracs)
return ans
ip= [[0, 1, 0, 0, 0, 1], [4, 0, 0, 3, 2, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
sol= [0, 3, 2, 9, 14]
ans= solution(ip)
print(ans)