7#ifndef _MINISKETCH_LINTRANS_H_
8#define _MINISKETCH_LINTRANS_H_
13template<
int N>
struct Num {};
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)} {}
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);
83 template<I (*F)(const I&)>
98 template<
typename O,
int P>
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>
120 template<I (*F)(const I&)>
133 template<
typename O,
int P = 0>
136 template<I (*F)(const I&)>
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.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.