7#ifndef _MINISKETCH_LINTRANS_H_ 
    8#define _MINISKETCH_LINTRANS_H_ 
   13template<
int N> 
struct Num {};
 
   24    constexpr LinTrans(I a, I b, I c) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c)} {}
 
   25    constexpr LinTrans(I a, I b, I c, I d) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c), I(d), I(a ^ d), I(b ^ d), I(a ^ b ^ d), I(c ^ d), I(a ^ c ^ d), I(b ^ c ^ d), I(a ^ b ^ c ^ d)} {}
 
   26    constexpr LinTrans(I a, I b, I c, I d, I e) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c), I(d), I(a ^ d), I(b ^ d), I(a ^ b ^ d), I(c ^ d), I(a ^ c ^ d), I(b ^ c ^ d), I(a ^ b ^ c ^ d), I(e), I(a ^ e), I(b ^ e), I(a ^ b ^ e), I(c ^ e), I(a ^ c ^ e), I(b ^ c ^ e), I(a ^ b ^ c ^ e), I(d ^ e), I(a ^ d ^ e), I(b ^ d ^ e), I(a ^ b ^ d ^ e), I(c ^ d ^ e), I(a ^ c ^ d ^ e), I(b ^ c ^ d ^ e), I(a ^ b ^ c ^ d ^ e)} {}
 
   27    constexpr LinTrans(I a, I b, I c, I d, I e, I f) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c), I(d), I(a ^ d), I(b ^ d), I(a ^ b ^ d), I(c ^ d), I(a ^ c ^ d), I(b ^ c ^ d), I(a ^ b ^ c ^ d), I(e), I(a ^ e), I(b ^ e), I(a ^ b ^ e), I(c ^ e), I(a ^ c ^ e), I(b ^ c ^ e), I(a ^ b ^ c ^ e), I(d ^ e), I(a ^ d ^ e), I(b ^ d ^ e), I(a ^ b ^ d ^ e), I(c ^ d ^ e), I(a ^ c ^ d ^ e), I(b ^ c ^ d ^ e), I(a ^ b ^ c ^ d ^ e), I(f), I(a ^ f), I(b^ f), I(a ^ b ^ f), I(c^ f), I(a ^ c ^ f), I(b ^ c ^ f), I(a ^ b ^ c ^ f), I(d ^ f), I(a ^ d ^ f), I(b ^ d ^ f), I(a ^ b ^ d ^ f), I(c ^ d ^ f), I(a ^ c ^ d ^ f), I(b ^ c ^ d ^ f), I(a ^ b ^ c ^ d ^ f), I(e ^ f), I(a ^ e ^ f), I(b ^ e ^ f), I(a ^ b ^ e ^ f), I(c ^ e ^ f), I(a ^ c ^ e ^ f), I(b ^ c ^ e ^ f), I(a ^ b ^ c ^ e ^ f), I(d ^ e ^ f), I(a ^ d ^ e ^ f), I(b ^ d ^ e ^ f), I(a ^ b ^ d ^ e ^ f), I(c ^ d ^ e ^ f), I(a ^ c ^ d ^ e ^ f), I(b ^ c ^ d ^ e ^ f), I(a ^ b ^ c ^ d ^ e ^ f)} {}
 
   28    constexpr LinTrans(I a, I b, I c, I d, I e, I f, I 
g) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c), I(d), I(a ^ d), I(b ^ d), I(a ^ b ^ d), I(c ^ d), I(a ^ c ^ d), I(b ^ c ^ d), I(a ^ b ^ c ^ d), I(e), I(a ^ e), I(b ^ e), I(a ^ b ^ e), I(c ^ e), I(a ^ c ^ e), I(b ^ c ^ e), I(a ^ b ^ c ^ e), I(d ^ e), I(a ^ d ^ e), I(b ^ d ^ e), I(a ^ b ^ d ^ e), I(c ^ d ^ e), I(a ^ c ^ d ^ e), I(b ^ c ^ d ^ e), I(a ^ b ^ c ^ d ^ e), I(f), I(a ^ f), I(b^ f), I(a ^ b ^ f), I(c^ f), I(a ^ c ^ f), I(b ^ c ^ f), I(a ^ b ^ c ^ f), I(d ^ f), I(a ^ d ^ f), I(b ^ d ^ f), I(a ^ b ^ d ^ f), I(c ^ d ^ f), I(a ^ c ^ d ^ f), I(b ^ c ^ d ^ f), I(a ^ b ^ c ^ d ^ f), I(e ^ f), I(a ^ e ^ f), I(b ^ e ^ f), I(a ^ b ^ e ^ f), I(c ^ e ^ f), I(a ^ c ^ e ^ f), I(b ^ c ^ e ^ f), I(a ^ b ^ c ^ e ^ f), I(d ^ e ^ f), I(a ^ d ^ e ^ f), I(b ^ d ^ e ^ f), I(a ^ b ^ d ^ e ^ f), I(c ^ d ^ e ^ f), I(a ^ c ^ d ^ e ^ f), I(b ^ c ^ d ^ e ^ f), I(a ^ b ^ c ^ d ^ e ^ f), I(
g), I(a ^ 
g), I(b ^ 
g), I(a ^ b ^ 
g), I(c ^ 
g), I(a ^ c ^ 
g), I(b ^ c ^ 
g), I(a ^ b ^ c ^ 
g), I(d ^ 
g), I(a ^ d ^ 
g), I(b ^ d ^ 
g), I(a ^ b ^ d ^ 
g), I(c ^ d ^ 
g), I(a ^ c ^ d ^ 
g), I(b ^ c ^ d ^ 
g), I(a ^ b ^ c ^ d ^ 
g), I(e ^ 
g), I(a ^ e ^ 
g), I(b ^ e ^ 
g), I(a ^ b ^ e ^ 
g), I(c ^ e ^ 
g), I(a ^ c ^ e ^ 
g), I(b ^ c ^ e ^ 
g), I(a ^ b ^ c ^ e ^ 
g), I(d ^ e ^ 
g), I(a ^ d ^ e ^ 
g), I(b ^ d ^ e ^ 
g), I(a ^ b ^ d ^ e ^ 
g), I(c ^ d ^ e ^ 
g), I(a ^ c ^ d ^ e ^ 
g), I(b ^ c ^ d ^ e ^ 
g), I(a ^ b ^ c ^ d ^ e ^ 
g), I(f ^ 
g), I(a ^ f ^ 
g), I(b^ f ^ 
g), I(a ^ b ^ f ^ 
g), I(c^ f ^ 
g), I(a ^ c ^ f ^ 
g), I(b ^ c ^ f ^ 
g), I(a ^ b ^ c ^ f ^ 
g), I(d ^ f ^ 
g), I(a ^ d ^ f ^ 
g), I(b ^ d ^ f ^ 
g), I(a ^ b ^ d ^ f ^ 
g), I(c ^ d ^ f ^ 
g), I(a ^ c ^ d ^ f ^ 
g), I(b ^ c ^ d ^ f ^ 
g), I(a ^ b ^ c ^ d ^ f ^ 
g), I(e ^ f ^ 
g), I(a ^ e ^ f ^ 
g), I(b ^ e ^ f ^ 
g), I(a ^ b ^ e ^ f ^ 
g), I(c ^ e ^ f ^ 
g), I(a ^ c ^ e ^ f ^ 
g), I(b ^ c ^ e ^ f ^ 
g), I(a ^ b ^ c ^ e ^ f ^ 
g), I(d ^ e ^ f ^ 
g), I(a ^ d ^ e ^ f ^ 
g), I(b ^ d ^ e ^ f ^ 
g), I(a ^ b ^ d ^ e ^ f ^ 
g), I(c ^ d ^ e ^ f ^ 
g), I(a ^ c ^ d ^ e ^ f ^ 
g), I(b ^ c ^ d ^ e ^ f ^ 
g), I(a ^ b ^ c ^ d ^ e ^ f ^ 
g)} {}
 
   29    constexpr LinTrans(I a, I b, I c, I d, I e, I f, I 
g, I h) : 
table{I(0), I(a), I(b), I(a ^ b), I(c), I(a ^ c), I(b ^ c), I(a ^ b ^ c), I(d), I(a ^ d), I(b ^ d), I(a ^ b ^ d), I(c ^ d), I(a ^ c ^ d), I(b ^ c ^ d), I(a ^ b ^ c ^ d), I(e), I(a ^ e), I(b ^ e), I(a ^ b ^ e), I(c ^ e), I(a ^ c ^ e), I(b ^ c ^ e), I(a ^ b ^ c ^ e), I(d ^ e), I(a ^ d ^ e), I(b ^ d ^ e), I(a ^ b ^ d ^ e), I(c ^ d ^ e), I(a ^ c ^ d ^ e), I(b ^ c ^ d ^ e), I(a ^ b ^ c ^ d ^ e), I(f), I(a ^ f), I(b^ f), I(a ^ b ^ f), I(c^ f), I(a ^ c ^ f), I(b ^ c ^ f), I(a ^ b ^ c ^ f), I(d ^ f), I(a ^ d ^ f), I(b ^ d ^ f), I(a ^ b ^ d ^ f), I(c ^ d ^ f), I(a ^ c ^ d ^ f), I(b ^ c ^ d ^ f), I(a ^ b ^ c ^ d ^ f), I(e ^ f), I(a ^ e ^ f), I(b ^ e ^ f), I(a ^ b ^ e ^ f), I(c ^ e ^ f), I(a ^ c ^ e ^ f), I(b ^ c ^ e ^ f), I(a ^ b ^ c ^ e ^ f), I(d ^ e ^ f), I(a ^ d ^ e ^ f), I(b ^ d ^ e ^ f), I(a ^ b ^ d ^ e ^ f), I(c ^ d ^ e ^ f), I(a ^ c ^ d ^ e ^ f), I(b ^ c ^ d ^ e ^ f), I(a ^ b ^ c ^ d ^ e ^ f), I(
g), I(a ^ 
g), I(b ^ 
g), I(a ^ b ^ 
g), I(c ^ 
g), I(a ^ c ^ 
g), I(b ^ c ^ 
g), I(a ^ b ^ c ^ 
g), I(d ^ 
g), I(a ^ d ^ 
g), I(b ^ d ^ 
g), I(a ^ b ^ d ^ 
g), I(c ^ d ^ 
g), I(a ^ c ^ d ^ 
g), I(b ^ c ^ d ^ 
g), I(a ^ b ^ c ^ d ^ 
g), I(e ^ 
g), I(a ^ e ^ 
g), I(b ^ e ^ 
g), I(a ^ b ^ e ^ 
g), I(c ^ e ^ 
g), I(a ^ c ^ e ^ 
g), I(b ^ c ^ e ^ 
g), I(a ^ b ^ c ^ e ^ 
g), I(d ^ e ^ 
g), I(a ^ d ^ e ^ 
g), I(b ^ d ^ e ^ 
g), I(a ^ b ^ d ^ e ^ 
g), I(c ^ d ^ e ^ 
g), I(a ^ c ^ d ^ e ^ 
g), I(b ^ c ^ d ^ e ^ 
g), I(a ^ b ^ c ^ d ^ e ^ 
g), I(f ^ 
g), I(a ^ f ^ 
g), I(b^ f ^ 
g), I(a ^ b ^ f ^ 
g), I(c^ f ^ 
g), I(a ^ c ^ f ^ 
g), I(b ^ c ^ f ^ 
g), I(a ^ b ^ c ^ f ^ 
g), I(d ^ f ^ 
g), I(a ^ d ^ f ^ 
g), I(b ^ d ^ f ^ 
g), I(a ^ b ^ d ^ f ^ 
g), I(c ^ d ^ f ^ 
g), I(a ^ c ^ d ^ f ^ 
g), I(b ^ c ^ d ^ f ^ 
g), I(a ^ b ^ c ^ d ^ f ^ 
g), I(e ^ f ^ 
g), I(a ^ e ^ f ^ 
g), I(b ^ e ^ f ^ 
g), I(a ^ b ^ e ^ f ^ 
g), I(c ^ e ^ f ^ 
g), I(a ^ c ^ e ^ f ^ 
g), I(b ^ c ^ e ^ f ^ 
g), I(a ^ b ^ c ^ e ^ f ^ 
g), I(d ^ e ^ f ^ 
g), I(a ^ d ^ e ^ f ^ 
g), I(b ^ d ^ e ^ f ^ 
g), I(a ^ b ^ d ^ e ^ f ^ 
g), I(c ^ d ^ e ^ f ^ 
g), I(a ^ c ^ d ^ e ^ f ^ 
g), I(b ^ c ^ d ^ e ^ f ^ 
g), I(a ^ b ^ c ^ d ^ e ^ f ^ 
g), I(h), I(a ^ h), I(b ^ h), I(a ^ b ^ h), I(c ^ h), I(a ^ c ^ h), I(b ^ c ^ h), I(a ^ b ^ c ^ h), I(d ^ h), I(a ^ d ^ h), I(b ^ d ^ h), I(a ^ b ^ d ^ h), I(c ^ d ^ h), I(a ^ c ^ d ^ h), I(b ^ c ^ d ^ h), I(a ^ b ^ c ^ d ^ h), I(e ^ h), I(a ^ e ^ h), I(b ^ e ^ h), I(a ^ b ^ e ^ h), I(c ^ e ^ h), I(a ^ c ^ e ^ h), I(b ^ c ^ e ^ h), I(a ^ b ^ c ^ e ^ h), I(d ^ e ^ h), I(a ^ d ^ e ^ h), I(b ^ d ^ e ^ h), I(a ^ b ^ d ^ e ^ h), I(c ^ d ^ e ^ h), I(a ^ c ^ d ^ e ^ h), I(b ^ c ^ d ^ e ^ h), I(a ^ b ^ c ^ d ^ e ^ h), I(f ^ h), I(a ^ f ^ h), I(b^ f ^ h), I(a ^ b ^ f ^ h), I(c^ f ^ h), I(a ^ c ^ f ^ h), I(b ^ c ^ f ^ h), I(a ^ b ^ c ^ f ^ h), I(d ^ f ^ h), I(a ^ d ^ f ^ h), I(b ^ d ^ f ^ h), I(a ^ b ^ d ^ f ^ h), I(c ^ d ^ f ^ h), I(a ^ c ^ d ^ f ^ h), I(b ^ c ^ d ^ f ^ h), I(a ^ b ^ c ^ d ^ f ^ h), I(e ^ f ^ h), I(a ^ e ^ f ^ h), I(b ^ e ^ f ^ h), I(a ^ b ^ e ^ f ^ h), I(c ^ e ^ f ^ h), I(a ^ c ^ e ^ f ^ h), I(b ^ c ^ e ^ f ^ h), I(a ^ b ^ c ^ e ^ f ^ h), I(d ^ e ^ f ^ h), I(a ^ d ^ e ^ f ^ h), I(b ^ d ^ e ^ f ^ h), I(a ^ b ^ d ^ e ^ f ^ h), I(c ^ d ^ e ^ f ^ h), I(a ^ c ^ d ^ e ^ f ^ h), I(b ^ c ^ d ^ e ^ f ^ h), I(a ^ b ^ c ^ d ^ e ^ f ^ h), I(
g ^ h), I(a ^ 
g ^ h), I(b ^ 
g ^ h), I(a ^ b ^ 
g ^ h), I(c ^ 
g ^ h), I(a ^ c ^ 
g ^ h), I(b ^ c ^ 
g ^ h), I(a ^ b ^ c ^ 
g ^ h), I(d ^ 
g ^ h), I(a ^ d ^ 
g ^ h), I(b ^ d ^ 
g ^ h), I(a ^ b ^ d ^ 
g ^ h), I(c ^ d ^ 
g ^ h), I(a ^ c ^ d ^ 
g ^ h), I(b ^ c ^ d ^ 
g ^ h), I(a ^ b ^ c ^ d ^ 
g ^ h), I(e ^ 
g ^ h), I(a ^ e ^ 
g ^ h), I(b ^ e ^ 
g ^ h), I(a ^ b ^ e ^ 
g ^ h), I(c ^ e ^ 
g ^ h), I(a ^ c ^ e ^ 
g ^ h), I(b ^ c ^ e ^ 
g ^ h), I(a ^ b ^ c ^ e ^ 
g ^ h), I(d ^ e ^ 
g ^ h), I(a ^ d ^ e ^ 
g ^ h), I(b ^ d ^ e ^ 
g ^ h), I(a ^ b ^ d ^ e ^ 
g ^ h), I(c ^ d ^ e ^ 
g ^ h), I(a ^ c ^ d ^ e ^ 
g ^ h), I(b ^ c ^ d ^ e ^ 
g ^ h), I(a ^ b ^ c ^ d ^ e ^ 
g ^ h), I(f ^ 
g ^ h), I(a ^ f ^ 
g ^ h), I(b^ f ^ 
g ^ h), I(a ^ b ^ f ^ 
g ^ h), I(c^ f ^ 
g ^ h), I(a ^ c ^ f ^ 
g ^ h), I(b ^ c ^ f ^ 
g ^ h), I(a ^ b ^ c ^ f ^ 
g ^ h), I(d ^ f ^ 
g ^ h), I(a ^ d ^ f ^ 
g ^ h), I(b ^ d ^ f ^ 
g ^ h), I(a ^ b ^ d ^ f ^ 
g ^ h), I(c ^ d ^ f ^ 
g ^ h), I(a ^ c ^ d ^ f ^ 
g ^ h), I(b ^ c ^ d ^ f ^ 
g ^ h), I(a ^ b ^ c ^ d ^ f ^ 
g ^ h), I(e ^ f ^ 
g ^ h), I(a ^ e ^ f ^ 
g ^ h), I(b ^ e ^ f ^ 
g ^ h), I(a ^ b ^ e ^ f ^ 
g ^ h), I(c ^ e ^ f ^ 
g ^ h), I(a ^ c ^ e ^ f ^ 
g ^ h), I(b ^ c ^ e ^ f ^ 
g ^ h), I(a ^ b ^ c ^ e ^ f ^ 
g ^ h), I(d ^ e ^ f ^ 
g ^ h), I(a ^ d ^ e ^ f ^ 
g ^ h), I(b ^ d ^ e ^ f ^ 
g ^ h), I(a ^ b ^ d ^ e ^ f ^ 
g ^ h), I(c ^ d ^ e ^ f ^ 
g ^ h), I(a ^ c ^ d ^ e ^ f ^ 
g ^ h), I(b ^ c ^ d ^ e ^ f ^ 
g ^ h), I(a ^ b ^ c ^ d ^ e ^ f ^ 
g ^ h)} {}
 
   38    constexpr LinTrans(
const I* p, 
Num<8>) : 
LinTrans(I(p[0]), I(p[1]), I(p[2]), I(p[3]), I(p[4]), I(p[5]), I(p[6]), I(p[7])) {}
 
   40    template<I (*F)(const I&)>
 
   47    template<I (*F)(const I&)>
 
   55    template<I (*F)(const I&)>
 
   63    template<I (*F)(const I&)>
 
   66        I b = F(a), c = F(b), d = F(c);
 
   72    template<I (*F)(const I&)>
 
   75        I b = F(a), c = F(b), d = F(c), e = F(d);
 
   79        table[24] = d ^ e; 
