/*JavaScript Math Functions

Author:  Dylan Faullin, AlgebraHut.com
Date:  February 13, 2010
This code was written by the author and is the property of the author.
It is therefore copyright protected.
Use only with permission from the author.

*/

function gcf (a,b) {

var checkA = parseInt(a);
var checkB = parseInt(b);

if (a != checkA || b != checkB) {

errormess = 'You may only find the GCF of whole numbers.';

return errormess;

}

var n = 1;
var quotA = a;
var quotB = b;
var intCheckA = 1;
var intCheckB = 1;
var answer = 1;

while (quotA >= 1) {

n++;
quotA = a / n;
intCheckA = Math.round(quotA);
	if (quotA == intCheckA) {
		quotB = b / n;
		intCheckB = Math.round(quotB);
		if (quotB == intCheckB) {
			answer = n;
		}
	}
}
return answer;
}

function lcm(a,b) {

var checkA = parseInt(a);
var checkB = parseInt(b);

if (a != checkA || b != checkB) {

errormess = 'You may only find the LCM of whole numbers.';

return errormess;

}

var n = 0;
var answer = a * b;
var quot = (a * b) / b;
var intCheck = a;

while (b > n+1) {

n++;
quot = (a * (b - n) ) / b;
intCheck = Math.round(quot);
	if (quot == intCheck) {
		answer = a * (b - n);
	}
}
return answer;
}


function prime(a) {

var answer = "prime";

var n = Math.floor(Math.sqrt(a));

var quot = 1;

var intCheck = 1;

while (n > 1) {

quot = a / n;

intCheck = Math.round(quot);

	if (quot == intCheck) {

		answer = "not prime";
	}

n = n - 1;
}

return answer;

}

function sqrt(a) {
return Math.sqrt(a);
}

function abs(a) {
return Math.abs(a);
}

function acos(a) {
return Math.acos(a);
}

function asin(a) {
return Math.asin(a);
}

function atan(a) {
return Math.atan(a);
}

function acsc(a) {
var answer = Math.asin(1 / a);
return answer;
}

function asec(a) {
var answer = Math.acos(1 / a);
return answer;
}

function acot(a) {
var answer = Math.atan(1 / a);
return answer;
}

function ceiling(a) {
return Math.ceil(a);
}

function floor(a) {
return Math.floor(a);
}


function cos(a,mode) {
if (mode == "r") {
return Math.cos(a);
} else if (mode == "d") {
var answer = Math.cos((a / 180)* Math.PI);
return answer;
} else {
return Math.cos(a);
}
}

function sin(a,mode) {
if (mode == "r") {

if (a == Math.PI) {

return 0;

}


return Math.sin(a);
} else if (mode == "d") {

if (a == 180) {

return 0;

}

var answer = Math.sin((a / 180) * Math.PI);
return answer;
} else {

if (a == Math.PI) {

return 0;

}
return Math.sin(a);
}
}

function tan(a,mode) {
if (mode == "r") {
return Math.tan(a);
} else if (mode == "d") {
var answer = Math.tan((a / 180) * Math.PI);
return answer;
} else {
return Math.tan(a);
}
}

function csc(a,mode) {
var answer = 1 / Math.sin(a,mode);
return answer;
}

function sec(a,mode) {
var answer = 1 / Math.cos(a,mode);
return answer;
}

function cot(a,mode) {
var answer = 1 / Math.tan(a,mode);
return answer;
}

function sinh(a) {
var answer = (Math.pow(Math.E,a) - Math.pow(Math.E,-a)) / 2;
return answer;
}

function cosh(a) {
var answer = (Math.pow(Math.E,a) + Math.pow(Math.E,-a)) / 2;
return answer;
}

function tanh(a) {
var answer = sinh(a) / cosh(a);
return answer;
}

function sech(a) {
var answer = 1 / cosh(a);
return answer;
}

function csch(a) {
var answer = 1 / sinh(a);
return answer;
}

function coth(a) {
var answer = 1 / tanh(a);
return answer;
}

function pow(a,b) {
return Math.pow(a,b);
}

