3935 - determinanta: Difference between revisions

From Bitnami MediaWiki
No edit summary
Line 44: Line 44:
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">


def citeste_matrice_din_fisier(file_path):
def citeste_matrice(file_name):
     with open(file_path, 'r') as file:
     with open(file_name, 'r') as file:
         n = int(file.readline())
         n = int(file.readline())
         matrice = np.zeros((n, n), dtype=int)
         matrice = [[0] * n for _ in range(n)]
         for _ in range(n):
         for _ in range(n):
             l, c = map(int, file.readline().split())
             l, c = map(int, file.readline().split())
             matrice[l-1][c-1] = 1
             matrice[l - 1][c - 1] = 1
    return matrice
        return matrice, n


def calculeaza_determinant(matrice):
def calculeaza_determinant(matrice, dimensiune):
     return int(round(np.linalg.det(matrice)))
     if dimensiune == 1:
        return matrice[0][0]


def scrie_determinant_in_fisier(file_path, determinant):
    determinant = 0
     with open(file_path, 'w') as file:
     for i in range(dimensiune):
         file.write(str(determinant) + '\n')
         sub_matrice = [rand[:i] + rand[i + 1:] for rand in matrice[1:]]
        semn = (-1) ** i
        determinant += semn * matrice[0][i] * calculeaza_determinant(sub_matrice, dimensiune - 1)


def main():
     return determinant
     # Citeste matricea din fisier
    matrice = citeste_matrice_din_fisier('determinantain.txt')


    # Calculeaza determinantul
def scrie_rezultat(file_name, rezultat):
     determinant = calculeaza_determinant(matrice)
     with open(file_name, 'w') as file:
 
        file.write(str(rezultat) + '\n')
    # Scrie determinantul in fisier
    scrie_determinant_in_fisier('determinantaout.txt', determinant)


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     input_file = "determinantain.txt"
import numpy as np
    output_file = "determinantaout.txt"
 
def citeste_matrice_din_fisier(file_path):
    with open(file_path, 'r') as file:
        n = int(file.readline())
        matrice = np.zeros((n, n), dtype=int)
        for _ in range(n):
            l, c = map(int, file.readline().split())
            matrice[l-1][c-1] = 1
    return matrice
 
def calculeaza_determinant(matrice):
    return int(round(np.linalg.det(matrice)))


def scrie_determinant_in_fisier(file_path, determinant):
    matrice, dimensiune = citeste_matrice(input_file)
     with open(file_path, 'w') as file:
     rezultat_determinant = calculeaza_determinant(matrice, dimensiune)
        file.write(str(determinant) + '\n')
    scrie_rezultat(output_file, rezultat_determinant)


def main():
    # Citeste matricea din fisier
    matrice = citeste_matrice_din_fisier('determinantain.txt')
    # Calculeaza determinantul
    determinant = calculeaza_determinant(matrice)
    # Scrie determinantul in fisier
    scrie_determinant_in_fisier('determinantaout.txt', determinant)
if __name__ == "__main__":
    main()
</syntaxhighlight>
</syntaxhighlight>

Revision as of 08:02, 27 December 2023

Cerinta

Se consideră o matrice cu n linii şi n coloane şi elemente egale cu 0 sau 1. Să se calculeze determinantul matricei.

Date de intrare

Fișierul de intrare determinantain.txt conține pe prima linie numărul n, iar pe următoarele n linii câte o pereche de numere naturale l, c, reprezentând faptul că elementul matricei de pe linia l şi coloana c are valoarea 1.

Date de iesire

Fișierul de ieșire determinantaout.txt va conține pe prima linie valoarea determinantului matricei.

Restrictii si precizari

  • 2 ⩽ n ⩽ 100.000
  • 1 ⩽ l,c ⩽ n
  • Exceptând elementele din poziţiile (l,c), care sunt egale cu 1, celelalte elemente ale matricei au valoarea 0.

Exemplul 1

Intrare
determinantain.txt
3
1 1
2 2
3 3
Iesire
Datele introduse corespund restrictiilor impuse.
determinantaout.txt
1

Exemplul 2

Intrare
determinantain.txt
3
2 2
3 3
2 2
Iesire
Datele introduse nu corespund restrictiilor impuse
determinantaout.txt

Rezolvare

<syntaxhighlight lang="python3" line="1">

def citeste_matrice(file_name):

   with open(file_name, 'r') as file:
       n = int(file.readline())
       matrice = [[0] * n for _ in range(n)]
       for _ in range(n):
           l, c = map(int, file.readline().split())
           matrice[l - 1][c - 1] = 1
       return matrice, n

def calculeaza_determinant(matrice, dimensiune):

   if dimensiune == 1:
       return matrice[0][0]
   determinant = 0
   for i in range(dimensiune):
       sub_matrice = [rand[:i] + rand[i + 1:] for rand in matrice[1:]]
       semn = (-1) ** i
       determinant += semn * matrice[0][i] * calculeaza_determinant(sub_matrice, dimensiune - 1)
   return determinant

def scrie_rezultat(file_name, rezultat):

   with open(file_name, 'w') as file:
       file.write(str(rezultat) + '\n')

if __name__ == "__main__":

   input_file = "determinantain.txt"
   output_file = "determinantaout.txt"
   matrice, dimensiune = citeste_matrice(input_file)
   rezultat_determinant = calculeaza_determinant(matrice, dimensiune)
   scrie_rezultat(output_file, rezultat_determinant)

</syntaxhighlight>