Skip to content

Instantly share code, notes, and snippets.

@fibo
Last active September 30, 2015 21:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fibo/345763d95f093b9d9350 to your computer and use it in GitHub Desktop.
Save fibo/345763d95f093b9d9350 to your computer and use it in GitHub Desktop.
requirebin sketch
// Code from http://g14n.info/algebra/#quick-start
// This is a 60 seconds tutorial to get your hands dirty with algebra.
/////////////////////////////////////////////////////////////////////
// First of all, import algebra package.
var algebra = require('algebra');
/// Scalars
///////////
// Use the Real numbers as scalars.
var R = algebra.Real;
// Every operator is implemented both as a static function and as an object method.
// Static operators return raw data, while class methods return object instances.
// Use static addition operator to add three numbers.
console.log(R.add(1, 2, 3)); // 1 + 2 + 3 = 6
// Create two real number objects: x = 2, y = -2
var x = new R(2),
y = new R(-2);
// The value of *r* is the result of x multiplied by y.
var r = x.mul(y);
console.log(r.data); // 2 * (-2) = -4
console.log(x.data); // still 2
console.log(y.data); // still -2
// Raw numbers are coerced, operators can be chained when it makes sense.
// Of course you can reassign x, for example, x value will be 0.1: x -> x + 3 -> x * 2 -> x ^-1
x = x.add(3).mul(2).inv();
console.log(x.data); // ((2 + 3) * 2)^(-1) = 0.1
// Comparison operators *equal* and *notEqual* are available, but they cannot be chained.
x.equal(0.1) // true
x.notEqual(Math.PI) // true
/// Vectors
///////////
// Create vector space of dimension 2 over Reals.
var R2 = algebra.VectorSpace(R)(2);
// Create two vectors and add them.
var v1 = new R2([0, 1]);
var v2 = new R2([1, -2]);
// v1 -> v1 + v2 -> [0, 1] + [1, -2] = [1, -1]
v1 = v1.add(v2);
console.log(v1.data); // [1, -1]
/// Matrices
////////////
// Create space of matrices 3 x 2 over Reals.
var R3x2 = algebra.MatrixSpace(R)(3, 2);
// Create a matrix.
// | 1 1 |
// m1 = | 0 1 |
// | 1 0 |
//
var m1 = new R3x2([1, 1,
0, 1,
1, 0]);
// Multiply m1 by v1, the result is a vector v3 with dimension 3.
// In fact we are multiplying a 3 x 2 matrix by a 2 dimensional vector, but v1 is traited as a column vector so it is like a 2 x 1 matrix.
// Then, following the row by column multiplication law we have
// 3 x 2 by 2 x 1 which gives a 3 x 1
// ↑ ↑
// +------+----→ by removing the middle indices.
//
// | 1 1 |
// v3 = m1 * v1 = | 0 1 | * [1 , -1] = [0, -1, 1]
// | 1 0 |
var v3 = m1.mul(v1);
console.log(v3.data); // [0, -1, 1]
// Let's try with two square matrices 2 x 2.
var R2x2 = algebra.MatrixSpace(R)(2, 2);
var m2 = new R2x2([1, 0,
0, 2]),
m3 = new R2x2([0, -1,
1, 0]);
m2 = m2.mul(m3);
console.log(m2.data); // [0, -1,
// 2, 0]
// Since m2 is a square matrix we can calculate its determinant.
console.log(m2.determinant.data); // 2
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){function algebraGroup(given,naming){var group={};if(typeof given==="undefined")given={};if(typeof naming==="undefined")naming={};var defaultNaming={compositionLaw:"addition",identity:"zero",inverseCompositionLaw:"subtraction",inversion:"negation"};function prop(name){if(typeof naming[name]==="string")return naming[name];if(typeof defaultNaming[name]==="string")return defaultNaming[name];return name}function compositionLaw(){return[].slice.call(arguments).reduce(given.compositionLaw)}function contains(){var arg=[].slice.call(arguments);for(var i in arg)if(!given.contains(arg[i]))return false;return true}function notContains(a){return!contains(a)}function disequality(a,b){return!given.equality(a,b)}function inverseCompositionLaw(a){var rest=[].slice.call(arguments,1);return compositionLaw(a,rest.map(given.inversion).reduce(given.compositionLaw))}group[prop("contains")]=contains;group[prop("notContains")]=notContains;group[prop("compositionLaw")]=compositionLaw;group[prop("inversion")]=given.inversion;group[prop("inverseCompositionLaw")]=inverseCompositionLaw;group[prop("equality")]=given.equality;group[prop("disequality")]=disequality;var e=given.identity;if(notContains(e))throw new TypeError('"identity" must be contained in group set');if(disequality(given.compositionLaw(e,e),e))throw new TypeError('"identity" is not neutral');group[prop("identity")]=e;return group}module.exports=algebraGroup},{}],2:[function(require,module,exports){var group=require("algebra-group");function algebraRing(identity,given){var ring=group({identity:identity[0],contains:given.contains,equality:given.equality,compositionLaw:given.addition,inversion:given.negation});function multiplication(){return[].slice.call(arguments).reduce(given.multiplication)}function inversion(a){if(ring.equality(a,ring.zero))throw new TypeError("algebra-ring: Cannot divide by zero.");return given.inversion(a)}function division(a){var rest=[].slice.call(arguments,1);return given.multiplication(a,rest.map(given.inversion).reduce(given.multiplication))}ring.multiplication=multiplication;ring.inversion=inversion;ring.division=division;var one=identity[1];if(ring.notContains(one))throw new TypeError('algebra-ring: "identity" must be contained in ring set');if(ring.disequality(given.multiplication(one,one),one))throw new TypeError('algebra-ring: "identity" is not neutral');if(ring.notContains(identity[1]))throw new TypeError('algebra-ring:"identity" must be contained in ring set');ring.one=identity[1];return ring}module.exports=algebraRing},{"algebra-group":1}],3:[function(require,module,exports){var ring=require("algebra-ring");var twoPow=Math.pow.bind(null,2);function arrayfy1(operator,dim){return function(a){var b=[];for(var i=0;i<dim;i++)b.push(operator(a[i]));return b}}function arrayfy2(operator,dim){return function(a,b){var c=[];for(var i=0;i<dim;i++)c.push(operator(a[i],b[i]));return c}}function iterateCayleyDickson(given,iterations){var field=ring([given.zero,given.one],given);if(iterations===0)return field;var fieldZero=field.zero,fieldOne=field.one,fieldAddition=field.addition,fieldMultiplication=field.multiplication,fieldNegation=field.negation,fieldDisequality=field.disequality,fieldNotContains=field.notContains;var one=[],zero=[],dim=twoPow(iterations);one.push(fieldOne);zero.push(fieldZero);for(var i=1;i<dim;i++){one.push(fieldZero);zero.push(fieldZero)}function equality(a,b){for(var i=0;i<dim;i++)if(fieldDisequality(a[i],b[i]))return false;return true}function contains(a){for(var i=0;i<dim;i++)if(fieldNotContains(a[i]))return false;return true}function buildConjugation(fieldNegation,iterations){if(iterations===0)return function(a){return a};var dim=twoPow(iterations);function conjugation(b){var p=[b[0]],i;for(i=1;i<dim;i++)p.push(fieldNegation(b[i]));return p}return conjugation}var conjugation=buildConjugation(fieldNegation,iterations);function buildMultiplication(fieldAddition,fieldNegation,fieldMultiplication,iterations){if(iterations===0)return function(a,b){return[fieldMultiplication(a,b)]};var dim=twoPow(iterations),halfDim=twoPow(iterations-1);var add=arrayfy2(fieldAddition,halfDim),conj=buildConjugation(fieldNegation,iterations-1),mul=buildMultiplication(fieldAddition,fieldNegation,fieldMultiplication,iterations-1),neg=arrayfy1(fieldNegation,halfDim);function multiplication(a,b){var c=[];var p=[],q=[],r=[],s=[];for(var i1=0;i1<halfDim;i1++){p.push(a[i1]);r.push(b[i1])}for(var i2=halfDim;i2<dim;i2++){q.push(a[i2]);s.push(b[i2])}var t=add(mul(p,r),neg(mul(conj(s),q))),u=add(mul(s,p),mul(q,conj(r)));for(var i3=0;i3<halfDim;i3++)c.push(t[i3]);for(var i4=0;i4<halfDim;i4++)c.push(u[i4]);return c}return multiplication}var multiplication=buildMultiplication(fieldAddition,fieldNegation,fieldMultiplication,iterations);function norm(a){var n=fieldZero,squares=multiplication(a,conjugation(a));for(var i=0;i<dim;i++)n=fieldAddition(n,squares[i]);return n}function inversion(a){var n=norm(a);var b=conjugation(a);for(var i=0;i<dim;i++)b[i]=field.division(b[i],n);return b}var addition=arrayfy2(fieldAddition,dim),negation=arrayfy1(fieldNegation,dim);var algebra=ring([zero,one],{contains:contains,equality:equality,addition:addition,negation:negation,multiplication:multiplication,inversion:inversion});algebra.conjugation=conjugation;algebra.norm=norm;return algebra}module.exports=iterateCayleyDickson},{"algebra-ring":2}],4:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],5:[function(require,module,exports){var isFinite=require("is-finite");module.exports=Number.isInteger||function(val){return typeof val==="number"&&isFinite(val)&&Math.floor(val)===val}},{"is-finite":6}],6:[function(require,module,exports){"use strict";var numberIsNan=require("number-is-nan");module.exports=Number.isFinite||function(val){return!(typeof val!=="number"||numberIsNan(val)||val===Infinity||val===-Infinity)}},{"number-is-nan":7}],7:[function(require,module,exports){"use strict";module.exports=Number.isNaN||function(x){return x!==x}},{}],8:[function(require,module,exports){function matrixToArrayIndex(i,j,numCols){return j+i*numCols}function subMatrix(data,numRows,numCols,row,col){var sub=[];for(var i=0;i<numRows;i++)for(var j=0;j<numCols;j++)if(i!==row&&j!==col)sub.push(data[matrixToArrayIndex(i,j,numCols)]);return sub}function determinant(data,scalar,order){if(data.length===1)return data[0];if(typeof order==="undefined")order=Math.sqrt(data.length);if(order%1!==0)throw new TypeError("data.lenght must be a square");if(typeof scalar==="undefined"){scalar={addition:function(a,b){return a+b},multiplication:function(a,b){return a*b},negation:function(a){return-a}}}var det;var startingCol=0,startingRow=0;for(var col=0;col<order;col++){var subData=subMatrix(data,order,order,startingRow,col);var cofactor=determinant(subData,scalar,order-1);if((startingRow+col)%2===1)cofactor=scalar.negation(cofactor);var index=matrixToArrayIndex(startingRow,col,order);if(typeof det==="undefined")det=scalar.multiplication(data[index],cofactor);else det=scalar.addition(det,scalar.multiplication(data[index],cofactor))}return det}module.exports=determinant},{}],9:[function(require,module,exports){module.exports=function(cb){cb()}},{}],10:[function(require,module,exports){function Element(data,check){if(typeof data==="undefined")throw new TypeError("Undefined data");if(check(data))this.data=data;else throw new TypeError("Invalid data = "+data)}function valueOf(){return this.data}Element.prototype.valueOf=valueOf;module.exports=Element},{}],11:[function(require,module,exports){var determinant=require("laplace-determinant"),inherits=require("inherits"),itemsPool=require("./itemsPool"),isInteger=require("is-integer"),matrixToArrayIndex=require("./matrixToArrayIndex"),rowByColumnMultiplication=require("./rowByColumnMultiplication"),toData=require("./toData"),VectorSpace=require("./VectorSpace");function MatrixSpace(Scalar){return function(numRows,numCols){function createIdentity(scalarZero,scalarOne,rank){var identity=[];for(var i=0;i<rank;i++)for(var j=0;j<rank;j++)if(i===j)identity.push(scalarOne);else identity.push(scalarZero);return identity}if(typeof numCols==="undefined")numCols=numRows;var dimension=numRows*numCols,indices=[numRows,numCols],isSquare=numRows===numCols;function staticRightMultiplication(leftNumRows,leftNumCols,left,right){var leftData=toData(left),rightData=toData(right),rightNumCols=rightData.length/leftNumCols;if(!isInteger(rightNumCols))throw new TypeError("left num cols != right num rows");return rowByColumnMultiplication(Scalar,leftData,leftNumRows,rightData,rightNumCols)}var Vector=VectorSpace(Scalar)(dimension);function Matrix(data){Vector.call(this,data);this.numCols=numCols;this.numRows=numRows;Object.defineProperties(this,{numCols:{writable:false,value:numCols},numRows:{writable:false,value:numRows}});function matrixDeterminant(){var det=determinant(data,Scalar,numRows);return new Scalar(det)}if(isSquare){Object.defineProperty(this,"determinant",{get:matrixDeterminant})}}inherits(Matrix,Vector);function rightMultiplication(right){var left=this.data,leftNumCols=this.numCols,leftNumRows=this.numRows,rightData=toData(right);var data=staticRightMultiplication(leftNumRows,leftNumCols,left,right);var rightNumCols=rightData.length/leftNumCols,rightNumRows=leftNumCols;var leftIsVector=leftNumRows===1,rightIsVector=rightNumCols===1;if(leftIsVector&&rightIsVector)return new Scalar(data[0]);var VectorSpace=itemsPool.getVectorSpace();if(leftIsVector){var LeftVector=VectorSpace(Scalar)(rightNumCols);return new LeftVector(data)}if(rightIsVector){var RightVector=VectorSpace(Scalar)(leftNumRows);return new RightVector(data)}var MatrixSpace=itemsPool.getMatrixSpace();var Matrix=MatrixSpace(Scalar)(rightNumRows,rightNumCols);return new Matrix(data)}Matrix.prototype.multiplication=rightMultiplication;if(isSquare){var rank=numRows;var identity=createIdentity(Scalar.zero,Scalar.one,rank);Object.defineProperty(Matrix,"identity",{writable:false,value:identity})}Object.defineProperties(Matrix,{isSquare:{writable:false,value:isSquare},numCols:{writable:false,value:numCols},numRows:{writable:false,value:numRows},zero:{writable:false,value:Vector.zero}});function transpose(numRows,numCols,matrix){var data=toData(matrix),transposedData=[];for(var i=0;i<numRows;i++)for(var j=0;j<numCols;j++){transposedData[matrixToArrayIndex(j,i,numRows)]=data[matrixToArrayIndex(i,j,numCols)]}return transposedData}function matrixTransposition(){var data=this.data,numCols=this.numCols,numRows=this.numRows;var transposedData=transpose(numRows,numCols,data);var TransposedMatrix=MatrixSpace(Scalar)(numCols,numRows);return new TransposedMatrix(transposedData)}Matrix.prototype.transpose=matrixTransposition;Matrix.addition=Vector.addition;Matrix.multiplication=staticRightMultiplication.bind(null,numRows,numCols);Matrix.negation=Vector.negation;Matrix.subtraction=Vector.subtraction;Matrix.transpose=transpose.bind(null,numRows,numCols);Matrix.add=Matrix.addition;Matrix.mul=Matrix.multiplication;Matrix.neg=Matrix.negation;Matrix.sub=Matrix.subtraction;Matrix.prototype.mul=rightMultiplication;Matrix.prototype.tr=matrixTransposition;Matrix.prototype.t=matrixTransposition;Matrix.tr=Matrix.transpose;return Matrix}}itemsPool.setMatrixSpace(MatrixSpace);module.exports=MatrixSpace},{"./VectorSpace":12,"./itemsPool":16,"./matrixToArrayIndex":17,"./rowByColumnMultiplication":20,"./toData":21,inherits:4,"is-integer":5,"laplace-determinant":8}],12:[function(require,module,exports){var algebraGroup=require("algebra-group"),coerced=require("./coerced"),comparison=require("./comparison"),Element=require("./Element"),inherits=require("inherits"),itemsPool=require("./itemsPool"),method=require("./method"),rowByColumnMultiplication=require("./rowByColumnMultiplication.js"),toData=require("./toData");var nAryMethod=method.nAry,unaryMethod=method.unary;function VectorSpace(Scalar){return function(dimension){function createZero(scalarZero,dimension){var vectorZero=[];for(var i=0;i<dimension;i++)vectorZero.push(scalarZero);return vectorZero}var zero=createZero(Scalar.zero,dimension);function _contains(a){if(a.length!==dimension)return false;for(var i=0;i<dimension;i++)if(!Scalar.contains(a[i]))return false;return true}function _equality(a,b){for(var i=0;i<dimension;i++)if(!Scalar.equality(a[i],b[i]))return false;return true}function _addition(a,b){var c=[];for(var i=0;i<dimension;i++)c.push(Scalar.addition(a[i],b[i]));return c}function _negation(a){var b=[];for(var i=0;i<dimension;i++)b.push(Scalar.negation(a[i]));return b}var g=algebraGroup({identity:zero,contains:_contains,equality:_equality,compositionLaw:_addition,inversion:_negation});var addition=coerced(g.addition),contains=coerced(g.contains),disequality=coerced(g.disequality),equality=coerced(g.equality),negation=coerced(g.negation),notContains=coerced(g.notContains),subtraction=coerced(g.subtraction);function Vector(data){Element.call(this,data,contains);function vectorNorm(){var result=Scalar.multiplication(data[0],data[0]);for(var i=1;i<dimension;i++)result=Scalar.addition(result,Scalar.multiplication(data[i],data[i]));return new Scalar(result)}Object.defineProperty(this,"norm",{get:vectorNorm})}inherits(Vector,Element);Object.defineProperty(Vector,"zero",{writable:false,value:zero});function crossProduct(right){var rightData=toData(right)}if(dimension===3){Vector.prototype.crossProduct=crossProduct;Vector.prototype.cross=crossProduct;Vector.prototype.x=crossProduct}function scalarProduct(vector1,vector2){var vectorData1=toData(vector1),vectorData2=toData(vector2);if(vectorData1.length!==vectorData2.length)throw new TypeError("Vectors has not the same dimension");var result=Scalar.multiplication(vectorData1[0],vectorData2[0]);for(var i=1;i<dimension;i++){result=Scalar.addition(result,Scalar.multiplication(vectorData1[i],vectorData2[i]))}return result}function vectorScalarProduct(vector){var result=scalarProduct(this.data,vector);return new Scalar(result)}Vector.prototype.scalarProduct=vectorScalarProduct;function perScalarProduct(Scalar){var data=this.data,ScalarData=toData(Scalar);for(var i=0;i<dimension;i++)data[i]=Scalar.mul(data[i],ScalarData);this.data=data;return this}Vector.prototype.perScalarProduct=perScalarProduct;function transpose(){var data=this.data;var MatrixSpace=itemsPool.getMatrixSpace();var Matrix=MatrixSpace(Scalar)(1,dimension);return new Matrix(data)}Vector.prototype.transpose=transpose;Vector.prototype.equality=comparison(equality);Vector.prototype.disequality=comparison(disequality);Vector.prototype.addition=nAryMethod(addition,Vector);Vector.prototype.subtraction=nAryMethod(subtraction,Vector);Vector.prototype.negation=unaryMethod(negation,Vector);Vector.contains=contains;Vector.disequality=disequality;Vector.equality=equality;Vector.notContains=notContains;Vector.addition=addition;Vector.subtraction=subtraction;Vector.negation=negation;Vector.scalarProduct=scalarProduct;Vector.eq=Vector.equality;Vector.ne=Vector.disequality;Vector.equal=Vector.equality;Vector.notEqual=Vector.disequality;Vector.notEq=Vector.disequality;Vector.add=Vector.addition;Vector.neg=Vector.negation;Vector.sub=Vector.subtraction;Vector.prototype.add=Vector.prototype.addition;Vector.prototype.neg=Vector.prototype.negation;Vector.prototype.sub=Vector.prototype.subtraction;Vector.prototype.dotProduct=vectorScalarProduct;Vector.prototype.dot=vectorScalarProduct;return Vector}}itemsPool.setVectorSpace(VectorSpace);module.exports=VectorSpace},{"./Element":10,"./coerced":13,"./comparison":14,"./itemsPool":16,"./method":18,"./rowByColumnMultiplication.js":20,"./toData":21,"algebra-group":1,inherits:4}],13:[function(require,module,exports){var toData=require("./toData");function coerced(operator){return function(){return operator.apply(null,[].slice.call(arguments).map(toData))}}module.exports=coerced},{"./toData":21}],14:[function(require,module,exports){function comparison(operator){return function(){return operator.bind(null,this.data).apply(null,arguments)}}module.exports=comparison},{}],15:[function(require,module,exports){var algebraRing=require("algebra-ring"),coerced=require("./coerced"),comparison=require("./comparison"),Element=require("./Element"),inherits=require("inherits"),method=require("./method");var nAryMethod=method.nAry,unaryMethod=method.unary;function createScalar(identity,given){var r=algebraRing(identity,given);function Scalar(data){Element.call(this,data,given.contains)}inherits(Scalar,Element);if(typeof given.conjugation==="undefined")given.conjugation=function(a){return a};var addition=coerced(given.addition),contains=coerced(given.contains),conjugation=coerced(given.conjugation),disequality=coerced(given.disequality),equality=coerced(given.equality),negation=coerced(given.negation),notContains=coerced(given.notContains),subtraction=coerced(given.subtraction);var multiplication=coerced(given.multiplication),division=coerced(given.division),inversion=coerced(given.inversion);Scalar.prototype.equality=comparison(equality);Scalar.prototype.disequality=comparison(disequality);Scalar.prototype.addition=function(){var data=addition.bind(null,this.data).apply(null,arguments);return new Scalar(data)};Scalar.prototype.subtraction=nAryMethod(subtraction,Scalar);Scalar.prototype.negation=unaryMethod(negation,Scalar);Scalar.prototype.conjugation=unaryMethod(conjugation,Scalar);Scalar.prototype.multiplication=nAryMethod(multiplication,Scalar);Scalar.prototype.division=nAryMethod(division,Scalar);Scalar.prototype.inversion=unaryMethod(inversion,Scalar);Scalar.addition=addition;Scalar.contains=contains;Scalar.conjugation=conjugation;Scalar.disequality=disequality;Scalar.equality=equality;Scalar.negation=negation;Scalar.notContains=notContains;Scalar.subtraction=subtraction;Scalar.multiplication=multiplication;Scalar.division=division;Scalar.inversion=inversion;Scalar.eq=Scalar.equality;Scalar.ne=Scalar.disequality;Scalar.equal=Scalar.equality;Scalar.notEqual=Scalar.disequality;Scalar.notEq=Scalar.disequality;Scalar.add=Scalar.addition;Scalar.neg=Scalar.negation;Scalar.sub=Scalar.subtraction;Scalar.div=Scalar.division;Scalar.inv=Scalar.inversion;Scalar.mul=Scalar.multiplication;Scalar.conj=Scalar.conj;Scalar.prototype.eq=Scalar.prototype.equality;Scalar.prototype.ne=Scalar.prototype.disequality;Scalar.prototype.equal=Scalar.prototype.equality;Scalar.prototype.notEqual=Scalar.prototype.disequality;Scalar.prototype.notEq=Scalar.prototype.disequality;Scalar.prototype.add=Scalar.prototype.addition;Scalar.prototype.neg=Scalar.prototype.negation;Scalar.prototype.sub=Scalar.prototype.subtraction;Scalar.prototype.mul=Scalar.prototype.multiplication;Scalar.prototype.div=Scalar.prototype.division;Scalar.prototype.inv=Scalar.prototype.inversion;Scalar.prototype.conj=Scalar.prototype.conjugation;Scalar.zero=new Scalar(identity[0]);Scalar.one=new Scalar(identity[1]);return Scalar}module.exports=createScalar},{"./Element":10,"./coerced":13,"./comparison":14,"./method":18,"algebra-ring":2,inherits:4}],16:[function(require,module,exports){function itemsPool(){var MatrixSpace,VectorSpace;function getMatrixSpace(){if(typeof MatrixSpace==="undefined")throw new Error("MatrixSpace not yet in items pool");return MatrixSpace}this.getMatrixSpace=getMatrixSpace;function setMatrixSpace(item){if(typeof MatrixSpace==="undefined")MatrixSpace=item;else throw new Error("MatrixSpace already in items pool")}this.setMatrixSpace=setMatrixSpace;function getVectorSpace(){if(typeof VectorSpace==="undefined")throw new Error("VectorSpace not yet in items pool");return VectorSpace}this.getVectorSpace=getVectorSpace;function setVectorSpace(item){if(typeof VectorSpace==="undefined")VectorSpace=item;else throw new Error("VectorSpace already in items pool")}this.setVectorSpace=setVectorSpace}module.exports=new itemsPool},{}],17:[function(require,module,exports){function matrixToArrayIndex(i,j,numCols){return j+i*numCols}module.exports=matrixToArrayIndex},{}],18:[function(require,module,exports){function unaryMethod(operator,Scalar){return function(){var data=operator(this.data);return new Scalar(data)}}exports.unary=unaryMethod;function nAryMethod(operator,Scalar){return function(){var data=operator.bind(null,this.data).apply(null,arguments);return new Scalar(data)}}exports.nAry=nAryMethod},{}],19:[function(require,module,exports){var realField={zero:0,one:1,contains:function(a,b){return typeof a==="number"&&isFinite(a)},equality:function(a,b){return a===b},addition:function(a,b){return a+b},negation:function(a){return-a},multiplication:function(a,b){return a*b},inversion:function(a){return 1/a}};module.exports=realField},{}],20:[function(require,module,exports){var isInteger=require("is-integer"),matrixToArrayIndex=require("./matrixToArrayIndex");function rowByColumnMultiplication(scalar,leftMatrix,leftNumRows,rightMatrix,rightNumCols){var leftNumCols=leftMatrix.length/leftNumRows,rightNumRows=rightMatrix.length/rightNumCols;if(!isInteger(leftNumCols))throw new TypeError("leftNumCols does not divide leftMatrix.length");if(!isInteger(rightNumRows))throw new TypeError("rightNumRows does not divide rightMatrix.length");if(leftNumCols!==rightNumRows)throw new TypeError("Left num cols != right num rows");var commonIndex=leftNumCols,data=[],rows=leftNumRows,cols=rightNumCols;for(var i=0;i<rows;i++){for(var j=0;j<cols;j++){var leftIndex=matrixToArrayIndex(i,0,commonIndex),rightIndex=matrixToArrayIndex(0,j,cols);var rightElement=rightMatrix[rightIndex],leftElement=leftMatrix[leftIndex];var element=scalar.multiplication(leftElement,rightElement);for(var k=1;k<commonIndex;k++){leftIndex=matrixToArrayIndex(i,k,commonIndex);rightIndex=matrixToArrayIndex(k,j,cols);rightElement=rightMatrix[rightIndex];leftElement=leftMatrix[leftIndex];element=scalar.addition(element,scalar.multiplication(rightElement,leftElement))}data.push(element)}}return data}module.exports=rowByColumnMultiplication},{"./matrixToArrayIndex":17,"is-integer":5}],21:[function(require,module,exports){function toData(arg){var data;if(typeof arg.data==="undefined")data=arg;else data=arg.data;if(typeof data==="undefined")throw new TypeError("No data");return data}module.exports=toData},{}],algebra:[function(require,module,exports){require("strict-mode")(function(){var iterateCayleyDickson=require("cayley-dickson"),realField=require("./src/realField"),createScalar=require("./src/createScalar");var K0=iterateCayleyDickson(realField,0),K1=iterateCayleyDickson(realField,1),K2=iterateCayleyDickson(realField,2),K3=iterateCayleyDickson(realField,3);exports.Real=createScalar([K0.zero,K0.one],K0);exports.Complex=createScalar([K1.zero,K1.one],K1);exports.Quaternion=createScalar([K2.zero,K2.one],K2);exports.Octonion=createScalar([K3.zero,K3.one],K3);exports.VectorSpace=require("./src/VectorSpace");exports.MatrixSpace=require("./src/MatrixSpace")})},{"./src/MatrixSpace":11,"./src/VectorSpace":12,"./src/createScalar":15,"./src/realField":19,"cayley-dickson":3,"strict-mode":9}]},{},[]);var algebra=require("algebra");var R=algebra.Real;console.log(R.add(1,2,3));var x=new R(2),y=new R(-2);var r=x.mul(y);console.log(r.data);console.log(x.data);console.log(y.data);x=x.add(3).mul(2).inv();console.log(x.data);x.equal(.1);x.notEqual(Math.PI);var R2=algebra.VectorSpace(R)(2);var v1=new R2([0,1]);var v2=new R2([1,-2]);v1=v1.add(v2);console.log(v1.data);var R3x2=algebra.MatrixSpace(R)(3,2);var m1=new R3x2([1,1,0,1,1,0]);var v3=m1.mul(v1);console.log(v3.data);var R2x2=algebra.MatrixSpace(R)(2,2);var m2=new R2x2([1,0,0,2]),m3=new R2x2([0,-1,1,0]);m2=m2.mul(m3);console.log(m2.data);console.log(m2.determinant.data);
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"algebra": "0.6.2"
}
}
<div id="log"></div>
<!-- code stolen from http://stackoverflow.com/a/20256785/1217468 -->
<script>
(function () {
var old = console.log;
var logger = document.getElementById('log');
console.log = function (message) {
if (typeof message == 'object') {
logger.innerHTML += (JSON && JSON.stringify ? JSON.stringify(message) : message) + '<br />';
} else {
logger.innerHTML += message + '<br />';
}
}
})();
</script>
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment