JavaScript
var s = [100,100,5,100,100,100,100,100,100,100,100,100,100];
var M = [ [83,0,0,-7,0,0,-1], [64,0,0,0,0,0,0], [0,19,0,-15,0,-16,1], [28,0,0,-18,0,0,0], [0,45,0,-86,0,0,0], [0,33,0,0,0,-8,0], [0,0,12,0,0,-16,0], [0,0,52,0,0,-40,0], [0,0,0,0,64,0,0], [0,0,0,23,-17,0,0], [0,0,0,0,0,81,0], [0,0,0,0,5,0,0], [-10,-94,-118,-40,-14,-44,78] ];
function findScalingFactor ( n, v ) {
var p = m = 0, f = null, r = [];
for ( let j in v ) {
if ( v[j] > 0 ) { p += v[j]; }
else if ( v[j] < 0 ) { m += v[j]; r.push(j) }
}
if ( Math.abs(m) > p + n ) {
f = ( p + n ) / Math.abs(m);
console.log(v)
console.log(m)
console.log(p)
console.log(n)
console.log(f)
console.log(r)
return {'f': f, 'r': r};
} else {
return {'f': null};
}
}
function scaleRows ( M, f ) {
for ( let i in M ) {
for ( let j in M[i] ) {
if ( f.r.indexOf(j) !== -1 ) {
M[i][j] *= f.f;
}
}
}
console.log(M)
}
function scale ( s, M ) {
var scaled = false;
for ( let i in M ) {
var f = findScalingFactor ( s[i], M[i] );
if ( f.f !== null ) {
scaleRows ( M, f );
scaled = true;
}
}
console.log(scaled);
return scaled;
}
function add ( s, M ) {
for ( let i in M ) {
for ( let j in M[i] ) {
s[i] += M[i][j];
}
}
return s;
}
while ( true ) {
console.log(M);
if ( !scale( s, M ) ){
var r = add( s, M );
console.log(r);
break;
}
}