UNPKG

aureooms-js-integer

Version:

integer code bricks for JavaScript

75 lines (63 loc) 6.01 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports._div = _div; var _sub2 = require('../sub'); var _compare = require('../../compare'); /** * Computes quotient and remainder of two big endian arrays. * <p> * Computes quotient and remainder of two big endian arrays * using long division algorithm (the one teached in * european primary schools). * * /!\ This algorithm modifies its first operand. * * HYP : q is at least as large as r * b is not zero * * @param {int} x the radix * @param {array} r dividend and remainder * @param {int} ri r left * @param {int} rj r right * @param {array} b divisor * @param {int} bi b left * @param {int} bj b right * @param {array} q quotient, must be 0 initialized * @param {int} qi q left */ // /!\ There are implicit hypotheses // made on the size of the operands. // Should clarify. function _div(x, r, ri, rj, b, bi, bj, q, qi) { var k, t = ri + 1; do { // trim leading zeros // - maybe could try to put this procedure inside the _sub loop // - or assume that the number is trimed at the begining // and put this statement at the end of the main loop while (ri < rj && r[ri] === 0) { ++ri; } // search for a remainder block interval // greater than the divisor // - maybe could try binary search on the _lt function // for another implementation k = ri + 1; while (k <= rj && (0, _compare._lt)(r, ri, k, b, bi, bj)) { ++k; } // remainder smaller than divisor --> end if (k > rj) break; // divide current block interval by quotient do { // increment quotient block corresponding // to current ls block of remainder interval ++q[qi + k - t]; // subtract divisor from current remainder // block interval (0, _sub2._sub)(x, r, ri, k, b, bi, bj, r, ri, k); } while (!(0, _compare._lt)(r, ri, k, b, bi, bj)); } while (true); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy8xLW5ldy9hcml0aG1ldGljL2Rpdi9fZGl2LmpzIl0sIm5hbWVzIjpbIl9kaXYiLCJ4IiwiciIsInJpIiwicmoiLCJiIiwiYmkiLCJiaiIsInEiLCJxaSIsImsiLCJ0Il0sIm1hcHBpbmdzIjoiOzs7OztRQThCZ0JBLEksR0FBQUEsSTs7QUE5QmhCOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7O0FBRU8sU0FBU0EsSUFBVCxDQUFnQkMsQ0FBaEIsRUFBb0JDLENBQXBCLEVBQXdCQyxFQUF4QixFQUE2QkMsRUFBN0IsRUFBa0NDLENBQWxDLEVBQXNDQyxFQUF0QyxFQUEyQ0MsRUFBM0MsRUFBZ0RDLENBQWhELEVBQW9EQyxFQUFwRCxFQUF5RDs7QUFFL0QsS0FBSUMsQ0FBSjtBQUFBLEtBQU9DLElBQUlSLEtBQUssQ0FBaEI7O0FBRUEsSUFBRzs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQU9BLEtBQUtDLEVBQUwsSUFBV0YsRUFBRUMsRUFBRixNQUFVLENBQTVCO0FBQStCLEtBQUVBLEVBQUY7QUFBL0IsR0FORSxDQVFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0FPLE1BQUlQLEtBQUssQ0FBVDtBQUNBLFNBQU9PLEtBQUtOLEVBQUwsSUFBVyxrQkFBSUYsQ0FBSixFQUFPQyxFQUFQLEVBQVdPLENBQVgsRUFBY0wsQ0FBZCxFQUFpQkMsRUFBakIsRUFBcUJDLEVBQXJCLENBQWxCO0FBQTRDLEtBQUVHLENBQUY7QUFBNUMsR0FiRSxDQWVGO0FBQ0EsTUFBSUEsSUFBSU4sRUFBUixFQUFZOztBQUVaO0FBQ0EsS0FBRTs7QUFFRDtBQUNBO0FBQ0EsS0FBRUksRUFBRUMsS0FBS0MsQ0FBTCxHQUFTQyxDQUFYLENBQUY7O0FBRUE7QUFDQTtBQUNBLG1CQUFLVixDQUFMLEVBQVFDLENBQVIsRUFBV0MsRUFBWCxFQUFlTyxDQUFmLEVBQWtCTCxDQUFsQixFQUFxQkMsRUFBckIsRUFBeUJDLEVBQXpCLEVBQTZCTCxDQUE3QixFQUFnQ0MsRUFBaEMsRUFBb0NPLENBQXBDO0FBRUEsR0FWRCxRQVVRLENBQUMsa0JBQUlSLENBQUosRUFBT0MsRUFBUCxFQUFXTyxDQUFYLEVBQWNMLENBQWQsRUFBaUJDLEVBQWpCLEVBQXFCQyxFQUFyQixDQVZUO0FBYUEsRUFoQ0QsUUFnQ1EsSUFoQ1I7QUFrQ0EiLCJmaWxlIjoiX2Rpdi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9zdWIgfSBmcm9tICcuLi9zdWInIDtcbmltcG9ydCB7IF9sdCB9IGZyb20gJy4uLy4uL2NvbXBhcmUnIDtcblxuLyoqXG4gKiBDb21wdXRlcyBxdW90aWVudCBhbmQgcmVtYWluZGVyIG9mIHR3byBiaWcgZW5kaWFuIGFycmF5cy5cbiAqIDxwPlxuICogQ29tcHV0ZXMgcXVvdGllbnQgYW5kIHJlbWFpbmRlciBvZiB0d28gYmlnIGVuZGlhbiBhcnJheXNcbiAqIHVzaW5nIGxvbmcgZGl2aXNpb24gYWxnb3JpdGhtICh0aGUgb25lIHRlYWNoZWQgaW5cbiAqIGV1cm9wZWFuIHByaW1hcnkgc2Nob29scykuXG4gKlxuICogLyFcXCBUaGlzIGFsZ29yaXRobSBtb2RpZmllcyBpdHMgZmlyc3Qgb3BlcmFuZC5cbiAqXG4gKiBIWVAgOiBxIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHJcbiAqICAgICAgIGIgaXMgbm90IHplcm9cbiAqXG4gKiBAcGFyYW0ge2ludH0geCB0aGUgcmFkaXhcbiAqIEBwYXJhbSB7YXJyYXl9IHIgZGl2aWRlbmQgYW5kIHJlbWFpbmRlclxuICogQHBhcmFtIHtpbnR9IHJpIHIgbGVmdFxuICogQHBhcmFtIHtpbnR9IHJqIHIgcmlnaHRcbiAqIEBwYXJhbSB7YXJyYXl9IGIgZGl2aXNvclxuICogQHBhcmFtIHtpbnR9IGJpIGIgbGVmdFxuICogQHBhcmFtIHtpbnR9IGJqIGIgcmlnaHRcbiAqIEBwYXJhbSB7YXJyYXl9IHEgcXVvdGllbnQsIG11c3QgYmUgMCBpbml0aWFsaXplZFxuICogQHBhcmFtIHtpbnR9IHFpIHEgbGVmdFxuICovXG5cbi8vIC8hXFwgVGhlcmUgYXJlIGltcGxpY2l0IGh5cG90aGVzZXNcbi8vICAgICBtYWRlIG9uIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kcy5cbi8vICAgICBTaG91bGQgY2xhcmlmeS5cblxuZXhwb3J0IGZ1bmN0aW9uIF9kaXYgKCB4ICwgciAsIHJpICwgcmogLCBiICwgYmkgLCBiaiAsIHEgLCBxaSApIHtcblxuXHR2YXIgaywgdCA9IHJpICsgMTtcblxuXHRkbyB7XG5cblx0XHQvLyB0cmltIGxlYWRpbmcgemVyb3Ncblx0XHQvLyAgICAgLSBtYXliZSBjb3VsZCB0cnkgdG8gcHV0IHRoaXMgcHJvY2VkdXJlIGluc2lkZSB0aGUgX3N1YiBsb29wXG5cdFx0Ly8gICAgIC0gb3IgYXNzdW1lIHRoYXQgdGhlIG51bWJlciBpcyB0cmltZWQgYXQgdGhlIGJlZ2luaW5nXG5cdFx0Ly8gICAgICAgYW5kIHB1dCB0aGlzIHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBtYWluIGxvb3Bcblx0XHR3aGlsZSAocmkgPCByaiAmJiByW3JpXSA9PT0gMCkgKytyaTtcblxuXHRcdC8vIHNlYXJjaCBmb3IgYSByZW1haW5kZXIgYmxvY2sgaW50ZXJ2YWxcblx0XHQvLyBncmVhdGVyIHRoYW4gdGhlIGRpdmlzb3Jcblx0XHQvLyAgICAgLSBtYXliZSBjb3VsZCB0cnkgYmluYXJ5IHNlYXJjaCBvbiB0aGUgX2x0IGZ1bmN0aW9uXG5cdFx0Ly8gICAgIGZvciBhbm90aGVyIGltcGxlbWVudGF0aW9uXG5cdFx0ayA9IHJpICsgMTtcblx0XHR3aGlsZSAoayA8PSByaiAmJiBfbHQociwgcmksIGssIGIsIGJpLCBiaikpICsraztcblxuXHRcdC8vIHJlbWFpbmRlciBzbWFsbGVyIHRoYW4gZGl2aXNvciAtLT4gZW5kXG5cdFx0aWYgKGsgPiByaikgYnJlYWs7XG5cblx0XHQvLyBkaXZpZGUgY3VycmVudCBibG9jayBpbnRlcnZhbCBieSBxdW90aWVudFxuXHRcdGRve1xuXG5cdFx0XHQvLyBpbmNyZW1lbnQgcXVvdGllbnQgYmxvY2sgY29ycmVzcG9uZGluZ1xuXHRcdFx0Ly8gdG8gY3VycmVudCBscyBibG9jayBvZiByZW1haW5kZXIgaW50ZXJ2YWxcblx0XHRcdCsrcVtxaSArIGsgLSB0XTtcblxuXHRcdFx0Ly8gc3VidHJhY3QgZGl2aXNvciBmcm9tIGN1cnJlbnQgcmVtYWluZGVyXG5cdFx0XHQvLyBibG9jayBpbnRlcnZhbFxuXHRcdFx0X3N1Yih4LCByLCByaSwgaywgYiwgYmksIGJqLCByLCByaSwgayk7XG5cblx0XHR9IHdoaWxlKCFfbHQociwgcmksIGssIGIsIGJpLCBiaikpO1xuXG5cblx0fSB3aGlsZSh0cnVlKTtcblxufVxuIl19