table[25] = a ^ d ^ e; 
table[26] = b ^ d ^ e; 
table[27] = a ^ b ^ d ^ e; 
table[28] = c ^ d ^ e; 
table[29] = a ^ c ^ d ^ e; 
table[30] = b ^ c ^ d ^ e; 
table[31] = a ^ b ^ c ^ d ^ e;
 
   83    template<I (*F)(const I&)>
 
   86        I b = F(a), c = F(b), d = F(c), e = F(d), f = F(e);
 
   90        table[24] = d ^ e; 
table[25] = a ^ d ^ e; 
table[26] = b ^ d ^ e; 
table[27] = a ^ b ^ d ^ e; 
table[28] = c ^ d ^ e; 
table[29] = a ^ c ^ d ^ e; 
table[30] = b ^ c ^ d ^ e; 
table[31] = a ^ b ^ c ^ d ^ e;
 
   92        table[40] = d ^ f; 
table[41] = a ^ d ^ f; 
table[42] = b ^ d ^ f; 
table[43] = a ^ b ^ d ^ f; 
table[44] = c ^ d ^ f; 
table[45] = a ^ c ^ d ^ f; 
table[46] = b ^ c ^ d ^ f; 
table[47] = a ^ b ^ c ^ d ^ f;
 
   93        table[48] = e ^ f; 
table[49] = a ^ e ^ f; 
table[50] = b ^ e ^ f; 
table[51] = a ^ b ^ e ^ f; 
table[52] = c ^ e ^ f; 
table[53] = a ^ c ^ e ^ f; 
table[54] = b ^ c ^ e ^ f; 
table[55] = a ^ b ^ c ^ e ^ f;
 
   94        table[56] = d ^ e ^ f; 
table[57] = a ^ d ^ e ^ f; 
table[58] = b ^ d ^ e ^ f; 
table[59] = a ^ b ^ d ^ e ^ f; 
table[60] = c ^ d ^ e ^ f; 
table[61] = a ^ c ^ d ^ e ^ f; 
table[62] = b ^ c ^ d ^ e ^ f; 
table[63] = a ^ b ^ c ^ d ^ e ^ f;
 
   98    template<
typename O, 
int P>
 
   99    inline I 
constexpr Map(I a)
 const { 
return table[O::template MidBits<P, N>(a)]; }
 
  101    template<
typename O, 
int P>
 
  102    inline I 
constexpr TopMap(I a)
 const { 
static_assert(P + N == O::SIZE, 
"TopMap inconsistency"); 
return table[O::template TopBits<N>(a)]; }
 
  112    static constexpr int BITS = N;
 
  117    template<
