Foros del Web » Programando para Internet » Javascript »

ayud con Matriz inversa con JS

Estas en el tema de ayud con Matriz inversa con JS en el foro de Javascript en Foros del Web. Estoy haciendo un programa que me cifre un mensaje. primero lo mete en una matriz y fuerzo a la matriz a que sea cuadrada, por ...
  #1 (permalink)  
Antiguo 06/10/2015, 19:03
Avatar de Alexhg42  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 2 meses
Puntos: 2
Pregunta ayud con Matriz inversa con JS

Estoy haciendo un programa que me cifre un mensaje. primero lo mete en una matriz y fuerzo a la matriz a que sea cuadrada, por ejemplo si el mensaje es "ABC" (3 letras) el programa lo mete en una matriz 2x2 de forma "A", "B", "C", " ". Luego traduce cada caracter a codigo ASCII (le resto 31 para que no sea tan grande el determinante y para que el espacio (que su codigo es 32) sea 1).

Mi problema es cuando conviero trato de sacar la inversa de mi matriz para encriptarlo.


ACTUALIZACION: Este es el mismo programa que puse abajo: [URL]http://jsfiddle.net/Alexhg42/7fnb1wst/[/URL]
Les paso mi codigo JS de con nombre "app.js":
Código Javascript:
Ver original
  1. function mensajeMatriz(mensaje){
  2.     var n = Math.ceil(Math.sqrt(mensaje.length));
  3.     function llenarMatriz(mensaje){
  4.         var matriz = nuevaMatriz(n);
  5.         var c = 0;
  6.         for(var i=0; i<n; i++){
  7.             for(var j=0; j<n; j++){
  8.                 if(mensaje[c]) matriz[i][j] = mensaje[c];
  9.                 else matriz[i][j] = " ";
  10.                 c++;
  11.             }
  12.         }
  13.         return matriz;
  14.     }
  15.     var matriz = llenarMatriz(mensaje);
  16.     return matriz;
  17. }
  18.  
  19. function toAscii(caracter){
  20.     var numero = caracter.charCodeAt(0)-31;
  21.     return numero;
  22. }
  23.  
  24. function fromAscii(numero){
  25.     var caracter = String.fromCharCode(numero+31);
  26.     return caracter;
  27. }
  28.  
  29. function toAsciiMatriz(msjMatriz){
  30.     var asciiMatriz = nuevaMatriz(msjMatriz.length);
  31.     for(var i=0; i<msjMatriz.length; i++){
  32.         for(var j=0; j<msjMatriz[0].length; j++){
  33.             asciiMatriz[i][j] = toAscii(msjMatriz[i][j]);
  34.         }
  35.     }
  36.     return asciiMatriz;
  37. }
  38.  
  39. function fromAsciiMatriz(asciiMatriz){
  40.     var msjMatriz = nuevaMatriz(asciiMatriz.length);
  41.     for(var i=0; i<asciiMatriz.length; i++){
  42.         for(var j=0; j<asciiMatriz[0].length; j++){
  43.             msjMatriz[i][j] = fromAscii(asciiMatriz[i][j]);
  44.         }
  45.     }
  46.     return msjMatriz;
  47. }
  48.  
  49.  
  50.  
  51. function nuevaMatriz(n){
  52.     var matriz = new Array(n);
  53.     for(var a=0; a<n; a++) matriz[a] = new Array(n);
  54.     return matriz;
  55. }
  56.  
  57. //Matriz
  58. function matrizTranspuesta(matriz){
  59.     var nuevam = nuevaMatriz(matriz.length);
  60.     for(var i=0; i<matriz.length; i++){
  61.         for(var j=0; j<matriz.length; j++){
  62.             nuevam[i][j]=matriz[j][i];
  63.         }
  64.     }
  65.     return nuevam;
  66. }
  67.  
  68. //En estas tres funciones se encuentra el error
  69. function matrizAdjunta(matriz){
  70.     return matrizTranspuesta(matrizCofactores(matriz));
  71. }
  72.  
  73. function matrizCofactores(matriz){
  74.     var nm = nuevaMatriz(matriz.length);
  75.     for(var i=0; i<matriz.length; i++){
  76.         for(var j=0; j<matriz.length; j++){
  77.             var det = nuevaMatriz(matriz.length);
  78.             var detValor;
  79.             for(var k=0; k<matriz.length;k++){
  80.                 if(k!=i){
  81.                     for(var l=0; l<matriz.length;l++){
  82.                         if(l!=j){
  83.                             var index1 = k<i ? k : k-1;
  84.                             var index2 = l<j ? l : l-1;
  85.                             det[index1][index2]=matriz[k][l];
  86.                         }
  87.                     }
  88.                 }
  89.             }
  90.             detValor = determinante(det);
  91.             nm[i][j] = detValor * Math.pow(-1, i+j+2);
  92.         }
  93.     }
  94.     return nm;
  95. }
  96. function determinante(matriz){
  97.     var det = 0, aux = 0;
  98.     var c;
  99.     if(matriz.length==2){
  100.         det=(matriz[0][0]*matriz[1][1])-(matriz[1][0]*matriz[0][1]);
  101.         return det;
  102.     }else{
  103.         for(var j=0; j<matriz.length; j++){
  104.             var menor = nuevaMatriz(matriz.length-1);
  105.             for(var h=0; h<(matriz.length-1);h++){
  106.                 menor[h] = nuevaMatriz(matriz.length-1);
  107.             }
  108.             for(var k=1; k<matriz.length; k++){
  109.                 c=0;
  110.                 for(var l=0; l<matriz.length; l++){
  111.                     if(l!=j){
  112.                         menor[k-1][c] = matriz[k][l];
  113.                         c++;
  114.                     }
  115.                 }
  116.             }
  117.             aux = Math.pow(-1,2+j)*matriz[0][j]*determinante(menor);
  118.             det += aux;
  119.         }
  120.         return det;
  121.     }
  122. }
  123.  
  124. function matrizInversa(matriz){
  125.     var det =1/determinante(matriz);
  126.     var nmatriz=matrizAdjunta(matriz);
  127.     multiplicarMatriz(det,nmatriz);
  128.     return matriz;
  129. }
  130.  
  131. function multiplicarMatriz(n, matriz){
  132.     for(var i=0;i<matriz.length;j++){
  133.         for (var j=0; j<matriz.length; j++) {
  134.             matriz[i][j]*=n;
  135.         }
  136.     }
  137. }
  138.  
  139. (function(undefined){
  140.     var matrizi = [[],[]];
  141.     var matriz = mensajeMatriz(prompt("Ingrese mensaje secreto"));
  142.     var matriz2 = toAsciiMatriz(matriz);
  143.     var matriz3 = fromAsciiMatriz(matriz2);
  144.  
  145.     var matrizTras = matrizTranspuesta(matriz2);
  146.     var matrizAdj = matrizAdjunta(matrizTras);
  147.     var string = string2 = string3 = stringTras = stringAdj = " ";
  148.     //Mensaje a matriz
  149.     for(var i =0; i<matriz.length; i++) string+=matriz[i]+"<br>";
  150.  
  151.     //Matriz cifrada en Ascii
  152.     for(var i =0; i<matriz2.length; i++) string2+=matriz2[i]+"<br>";
  153.  
  154.     //Traspuesta de la Matriz cifrada en Ascii
  155.     for(var i =0; i<matrizTras.length; i++) stringTras+=matrizTras[i]+"<br>";
  156.  
  157.     //Adjunta de la Matriz cifrada en Ascii
  158.     for(var i =0; i<matrizAdj.length; i++) stringAdj+=matrizAdj[i]+"<br>";
  159.  
  160.     //Matriz descifrada
  161.     for(var i =0; i<matriz3.length; i++) string3+=matriz3[i]+"<br>";
  162.    
  163.     //Matriz a mensaje
  164.     var mensaje = "";
  165.     for(var i = 0; i<matriz3.length; i++)
  166.         for(var j = 0; j<matriz3[0].length; j++)
  167.             mensaje += matriz3[i][j];
  168.  
  169.     alert(determinante(matriz2));
  170.  
  171.     document.getElementById("matriz").innerHTML = "<div><h4>Mensaje matrizado</h4>"+string+"</div><br>";
  172.     document.getElementById("matriz").innerHTML += "<div><h4>Matriz cifrada</h4>"+string2+"</div><br>";
  173.     document.getElementById("matriz").innerHTML += "<div><h4>Traspuesta de la Matriz cifrada</h4>"+stringTras+"</div><br>";
  174.     document.getElementById("matriz").innerHTML += "<div><h4>Adjunta de la Matriz cifrada</h4>"+stringAdj+"</div><br>";
  175.     document.getElementById('matriz').innerHTML += "<div><h4>Matriz descifrada</h4>"+string3+"</div><br>";
  176.     document.getElementById("matriz").innerHTML += "<br><div>Mensaje desencriptado: '"+mensaje+"'</div><br>"
  177.  
  178. })();
