BRP BRP::operator*(const BRP &other) const { // other _must_ be a monomial if(other == 0) { std::cout << "Multiplication by 0" << std::endl; return BRP(); } else { brMonomial mono = *(other.m.begin()); return (*this) * mono; } }
// write f as f = ax+b, return b BRP BRP::remainder(const BRP &x) const { monomials tmp; monomials::const_iterator end = m.end(); brMonomial xx = x.LT(); for(monomials::const_iterator it = m.begin(); it != end; it++) { brMonomial mono = *it; if ( !isDivisibleBy(mono, xx ) ) { tmp.push_back(mono); // don't remove doubles, there shouldn't be any } } return BRP(tmp); }
// compute S polynomial for a pair BRP sPolynomial(const Pair &pair, const IntermediateBasis &F, int n) { FunctionPair fp = FunctionPair(pair, F, n); if (!fp.good) { return BRP(); } if (pair.i < 0 ) { // fp.g = x_i // f = ax + b BRP b = (fp.f)->remainder(*fp.g); return b * *fp.g + b; } brMonomial f = fp.f->LT(); brMonomial g = fp.g->LT(); brMonomial lcm = f | g; return *fp.f * (lcm ^ f ) + *fp.g * ( lcm ^ g ); }
// i < j FunctionPair(const Pair &pair, const IntermediateBasis &F, int n ) { int i = pair.i; int j = pair.j; IntermediateBasis::const_iterator end = F.end(); if(F.find(j) == end || (i >= 0 && F.find(i) == end)) { good = false; } else { good = true; if(i < 0) { // working with field polynomial, generate x_(-i) //g = BRP( 1 << n-(-i) ); fieldpolynomial = BRP( 1 << n-(-i) ); g = &fieldpolynomial; } else { g = &F.find(i) ->second; } f = &F.find(j) ->second; } }
#define BR(a,b) \ B0, OpX6BtypePaWhaDPr (0, 0x20, 0, a, 0, b, 0), {B2}, PSEUDO, 0, NULL {"br.few", BR (0, 0)}, {"br", BR (0, 0)}, {"br.few.clr", BR (0, 1)}, {"br.clr", BR (0, 1)}, {"br.many", BR (1, 0)}, {"br.many.clr", BR (1, 1)}, #undef BR #define BR(a,b,c,d,e) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, EMPTY #define BRP(a,b,c,d,e) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, PSEUDO, 0, NULL #define BRT(a,b,c,d,e,f) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, f, 0, NULL {"br.cond.sptk.few", BR (0x20, 0, 0, 0, 0)}, {"br.cond.sptk", BRP (0x20, 0, 0, 0, 0)}, {"br.cond.sptk.few.clr", BR (0x20, 0, 0, 0, 1)}, {"br.cond.sptk.clr", BRP (0x20, 0, 0, 0, 1)}, {"br.cond.spnt.few", BR (0x20, 0, 0, 1, 0)}, {"br.cond.spnt", BRP (0x20, 0, 0, 1, 0)}, {"br.cond.spnt.few.clr", BR (0x20, 0, 0, 1, 1)}, {"br.cond.spnt.clr", BRP (0x20, 0, 0, 1, 1)}, {"br.cond.dptk.few", BR (0x20, 0, 0, 2, 0)}, {"br.cond.dptk", BRP (0x20, 0, 0, 2, 0)}, {"br.cond.dptk.few.clr", BR (0x20, 0, 0, 2, 1)}, {"br.cond.dptk.clr", BRP (0x20, 0, 0, 2, 1)}, {"br.cond.dpnt.few", BR (0x20, 0, 0, 3, 0)}, {"br.cond.dpnt", BRP (0x20, 0, 0, 3, 0)}, {"br.cond.dpnt.few.clr", BR (0x20, 0, 0, 3, 1)}, {"br.cond.dpnt.clr", BRP (0x20, 0, 0, 3, 1)}, {"br.cond.sptk.many", BR (0x20, 0, 1, 0, 0)},