function avg(list) {

var list1 = listCheck(list);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var sum = dataValues[0];

var i = 1;

while (dataValues[i]) {

sum = sum + '+' + dataValues[i];

i++;

}

var numSum = eval(sum);

var answer = numSum / i;

return answer;

}

function mean(list) {

var list1 = listCheck(list);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var sum = dataValues[0];

var i = 1;

while (dataValues[i]) {

sum = sum + '+' + dataValues[i];

i++;

}

var numSum = eval(sum);

var answer = numSum / i;

return answer;

}

function orderList(list) {

var list1 = listCheck(list);

var dataValues = new Array();

var z=0;

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

z=1;

} else {

dataValues = list1.split(' ');

}

var i=0;

var j=1;

while (dataValues[i]) {

while (dataValues[j]) {

var minValue = Math.min(dataValues[i],dataValues[j]);

var maxValue = Math.max(dataValues[i],dataValues[j]);

dataValues[i] = minValue;

dataValues[j] = maxValue;

j++;

}

j = i+1;

i++;

}

if (z == 0) {

var answer = dataValues.join(' ');

return answer;

}

if (z == 1) {

var answer = dataValues.join(',');

return answer;

}
}

function median(list) {

var list1 = listCheck(list);

list1 = orderList(list1);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i=0;

while (dataValues[i]) {

i++;

}

if (i % 2 == 1) {

var location = ((i + 1) / 2) - 1;

return dataValues[location];

}

else {

var locationOne = (i / 2) - 1;

var locationTwo = locationOne + 1;

var numberOne = parseFloat(dataValues[locationOne]);

var numberTwo = parseFloat(dataValues[locationTwo]);

var answer = (numberOne + numberTwo) / 2;

return answer;
}
}

function min(list) {

var list1 = listCheck(list);

list1 = orderList(list1);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i=0;

while (dataValues[i]) {

i++;

}

var answer = dataValues[0];

return answer;

}

function max(list) {

var list1 = listCheck(list);

list1 = orderList(list1);

var dataValues = new Array();

if (list.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i=0;

while (dataValues[i]) {

i++;

}

var answer = dataValues[i-1];

return answer;

}

function midrange(list) {

var smallest = min(list);
var largest = max(list);

smallest = parseFloat(smallest);
largest = parseFloat(largest);

var answer = (smallest + largest) / 2;

return answer;

}

function range(list) {

var smallest = min(list);

var largest = max(list);

smallest = parseFloat(smallest);

largest = parseFloat(largest);

var answer = largest - smallest;

return answer;

}

function sum(list) {

var list1 = listCheck(list);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var summa = dataValues.join('+');

var answer = eval(summa);

return answer;

}

function standev(list) {

var list1 = listCheck(list);

var average = mean(list1);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i = 0;

while (dataValues[i]) {

dataValues[i] = dataValues[i] * dataValues[i];

i++;

}

list = dataValues.join(' ');

var answer = sqrt(inv(i-1) * (sum(list) - i*pow(average,2)) );

return answer;

}

function stDEV(list) {

var list1 = listCheck(list);

var average = mean(list1);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i = 0;

while (dataValues[i]) {

dataValues[i] = dataValues[i] * dataValues[i];

i++;

}

list = dataValues.join(' ');

var answer = sqrt(inv(i) * sum(list) - pow(average,2) );

return answer;

}

function varPOP(list) {

var list1 = listCheck(list);

var average = mean(list1);

var dataValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues = list1.split(',');

} else {

dataValues = list1.split(' ');

}

var i = 0;

while (dataValues[i]) {

dataValues[i] = dataValues[i] * dataValues[i];

i++;

}

list = dataValues.join(' ');

var answer = inv(i) * sum(list) - pow(average,2);

return answer;

}

function varSamp(list) {

var deviation = standev(list);

var answer = pow(deviation,2);

return answer;

}

