LCM in js - for col processing
by Ben Clayton
HTML
<h3>Multicol Migration Algolrythme</h3>
<div id="op"></div><br/>
CSS
div {display:inline-block;margin-left:30px;}
.exp {color:red;}
JavaScript
function lcm_pair_mult(x,y){
//debugger;
var m1=1;
var m2=1;
while ( (m1+m2) < 10000 ){// spinout safety
console.log( (x*m1) , (y*m2), Math.abs( (x*m1) - (y*m2) ) );
// tolerance , end early if close
if( Math.abs( (x*m1) - (y*m2) ) < ( (x*m1)/40 ) ){
return m1;
}
if ( (x*m1) < (y*m2) ){ // x smaller so up its multiplier
m1++;
}else if ( (x*m1) > (y*m2) ){ // y smaller so up its multiplier
m2++;
}else{
return m1;
}
}
return 0
}
function lcm(arr){
var k = 0;
var a = arr[k++];
while ( k < arr.length ){
var m = lcm_pair_mult(a,arr[k]);
a *= m;
k++;
}
return a; // return lcm
}
function test(cols,expect){
var ans = lcm(cols);
var mcols = [];
var gcols = [];
for (var i=0;i < cols.length ; i++){
mcols[i] = parseInt( (ans / cols[i])+0.5 , 10);
}
for (var i=0;i < cols.length ; i++){
gcols[i] = ans / parseInt( (ans / cols[i])+0.5 , 10);
}
var op = $('#op').html();
op +="<hr>Percent Cols: " + cols.map(function(v){return v+'%'}).join(', ') + "<br/>";
op +="LCM: " + ans + "<br/>";
op +="Multiples: " + mcols.join(', ') + "<br/>";
op +="New Grid Cols: " + gcols.join(', ') + "<br/><br/>";
op +="Expected: <span class='exp'>" + expect+ "</span><br/><br/>";
$('#op').html(op)
}
test([33.33,66.66,33.33],"1,2,1");
test([20,60,10,10],"2,6,1,1");