+#----- Binary polynomials ---------------------------------------------------
+
+package Catacomb::GF;
+use Carp;
+
+@ISA = qw(Catacomb::MP);
+
+use overload
+ '+' => sub { _binop(\&add, @_); },
+ '-' => sub { _binop(\&add, @_); },
+ '*' => sub { _binop(\&mul, @_); },
+ '/' => sub { _binop(\&div, @_); },
+ '%' => sub { _binop(\&mod, @_); },
+ '&' => sub { _binop(\&Catacomb::MP::and, @_); },
+ '|' => sub { _binop(\&Catacomb::MP::or, @_); },
+ '^' => sub { _binop(\&Catacomb::MP::xor, @_); },
+ '>>' => sub { &Catacomb::MP::lsr(@_[0, 1]); },
+ '<<' => sub { &Catacomb::MP::lsl(@_[0, 1]); },
+ '~' => sub { &Catacomb::MP::not($_[0]) },
+ '==' => sub { _binop(\&Catacomb::MP::eq, @_); },
+ '<=>' => sub { _binop(\&Catacomb::MP::cmp, @_); },
+ '""' => sub { "0x" . &Catacomb::MP::tostring($_[0], 16); },
+ 'neg' => sub { $_[0]; },
+ '0+' => sub { &Catacomb::MP::toint($_[0]); };
+
+sub mod { (&div($_[0], $_[1]))[1]; }
+
+sub _binop {
+ my ($func, $a, $b, $flag) = @_;
+ return $flag ? &$func($b, $a) : &$func($a, $b);
+}
+