typename O, 
int P = 0>
 
  118    inline I 
constexpr Map(I a)
 const { 
return trans.template TopMap<O, P>(a); }
 
  120    template<I (*F)(const I&)>
 
  133    template<
typename O, 
int P = 0>
 
  134    inline I 
constexpr Map(I a)
 const { 
return trans.template Map<O, P>(a) ^ rec.template Map<O, P + N>(a); }
 
  136    template<I (*F)(const I&)>
 
  137    inline void Build(I a) { I n = trans.template Build<F>(
Num<N>(), a); rec.template Build<F>(F(n)); }
 
  143    template<
typename O, 
typename I>
 
  144    inline I 
constexpr Map(I a)
 const { 
return a; }
 
The identity transformation.
 
I constexpr Map(I a) const
 
A Linear N-bit transformation over the field I.
 
constexpr LinTrans(const I *p, Num< 7 >)
 
constexpr LinTrans(I a, I b)
 
I constexpr TopMap(I a) const
 
constexpr LinTrans(I a, I b, I c, I d, I e, I f, I g)
 
I constexpr Map(I a) const
 
constexpr LinTrans(const I *p, Num< 5 >)
 
constexpr LinTrans(I a, I b, I c)
 
constexpr LinTrans(I a, I b, I c, I d, I e, I f, I g, I h)
 
constexpr LinTrans(const I *p, Num< 3 >)
 
constexpr LinTrans(I a, I b, I c, I d)
 
constexpr LinTrans(const I *p, Num< 6 >)
 
constexpr LinTrans(I a, I b, I c, I d, I e)
 
constexpr LinTrans(I a, I b, I c, I d, I e, I f)
 
constexpr LinTrans(const I *p, Num< 4 >)
 
constexpr LinTrans(const I *p, Num< 8 >)
 
constexpr LinTrans(const I *p, Num< 2 >)
 
constexpr RecLinTrans()=default
 
I constexpr Map(I a) const
 
RecLinTrans< I, X... > rec
 
constexpr RecLinTrans(const I(&init)[BITS])
 
constexpr RecLinTrans(const I *p, Num< BITS >)
 
I constexpr Map(I a) const
 
constexpr RecLinTrans(const I(&init)[BITS])
 
constexpr RecLinTrans()=default
 
constexpr RecLinTrans(const I *p, Num< BITS >)
 
A linear transformation constructed using LinTrans tables for sections of bits.
 
constexpr IdTrans ID_TRANS
A singleton for the identity transformation.
 
A type to represent integers in the type system.