function P(a,list) {

var list1 = listCheck(list);

list = orderList(list1);

var dataValues = new Array();

if (list.indexOf(',') != -1) {

dataValues = list.split(',');

} else {

dataValues = list.split(' ');

}

var i = 0;

while (dataValues[i]) {

i++;

}

var locator = (a / 100) * (i - 1) +1;

var estimator = Math.floor(locator);

var d = locator - estimator;

if (estimator == 1) {

return dataValues[0];

}

if (estimator == i) {
return dataValues[i-1];
}

var answer = parseFloat(dataValues[estimator - 1]) + d * (parseFloat(dataValues[estimator]) - parseFloat(dataValues[estimator - 1]));

return answer;

}

function Q1(list) {

var list1 = listCheck(list);

return P(25,list1);

}

function Q2(list) {

var list1 = listCheck(list);

return P(50,list1);

}

function Q3(list) {

var list1 = listCheck(list);

return P(75,list1);

}

function Pi() {

return Math.PI;

}

function e(a) {

if (a == '') {
return Math.E;
}

return Math.exp(a);
}

function ln(a) {
return Math.log(a);
}

function log(a) {

var answer = (Math.log(a)) / (Math.log(10));

return answer;

}

function logb(base,a) {

var answer = (Math.log(a)) / (Math.log(base));

return answer;

}

function inv(a) {

var answer = 1 / a;

return answer;

}

function factorial(a) {

var b = parseInt(a);

if (a != b) {

errmess = 'You may only take the factorial of a whole number.';

return errmess;

}

var i = 1;

var answer = 1;

while (i <= a) {

answer = answer * i;

i++;

}

return answer;

}

function nPr(n,r) {

var answer = ( factorial(n) ) / ( factorial(n-r) );

return answer;

}

function nCr(n,r) {

var answer = ( factorial(n) ) / ( factorial(n-r) * factorial(r) );

return answer;

}

function intersection(list1,list2) {

var list1check = listCheck(list1);

var list2check = listCheck(list2);

var dataValues1 = new Array();

var dataValues2 = new Array();

var sharedValues = new Array();

if (list1check.indexOf(',') != -1) {

dataValues1 = list1check.split(',');

} else {

dataValues1 = list1check.split(' ');

}

if (list2check.indexOf(',') != -1) {

dataValues2 = list2check.split(',');

} else {

dataValues2 = list2check.split(' ');

}

var i = 0;

var j = 0;

var k = 0;

while (dataValues1[i]) {

j = 0;

while (dataValues2[j]) {

if (dataValues1[i] == dataValues2[j]) {

sharedValues[k] = dataValues1[i];

k++;

}

j++;

}

i++;

}

var answer = sharedValues.join(',');

answer = orderList(answer);

return answer;

}

function union(list1,list2) {

list1check = listCheck(list1);

list2check = listCheck(list2);

var sharedValues = intersection(list1check,list2check);

var duplicates = new Array();

duplicates = sharedValues.split(',');

var answer = sharedValues;

var dataValues1 = new Array();

var dataValues2 = new Array();

var newValues = new Array();

if (list1.indexOf(',') != -1) {

dataValues1 = list1check.split(',');

} else {

dataValues1 = list1check.split(' ');

}

if (list2.indexOf(',') != -1) {

dataValues2 = list2check.split(',');

} else {

dataValues2 = list2check.split(' ');

}

var wholeList = dataValues1.join(' ') + " " + dataValues2.join(' ');

var dataValues = new Array();

dataValues = wholeList.split(' ');

var i = 0;

var j = 0;

var k = 0;

var m = 0;

while (dataValues[i]) {

while (duplicates[j]) {

if (dataValues[i] == duplicates[j]) {

m = 1;

}

j++;

}

if (m == 0) {

newValues[k] = dataValues[i];

k++;

}

m = 0;

j = 0;

i++;

}

answer = newValues.join(',') + "," + duplicates.join(',');

answer = orderList(answer);

return answer;

}

function listCheck(list) {

if (list.indexOf(', ') != -1 ) {

while (list.indexOf(', ') != -1) {

list = list.replace(', ',' ');

}

}

if (list.indexOf('{') != -1 ) {

while (list.indexOf('{') != -1) {

list = list.replace('{','');

list = list.replace('}','');

}

}

if (list.indexOf('  ') != -1) {

while (list.indexOf('  ') != -1) {

list = list.replace('  ',' ');

}

}

return list;

}

