aureooms/js-polynomial

View on GitHub
src/div/bdiv.js

Summary

Maintainability
A
1 hr
Test Coverage

/**
 * @param {number function} iszero checks if a number is 0
 * @param {number function} iadd adds two numbers in place
 * @param {number function} isubmul subtracts the multiple of a number to a number in place
 * @param {number function} izero zero number constructor, in place (to allow recycling)
 */

export function _bdiv ( iszero , iadd , isubmul , izero ) {

    /**
     * Big endian dense polynomial division.
     *
     * @param {dense polynomial array} b divisor, normalized
     * @param {dense polynomial array begin} bi
     * @param {dense polynomial array end} bj
     * @param {dense polynomial array} q quotient, initialized to zero
     * @param {dense polynomial array begin} qi
     * @param {dense polynomial array end} qj
     * @param {dense polynomial array} r remainder, initialized to dividend
     * @param {dense polynomial array begin} ri
     * @param {dense polynomial array end} rj
     */

    const bdiv = function ( b , bi , bj , q , qi , qj , r , ri , rj ) {

        var m , n , c , y ;

        m = rj - ri ;
        n = bj - bi ;

        for ( ; m >= n ; ++ri , --m ) {

            if ( iszero( r[ri] ) ) {
                ++ri ;
                --m ;
                continue ;
            }

            // b fits r[ri] times in r
            // we add r[ri] * x^(m-n) to q

            q[qj-m+n] = iadd( q[qj-m+n] , r[ri] ) ;

            for ( i = 1 ; i < n ; ++i ) {
                r[ri+i] = isubmul( r[ri+i] , b[bi+i] , r[ri] ) ;
            }

            // leading coefficient set to zero

            r[ri] = izero( r[ri] ) ;

        }

    } ;

}