y el HTML (solo para imprimir los mensajes)
Código HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="matriz">
    </div>
</body>
    <script src="app.js"></script>
</html> 
viendo lo que imprime en el html, creo que el problema esta en estas funciones:
Código Javascript:
Ver original
  1. function matrizAdjunta(matriz){
  2.     return matrizTranspuesta(matrizCofactores(matriz));
  3. }
  4.  
  5. function matrizCofactores(matriz){
  6.     var nm = nuevaMatriz(matriz.length);
  7.     for(var i=0; i<matriz.length; i++){
  8.         for(var j=0; j<matriz.length; j++){
  9.             var det = nuevaMatriz(matriz.length);
  10.             var detValor;
  11.             for(var k=0; k<matriz.length;k++){
  12.                 if(k!=i){
  13.                     for(var l=0; l<matriz.length;l++){
  14.                         if(l!=j){
  15.                             var index1 = k<i ? k : k-1;
  16.                             var index2 = l<j ? l : l-1;
  17.                             det[index1][index2]=matriz[k][l];
  18.                         }
  19.                     }
  20.                 }
  21.             }
  22.             detValor = determinante(det);
  23.             nm[i][j] = detValor * Math.pow(-1, i+j+2);
  24.         }
  25.     }
  26.     return nm;
  27. }
  28. function determinante(matriz){
  29.     var det = 0, aux = 0;
  30.     var c;
  31.     if(matriz.length==2){
  32.         det=(matriz[0][0]*matriz[1][1])-(matriz[1][0]*matriz[0][1]);
  33.         return det;
  34.     }else{
  35.         for(var j=0; j<matriz.length; j++){
  36.             var menor = nuevaMatriz(matriz.length-1);
  37.             for(var h=0; h<(matriz.length-1);h++){
  38.                 menor[h] = nuevaMatriz(matriz.length-1);
  39.             }
  40.             for(var k=1; k<matriz.length; k++){
  41.                 c=0;
  42.                 for(var l=0; l<matriz.length; l++){
  43.                     if(l!=j){
  44.                         menor[k-1][c] = matriz[k][l];
  45.                         c++;
  46.                     }
  47.                 }
  48.             }
  49.             aux = Math.pow(-1,2+j)*matriz[0][j]*determinante(menor);
  50.             det += aux;
  51.         }
  52.         return det;
  53.     }
  54. }
Que creen que pueda estar mal en ellas, llevo rato tratando de encontrar el error pero no 'nomas' no Saludos!

Última edición por Alexhg42; 06/10/2015 a las 21:53 Razón: Agregar un link

Etiquetas: codificacion, encriptacion, inversa, matrices, matriz
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:10.