function eqnParse(equation,value) {

if (equation.indexOf('^') != -1) {

errmess = 'Do NOT use ^ for exponents.  Instead, a^b must be written as Math.pow(a,b).';

return errmess;

}

if (value != parseFloat(value) ) {

value = 0;

}

if (equation.indexOf('Math.E') == -1 ) {

	if (equation.indexOf('e') != -1 ) {

		var splitnatural = new Array();
		splitnatural = equation.split('e');
		var z=1;
		equation = splitnatural[0];
		while (splitnatural[z]) {
			equation = equation + 'Math.E' + splitnatural[z];
			z++;
		}
	}
}
var locateX = new Array();

locateX = equation.split('x');

var recon = locateX[0];

var i=1;

while (locateX[i]) {

recon = recon + value + locateX[i];

i++;

}

var reconEval = eval(recon);

return reconEval;
}

function table(equation, xmin, xmax, res) {

var xCoord = new Array();
var yCoord = new Array();


var i = xmin;

var j = 0;

while (i <= xmax) {

xCoord[j] = i;
yCoord[j] = eqnParse(equation,i);

i = i + 1*res;
j++;

}

var values = xCoord.join(',') + "?" + yCoord.join(',');

return values;

}

function minor(matrix,n,m) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

answer = '';

while (j < i) {

while (entry[j][z] || entry[j][z]==0) {

if (j != n-1 && z != m-1) {

answer = answer + ' ' + entry[j][z];

}

z++;

}

if (j != n-1 && z != m-1) {

answer = answer + ' ?';

}

j++;

z=0;


}

answer = answer.substr(1);

answer = answer + ' ';

return answer;

}

function det(matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

if (i == 1) {

return entry[0][0];

}

while (entry[0][j] || entry[0][j]==0) {

if (j%2 == 0) {

answer = answer + ' + ' + entry[0][j] + '*' + det(minor(matrix,1,j+1));

} else {

answer = answer + ' - ' + entry[0][j] + '*' + det(minor(matrix,1,j+1));

}

j++;

}

if (i != j) {

answer = ("Error:  Must be an 'n' by 'n' matrix.");

}  else {

answer = eval(answer);

}

return answer;

}

function oneVarStats(list) {

var answer = "mean: " + avg(list) + "<br>";

answer = answer + "sum: " + sum(list) + "<br>";

answer = answer + "SampleStanDev: " + standev(list) + "<br>";

answer = answer + "PopStanDev: " + stDEV(list) + "<br>";

answer = answer + "n: " + sum(list) / avg(list) + "<br>";

answer = answer + "min: " + min(list) + "<br>";

answer = answer + "Q1: " + Q1(list) + "<br>";

answer = answer + "Median: " + median(list) + "<br>";

answer = answer + "Q3: " + Q3(list) + "<br>";

answer = answer + "max: " + max(list) + "<br>";

return answer;

}

function transpose(matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[j][z] || entry[j][z]==0) {

while (j < i) {

answer = answer + ' ' + entry[j][z];

j++;

}

j=0;

z++;

answer = answer + ' ?';

}

answer = answer.substr(1);

answer = answer + ' ';

return answer;

}

function dimension(matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[0][j] || entry[0][j]==0) {

j++;

}

answer = "{" + i + " " + j + "}";

return answer;

}

function rowAdd(matrix,rowA,rowB) {

rowA = rowA - 1;

rowB = rowB - 1;

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[rowB][j] || entry[rowB][j]==0) {

entry[rowB][j] = 1*entry[rowA][j] + 1*entry[rowB][j];

j++;

}

j=0;

while (j < i) {

while (entry[j][z] || entry[j][z]==0) {

answer = answer + ' ' + entry[j][z];

z++;

}

z=0;

j++;

answer = answer + ' ?';

}

answer = answer.substr(1);

answer = answer + ' ';

return answer;

}

function rowMultiply(givenValue,matrix,rowA) {

rowA = rowA - 1;

givenValue = 1*givenValue;

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var z = 0;

var answer = 0;

answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[rowA][j] || entry[rowA][j]==0) {

entry[rowA][j] = givenValue * entry[rowA][j];

j++;

}

j=0;

while (j < i) {

while (entry[j][z] || entry[j][z]==0) {

answer = answer + ' ' + entry[j][z];

z++;

}

z=0;

j++;

answer = answer + ' ?';

}

answer = answer.substr(1);

answer = answer + ' ';

return answer;

}

function multiplyRowAddRow (givenValue,matrix,rowA,rowB) {

var answer = rowMultiply(givenValue,matrix,rowA);

answer = rowAdd(answer,rowA,rowB);

answer = rowMultiply((1/givenValue),answer,rowA);

return answer;

}

function rowSwap(matrix,rowA,rowB) {

rowA = rowA - 1;

rowB = rowB - 1;

var row = new Array();

row = matrix.split(' ? ');

var i=0;

var answer = '';

while (row[i]) {

if (i == rowA) {

answer = answer + ' ? ' + row[rowB];

} else if (i == rowB) {

answer = answer + ' ? ' + row[rowA];

} else {

answer = answer + ' ? ' + row[i];

}

i++;

}

answer = answer.substr(3);

answer = answer + ' ? ';

return answer;

}

function ref(matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var k = 1;

var z = 0;

var matrixChecker = 1;

var answer = matrix;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (z < i) {

while (entry[j][z] == 0) {

j++;

if (j >= i) {

break;

}

}

if (j != z && j < i) {

answer = rowSwap(answer,z+1,j+1);

row = answer.split(' ? ');

i = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

}

if (entry[z][z] != 0) {

answer = rowMultiply((1/entry[z][z]),answer,z+1);

}

if (z > 0) {

if (entry[z-1][z-1] == 0) {

if (entry[z-1][z] != 0) {

answer = multiplyRowAddRow((-1*entry[z-1][z]),answer,z+1,z);

}

row = answer.split(' ? ');

i = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

}

}

while (k < i) {

if (entry[k][z] != 0) {

answer = multiplyRowAddRow((-1*entry[k][z]),answer,z+1,k+1);

}

k++;

}

z++;

j = z;

k = z + 1;

row = answer.split(' ? ');

i = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

}

return answer;

}

function rref(matrix) {

var answer = ref(matrix);

var row = new Array();

row = answer.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var k = 0;

var z = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

j = i-1;

while (j >= 0) {

while (k < j) {

if (entry[j][j] == 0) {

break;

}

if (entry[k][j] != 0) {

answer = multiplyRowAddRow((-1*entry[k][j]),answer,j+1,k+1);

}

k++;

}

k=0;

j--;

row = answer.split(' ? ');

i = 0;

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

}

return answer;

}

function multiplyMatrix(matrixA,matrixB) {

var rowA = new Array();

var rowB = new Array();

rowA = matrixA.split(' ? ');

rowB = matrixB.split(' ? ');

var entryA = new Array();

var entryB = new Array();

var i = 0;

var j = 0;

var k = 0;

var z = 0;

var answer = matrixA;

while (rowA[i]) {

entryA[i] = new Array();

entryA[i] = rowA[i].split(' ');

i++;

}

while (rowB[j]) {

entryB[j] = new Array();

entryB[j] = rowB[j].split(' ');

j++;

}

while (entryA[0][k] || entryA[0][k] == 0) {

k++;

}

while (entryB[0][z] || entryB[0][z] == 0) {

z++;

}

if (k != j) {

errmess = 'Error:  Invalid Dimension';

return errmess;

}

var iprime = 0;
var jprime = 0;
var kprime = 0;
var zprime = 0;

var entryC = new Array();

while (iprime < i) {

entryC[iprime] = new Array();

while (zprime < z) {

entryC[iprime][zprime] = 0;

while (jprime < j) {

entryC[iprime][zprime] = entryC[iprime][zprime] + (entryA[iprime][jprime] * entryB[kprime][zprime]);

jprime++;
kprime++;

}

kprime = 0;
jprime = 0;
zprime++;

}

zprime = 0;
iprime++;

}

iprime = 0;
zprime = 0;

answer = '';

while (iprime < i) {

while (zprime < z) {

answer = answer + ' ' + entryC[iprime][zprime];

zprime++;

}

answer = answer + ' ?';
zprime = 0;
iprime++;

}

answer = answer + ' ';

answer = answer.substr(1);

return answer;

}

function identityMatrix(d) {

var entry = new Array();

var i = 0;

var j = 0;

while (i < d) {

entry[i] = new Array();

while (j < d) {

if (i == j) {

entry[i][j] = 1;

} else {

entry[i][j] = 0;

}

j++;

}

j = 0;

i++;

}

var answer = '';

i = 0;
j = 0;

while (i < d) {

while (j < d) {

answer = answer + ' ' + entry[i][j];

j++;

}

answer = answer + ' ?';
j = 0;
i++;

}

answer = answer + ' ';

answer = answer.substr(1);

return answer;

}

function fillMatrix(value,matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var k = 1;

var z = 0;

var answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[0][k] || entry[0][k] == 0) {

k++;

}

while (j < i) {

while (z < k) {

entry[j][z] = value;

z++;

}

z = 0;
j++;

}

z = 0;
j = 0;

while (j < i) {

while (z < k) {

answer = answer + ' ' + entry[j][z];

z++;

}

answer = answer + ' ?';
z = 0;
j++;

}

answer = answer + ' ';

answer = answer.substr(1);

return answer;

}

function augmentMatrix(matrixA,matrixB) {

var rowA = new Array();

var rowB = new Array();

rowA = matrixA.split(' ? ');

rowB = matrixB.split(' ? ');

var entryA = new Array();

var entryB = new Array();

var i = 0;

var j = 0;

var k = 0;

var z = 0;

var answer = '';

while (rowA[i]) {

entryA[i] = new Array();

entryA[i] = rowA[i].split(' ');

i++;

}

while (rowB[j]) {

entryB[j] = new Array();

entryB[j] = rowB[j].split(' ');

j++;

}

if (i != j) {

errmess = 'Error: Must have the same number of rows to augment';

return errmess;

}

var entryC = new Array();

while (z < i) {

answer = answer + rowA[z] + ' ' + rowB[z] + ' ? ';

z++;

}

return answer;

}

function inverseMatrix(matrix) {

var row = new Array();

row = matrix.split(' ? ');

var entry = new Array();

var i = 0;

var j = 0;

var k = 1;

var z = 0;

var answer = '';

while (row[i]) {

entry[i] = new Array();

entry[i] = row[i].split(' ');

i++;

}

while (entry[0][k] || entry[0][k] == 0) {

k++;

}

if (i != k) {

errmess = 'Error: Only square (nXn) matrices have inverses!';

return errmess;

}

var invertedMatrix = rref(augmentMatrix(matrix,identityMatrix(i)));

var invertedRows = new Array();

invertedRows = invertedMatrix.split(' ? ');

var invertedEntries = new Array();

while (invertedRows[j]) {

invertedEntries[j] = new Array();

invertedEntries[j] = invertedRows[j].split(' ');

j++;

}

j = 0;

while (invertedRows[j]) {

while (z < 2*i) {

if (z >= i) {

answer = answer + ' ' + invertedEntries[j][z];

}

z++;

}

answer = answer + ' ?';

z = 0;

j++;

}

answer = answer + ' ';

answer = answer.substr(1);

return answer;

return true;

}

function powMatrix(matrix,exponent) {

var answer = matrix;

var i = 2;

var intCheck = parseInt(exponent);

if (intCheck != exponent) {

errmess = 'Error: Exponent must be an integer (whole number)';

return errmess;

}

if (exponent <= 0) {

errmess = 'Error: Invalid exponent';
return errmess;

}

while (i <= exponent) {

answer = multiplyMatrix(answer,matrix);

i++;

}

return answer;

}