123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- var BufferUtil = require('../utils/buffer')
- var GF = require('./galois-field')
- /**
- * Multiplies two polynomials inside Galois Field
- *
- * @param {Buffer} p1 Polynomial
- * @param {Buffer} p2 Polynomial
- * @return {Buffer} Product of p1 and p2
- */
- exports.mul = function mul (p1, p2) {
- var coeff = BufferUtil.alloc(p1.length + p2.length - 1)
- for (var i = 0; i < p1.length; i++) {
- for (var j = 0; j < p2.length; j++) {
- coeff[i + j] ^= GF.mul(p1[i], p2[j])
- }
- }
- return coeff
- }
- /**
- * Calculate the remainder of polynomials division
- *
- * @param {Buffer} divident Polynomial
- * @param {Buffer} divisor Polynomial
- * @return {Buffer} Remainder
- */
- exports.mod = function mod (divident, divisor) {
- var result = BufferUtil.from(divident)
- while ((result.length - divisor.length) >= 0) {
- var coeff = result[0]
- for (var i = 0; i < divisor.length; i++) {
- result[i] ^= GF.mul(divisor[i], coeff)
- }
- // remove all zeros from buffer head
- var offset = 0
- while (offset < result.length && result[offset] === 0) offset++
- result = result.slice(offset)
- }
- return result
- }
- /**
- * Generate an irreducible generator polynomial of specified degree
- * (used by Reed-Solomon encoder)
- *
- * @param {Number} degree Degree of the generator polynomial
- * @return {Buffer} Buffer containing polynomial coefficients
- */
- exports.generateECPolynomial = function generateECPolynomial (degree) {
- var poly = BufferUtil.from([1])
- for (var i = 0; i < degree; i++) {
- poly = exports.mul(poly, [1, GF.exp(i)])
- }
- return poly
- }
|