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");