3935 - determinanta: Diferență între versiuni

De la Universitas MediaWiki
 
(Nu s-au afișat 10 versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
== Cerinta ==
== Cerinta ==


Se consideră o matrice cu '''n''' linii şi  '''n''' coloane şi elemente egale cu 0 sau 1. Să se calculeze determinantul matricei.
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 ==
== 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.
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 ==
== Date de iesire ==


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


== Restrictii si precizari ==
== Restrictii si precizari ==


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


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;determinantain.txt
;determinantain.txt
: 3
: 3
Linia 24: Linia 23:
: 2 2
: 2 2
: 3 3
: 3 3
;Iesire
: Datele introduse corespund restrictiilor impuse.
: Datele introduse corespund restrictiilor impuse.
; determinantaout.txt
; determinantaout.txt
Linia 30: Linia 28:


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;determinantain.txt
;determinanta.txt
: 3
: 3
: 2 2
: 2 2
: 3 3
: 3 3
: 2 2
: 2 2
;Iesire
 
:Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse
;determinanta.txt


== Rezolvare ==
== Rezolvare ==
Linia 45: Linia 40:
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">


def citeste_matrice_din_fisier(file_path):
def este_intrare_valida(n, pozitii):
     with open(file_path, 'r') as file:
     # Verificăm dacă toate pozițiile sunt în limitele matricei
         n = int(file.readline())
    for linie, coloana in pozitii:
        matrice = np.zeros((n, n), dtype=int)
         if not (1 <= linie <= n and 1 <= coloana <= n):
        for _ in range(n):
             return False
             l, c = map(int, file.readline().split())
     return True
            matrice[l-1][c-1] = 1
     return matrice


def calculeaza_determinant(matrice):
def citeste_intrare(numefisier):
     return int(round(np.linalg.det(matrice)))
     with open(numefisier, 'r') as fisier:
        n = int(fisier.readline())
        pozitii = [tuple(map(int, fisier.readline().split())) for _ in range(n)]


def scrie_determinant_in_fisier(file_path, determinant):
    if este_intrare_valida(n, pozitii):
    with open(file_path, 'w') as file:
        matrice = [[0] * n for _ in range(n)]
         file.write(str(determinant) + '\n')
        for linie, coloana in pozitii:
            matrice[linie - 1][coloana - 1] = 1
        return matrice, n
    else:
         raise ValueError("Date de intrare nevalide")


def main():
def scrie_iesire(numefisier, rezultat):
     # Citeste matricea din fisier
     with open(numefisier, 'w') as fisier:
    matrice = citeste_matrice_din_fisier('determinantain.txt')
        fisier.write(str(rezultat) + '\n')


     # Calculeaza determinantul
def calculeaza_determinant(matrice, dimensiune):
     determinant = calculeaza_determinant(matrice)
     # Cazul de bază: matrice de dimensiune 2x2
     if dimensiune == 2:
        return matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0]


     # Scrie determinantul in fisier
     determinant = 0
    scrie_determinant_in_fisier('determinantaout.txt', determinant)
    for i in range(dimensiune):
        # Eliminăm linia și coloana corespunzătoare elementului selectat
        submatrice = [linie[:i] + linie[i+1:] for linie in matrice[1:]]
        semn = (-1) ** i
        determinant += semn * matrice[0][i] * calculeaza_determinant(submatrice, dimensiune - 1)
 
    return determinant


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     fisier_intrare = "determinantain.txt"
import numpy as np
    fisier_iesire = "determinantaout.txt"


def citeste_matrice_din_fisier(file_path):
     try:
     with open(file_path, 'r') as file:
         # Citim matricea și dimensiunea din fișierul de intrare
         n = int(file.readline())
         matrice, dimensiune = citeste_intrare(fisier_intrare)
         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):
        # Calculăm determinantul
    return int(round(np.linalg.det(matrice)))
        rezultat_determinant = calculeaza_determinant(matrice, dimensiune)


def scrie_determinant_in_fisier(file_path, determinant):
        # Scriem rezultatul în fișierul de ieșire
     with open(file_path, 'w') as file:
        scrie_iesire(fisier_iesire, rezultat_determinant)
         file.write(str(determinant) + '\n')
     except ValueError as e:
         print(f"Eroare: {e}")


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>

Versiunea curentă din 29 decembrie 2023 11:18

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

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

Exemplul 2

determinantain.txt
3
2 2
3 3
2 2
Datele introduse nu corespund restrictiilor impuse

Rezolvare

def este_intrare_valida(n, pozitii):
    # Verificăm dacă toate pozițiile sunt în limitele matricei
    for linie, coloana in pozitii:
        if not (1 <= linie <= n and 1 <= coloana <= n):
            return False
    return True

def citeste_intrare(numefisier):
    with open(numefisier, 'r') as fisier:
        n = int(fisier.readline())
        pozitii = [tuple(map(int, fisier.readline().split())) for _ in range(n)]

    if este_intrare_valida(n, pozitii):
        matrice = [[0] * n for _ in range(n)]
        for linie, coloana in pozitii:
            matrice[linie - 1][coloana - 1] = 1
        return matrice, n
    else:
        raise ValueError("Date de intrare nevalide")

def scrie_iesire(numefisier, rezultat):
    with open(numefisier, 'w') as fisier:
        fisier.write(str(rezultat) + '\n')

def calculeaza_determinant(matrice, dimensiune):
    # Cazul de bază: matrice de dimensiune 2x2
    if dimensiune == 2:
        return matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0]

    determinant = 0
    for i in range(dimensiune):
        # Eliminăm linia și coloana corespunzătoare elementului selectat
        submatrice = [linie[:i] + linie[i+1:] for linie in matrice[1:]]
        semn = (-1) ** i
        determinant += semn * matrice[0][i] * calculeaza_determinant(submatrice, dimensiune - 1)

    return determinant

if __name__ == "__main__":
    fisier_intrare = "determinantain.txt"
    fisier_iesire = "determinantaout.txt"

    try:
        # Citim matricea și dimensiunea din fișierul de intrare
        matrice, dimensiune = citeste_intrare(fisier_intrare)

        # Calculăm determinantul
        rezultat_determinant = calculeaza_determinant(matrice, dimensiune)

        # Scriem rezultatul în fișierul de ieșire
        scrie_iesire(fisier_iesire, rezultat_determinant)
    except ValueError as e:
        print(f"Eroare: {e}")