Determinante de la array N x N utilizando subprocesos múltiples

Dada una array de N x N, la tarea es encontrar el determinante de la array utilizando subprocesos múltiples.

Ejemplos:  

Input : mat = {{0, 4, 0, -3},
               {1, 1, 5, 2},
               {1, -2, 0, 6},
               { 3, 0, 0, 1}}
Output : -250

Input :  mat = {{1, 0, 2, -1},
                {3, 0, 0, 5},
                {2, 1, 4, -3},
                {1, 0, 5, 0}}
Output: 30

Enfoque: 
Se sabe que encontrar el determinante de una array puede ser muy costoso por la cantidad de tiempo que lleva. Por lo tanto, calcular cosas en paralelo puede conducir a un programa comparativamente menos costoso. Un código se puede paralelizar usando subprocesos, que es un proceso liviano y divide un programa de flujo único en programas con múltiples flujos. En cuanto a encontrar el determinante de una array, primero encuentre el determinante de las subarrays de la array, distribuya la tarea de encontrar el determinante de las subarrays a los subprocesos, y estos subprocesos se ejecutarán en paralelo, lo que resultará en menos tiempo de ejecución que el método secuencial.

Nota: El código es específico de Linux. 

C++

// CPP program for finding determinant matrix
// with parallelizing the code
#include <iostream>
#include <vector>
#include <pthread.h>
#define size 4
 
using namespace std;
 
// matrix whose's determinant is required
int mat[][size] = { { 0, 4, 0, -3 },
                    { 1, 1, 5, 2 },
                    { 1, -2, 0, 6 },
                    { 3, 0, 0, 1 } };
int det[size];
 
// declaring variable for storing thread id
pthread_t thread[size];
 
// function for finding determinant
int determinant(vector<vector<int> > mat2, int s)
{
 
    if (s == 2) {
         
        // if size of matrix is 2X2
        // then returning the determinant
        return mat2[0][0] * mat2[1][1] -
               mat2[0][1] * mat2[1][0];
    }
    else {
         
        // else dividing the matrix in smaller part.
        vector<vector<int> > mat1(s - 1),
                      mat3(s - 1), mat4(s - 1);
        int k, l, m, i, j;
         
        for (i = 0; i < s - 1; i++) {
            mat1[i] = vector<int>(s - 1);
            mat3[i] = vector<int>(s - 1);
            mat4[i] = vector<int>(s - 1);
        }
         
        for (i = 1; i < s; i++) {
            k = 0;
            l = 0;
            m = 0;
            for (j = 0; j < s; j++) {
                if (j != 0) {
                    mat1[i - 1][k] = mat2[i][j];
                    k++;
                }
                if (j != 1) {
                    mat3[i - 1][l] = mat2[i][j];
                    l++;
                }
                if (j != 2) {
                    mat4[i - 1][m] = mat2[i][j];
                    m++;
                }
            }
        }
 
        return mat2[0][0] * determinant(mat1, s - 1) -
               mat2[0][1] * determinant(mat3, s - 1) +
               mat2[0][2] * determinant(mat4, s - 1);
    }
}
 
// function for finding determinant using first row
// with each element of row a thread is associated.
void* createTd(void* arg)
{
    int *ar = (int *)arg, i, j, k;
    vector<vector<int> > mat2(size - 1);
 
    for (i = 0; i < size - 1; i++)
        mat2[i] = vector<int>(size - 1);
         
    // extracting the matrix smaller by size one.
    // for finding the determinant.
    for (i = 1; i < size; i++) {
        k = 0;
        for (j = 0; j < size; j++) {
            if (j != (*ar)) {
                mat2[i - 1][k] = mat[i][j];
                k++;
            }
        }
    }
     
    // calling determinant function
    det[*ar] = det[*ar] * determinant(mat2, size - 1);
}
 
// driver function
int main()
{
    int i, j, detfin = 0;
    int p[size];
     
    // storing the first row in a array
    // for later multiplying with the determinant
    // of smaller matrix
    for (i = 0; i < size; i++)
        det[i] = mat[0][i];
         
    // creating thread
    for (i = 0; i < size; i++) {
        p[i] = i;
        pthread_create(&thread[i], NULL, &createTd, (void*)&p[i]);
    }
     
    // waiting for all the threads to join
    pthread_join(thread[0], NULL);
    pthread_join(thread[1], NULL);
    pthread_join(thread[2], NULL);
    pthread_join(thread[3], NULL);
    for (i = 0; i < size; i++) {
        if (i % 2 == 0)
            detfin += det[i];
        else
            detfin -= det[i];
    }
     
    cout << detfin << endl;
     
    return 0;
}

Producción:  

Publicación traducida automáticamente

Artículo escrito por UPENDRA BARTWAL, y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *