code: function() {
              	if (!this.isSquare() || this.isSingular()) { return null; }
              	var n = this.elements.length, i = n, j;
              	var M = this.augment(Matrix$b.I(n)).toRightTriangular();
              	var np = M.elements[0].length, p, els, divisor;
              	var inverse_elements = [], new_element;
              	// Matrix is non-singular so there will be no zeros on the diagonal
              	// Cycle through rows from last to first
              	while (i--) {
              	    // First, normalise diagonal elements to 1
              	    els = [];
              	    inverse_elements[i] = [];
              	    divisor = M.elements[i][i];
              	    for (p = 0; p < np; p++) {
                      new_element = M.elements[i][p] / divisor;
              		els.push(new_element);
              		// Shuffle off the current row of the right hand side into the results
              		// array as it will not be modified by later runs through this loop
              		if (p >= n) { inverse_elements[i].push(new_element); }
              	    }
              	    M.elements[i] = els;
              	    // Then, subtract this row from those above it to
              	    // give the identity matrix on the left hand side
              	    j = i;
              	    while (j--) {
              		els = [];
              		for (p = 0; p < np; p++) {
              		    els.push(M.elements[j][p] - M.elements[i][p] * M.elements[j][i]);
              		}
              		M.elements[j] = els;
              	    }
              	}
              	return Matrix$b.create(inverse_elements);
                  }
docs: Returns the inverse (if one exists) using Gauss-Jordan