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:
y el HTML (solo para imprimir los mensajes)Ver original
function mensajeMatriz(mensaje){ var n = Math.ceil(Math.sqrt(mensaje.length)); function llenarMatriz(mensaje){ var matriz = nuevaMatriz(n); var c = 0; for(var i=0; i<n; i++){ for(var j=0; j<n; j++){ if(mensaje[c]) matriz[i][j] = mensaje[c]; else matriz[i][j] = " "; c++; } } return matriz; } var matriz = llenarMatriz(mensaje); return matriz; } function toAscii(caracter){ var numero = caracter.charCodeAt(0)-31; return numero; } function fromAscii(numero){ var caracter = String.fromCharCode(numero+31); return caracter; } function toAsciiMatriz(msjMatriz){ var asciiMatriz = nuevaMatriz(msjMatriz.length); for(var i=0; i<msjMatriz.length; i++){ for(var j=0; j<msjMatriz[0].length; j++){ asciiMatriz[i][j] = toAscii(msjMatriz[i][j]); } } return asciiMatriz; } function fromAsciiMatriz(asciiMatriz){ var msjMatriz = nuevaMatriz(asciiMatriz.length); for(var i=0; i<asciiMatriz.length; i++){ for(var j=0; j<asciiMatriz[0].length; j++){ msjMatriz[i][j] = fromAscii(asciiMatriz[i][j]); } } return msjMatriz; } function nuevaMatriz(n){ var matriz = new Array(n); for(var a=0; a<n; a++) matriz[a] = new Array(n); return matriz; } //Matriz function matrizTranspuesta(matriz){ var nuevam = nuevaMatriz(matriz.length); for(var i=0; i<matriz.length; i++){ for(var j=0; j<matriz.length; j++){ nuevam[i][j]=matriz[j][i]; } } return nuevam; } //En estas tres funciones se encuentra el error function matrizAdjunta(matriz){ return matrizTranspuesta(matrizCofactores(matriz)); } function matrizCofactores(matriz){ var nm = nuevaMatriz(matriz.length); for(var i=0; i<matriz.length; i++){ for(var j=0; j<matriz.length; j++){ var det = nuevaMatriz(matriz.length); var detValor; for(var k=0; k<matriz.length;k++){ if(k!=i){ for(var l=0; l<matriz.length;l++){ if(l!=j){ var index1 = k<i ? k : k-1; var index2 = l<j ? l : l-1; det[index1][index2]=matriz[k][l]; } } } } detValor = determinante(det); nm[i][j] = detValor * Math.pow(-1, i+j+2); } } return nm; } function determinante(matriz){ var det = 0, aux = 0; var c; if(matriz.length==2){ det=(matriz[0][0]*matriz[1][1])-(matriz[1][0]*matriz[0][1]); return det; }else{ for(var j=0; j<matriz.length; j++){ var menor = nuevaMatriz(matriz.length-1); for(var h=0; h<(matriz.length-1);h++){ menor[h] = nuevaMatriz(matriz.length-1); } for(var k=1; k<matriz.length; k++){ c=0; for(var l=0; l<matriz.length; l++){ if(l!=j){ menor[k-1][c] = matriz[k][l]; c++; } } } aux = Math.pow(-1,2+j)*matriz[0][j]*determinante(menor); det += aux; } return det; } } function matrizInversa(matriz){ var det =1/determinante(matriz); var nmatriz=matrizAdjunta(matriz); multiplicarMatriz(det,nmatriz); return matriz; } function multiplicarMatriz(n, matriz){ for(var i=0;i<matriz.length;j++){ for (var j=0; j<matriz.length; j++) { matriz[i][j]*=n; } } } (function(undefined){ var matrizi = [[],[]]; var matriz = mensajeMatriz(prompt("Ingrese mensaje secreto")); var matriz2 = toAsciiMatriz(matriz); var matriz3 = fromAsciiMatriz(matriz2); var matrizTras = matrizTranspuesta(matriz2); var matrizAdj = matrizAdjunta(matrizTras); var string = string2 = string3 = stringTras = stringAdj = " "; //Mensaje a matriz for(var i =0; i<matriz.length; i++) string+=matriz[i]+"<br>"; //Matriz cifrada en Ascii for(var i =0; i<matriz2.length; i++) string2+=matriz2[i]+"<br>"; //Traspuesta de la Matriz cifrada en Ascii for(var i =0; i<matrizTras.length; i++) stringTras+=matrizTras[i]+"<br>"; //Adjunta de la Matriz cifrada en Ascii for(var i =0; i<matrizAdj.length; i++) stringAdj+=matrizAdj[i]+"<br>"; //Matriz descifrada for(var i =0; i<matriz3.length; i++) string3+=matriz3[i]+"<br>"; //Matriz a mensaje var mensaje = ""; for(var i = 0; i<matriz3.length; i++) for(var j = 0; j<matriz3[0].length; j++) mensaje += matriz3[i][j]; alert(determinante(matriz2)); document.getElementById("matriz").innerHTML = "<div><h4>Mensaje matrizado</h4>"+string+"</div><br>"; document.getElementById("matriz").innerHTML += "<div><h4>Matriz cifrada</h4>"+string2+"</div><br>"; document.getElementById("matriz").innerHTML += "<div><h4>Traspuesta de la Matriz cifrada</h4>"+stringTras+"</div><br>"; document.getElementById("matriz").innerHTML += "<div><h4>Adjunta de la Matriz cifrada</h4>"+stringAdj+"</div><br>"; document.getElementById('matriz').innerHTML += "<div><h4>Matriz descifrada</h4>"+string3+"</div><br>"; document.getElementById("matriz").innerHTML += "<br><div>Mensaje desencriptado: '"+mensaje+"'</div><br>" })();
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>
Código Javascript:
Que creen que pueda estar mal en ellas, llevo rato tratando de encontrar el error pero no 'nomas' no Saludos! Ver original
function matrizAdjunta(matriz){ return matrizTranspuesta(matrizCofactores(matriz)); } function matrizCofactores(matriz){ var nm = nuevaMatriz(matriz.length); for(var i=0; i<matriz.length; i++){ for(var j=0; j<matriz.length; j++){ var det = nuevaMatriz(matriz.length); var detValor; for(var k=0; k<matriz.length;k++){ if(k!=i){ for(var l=0; l<matriz.length;l++){ if(l!=j){ var index1 = k<i ? k : k-1; var index2 = l<j ? l : l-1; det[index1][index2]=matriz[k][l]; } } } } detValor = determinante(det); nm[i][j] = detValor * Math.pow(-1, i+j+2); } } return nm; } function determinante(matriz){ var det = 0, aux = 0; var c; if(matriz.length==2){ det=(matriz[0][0]*matriz[1][1])-(matriz[1][0]*matriz[0][1]); return det; }else{ for(var j=0; j<matriz.length; j++){ var menor = nuevaMatriz(matriz.length-1); for(var h=0; h<(matriz.length-1);h++){ menor[h] = nuevaMatriz(matriz.length-1); } for(var k=1; k<matriz.length; k++){ c=0; for(var l=0; l<matriz.length; l++){ if(l!=j){ menor[k-1][c] = matriz[k][l]; c++; } } } aux = Math.pow(-1,2+j)*matriz[0][j]*determinante(menor); det += aux; } return det; } }