package jscl.math.polynomial;

import jscl.math.Variable;

class DefinedBooleanMonomial extends BooleanMonomial {
    DefinedBooleanMonomial(Variable unknown[], Ordering ordering) {
        super(unknown, ordering);
    }

    DefinedBooleanMonomial(int length, Variable unknown[], Ordering ordering) {
        super(length, unknown, ordering);
    }

    public Monomial multiply(Monomial monomial) {
        Monomial m = newinstance();
        for (int i = 0; i < unknown.length; i++) {
            int q = i >> log2p;
            int r = (i & pmask) << log2n;
            int a = (element[q] >> r) & nmask;
            int b = (monomial.element[q] >> r) & nmask;
            int c = a + b;
            if (c > 1) c = 1;
            m.element[q] |= c << r;
            m.degree += c;
        }
        return m;
    }

    protected Monomial newinstance() {
        return new DefinedBooleanMonomial(element.length, unknown, ordering);
    }
}
