Advertisement
pyuser

Untitled

Feb 22nd, 2012
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.42 KB | None | 0 0
  1. from functools import reduce
  2. from operator import mul, sub
  3. ################################################################################
  4.  
  5. def get_matrix(fname):
  6.     with open(fname, "r") as f:
  7.         return [tuple(map(float, l.split())) for l in f]
  8.  
  9. def column(row):
  10.     i = 0
  11.     n = len(row)
  12.     while not row[i] and i < n:
  13.         i += 1
  14.     return i if i < n else -1
  15.  
  16. def sign(indexes):
  17.     n = len(indexes)
  18.     s = sum((0, 1)[x < y] for k, y in enumerate(indexes) for x in indexes[k+1:])
  19.     return ((s + 1) % 2 - s % 2)
  20.  
  21. def det(matrix):
  22.     M = matrix[:]
  23.     n = len(M)
  24.  
  25.     indexes = [0 for _ in range(n)]
  26.  
  27.     for i in range(n):
  28.         k = column(M[i])
  29.         for j in (x for x in range(n) if x != i):
  30.             M[j] = tuple(map(sub, M[j], map(mul, M[i], [M[j][k] / M[i][k]] * n)))
  31.         indexes[i] = k
  32.  
  33.     return reduce(mul, (M[i][indexes[i]] for i in range(n)), 1) * sign(indexes)
  34.  
  35. def kramer(les):
  36.     n   = len(les)
  37.     tmp = list(zip(*les))
  38.     b   = tmp[-1]
  39.     del tmp[-1]
  40.  
  41.     delta = det(tmp)
  42.     if not delta:
  43.         raise RuntimeError("Решения нет")
  44.  
  45.     result = []
  46.     for i in range(n):
  47.         a = tmp[:]
  48.         a[i] = b
  49.         result.append(det(a) / delta)
  50.     return result
  51. ################################################################################
  52.  
  53. if "__main__" == __name__:
  54.     kramer(get_matrix("input.txt"))
  55. ################################## End Of File #################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement