Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/10/2015, 19:03
Avatar de Alexhg42
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