Module infotheo.lib.f2
From mathcomp Require Import all_ssreflect fingroup perm ssralg zmodp.From mathcomp Require Import matrix mxalgebra poly polydiv mxpoly.
# Lemmas about $\mathbb{F}_2$
```
F2_of_bool b == coercion from bool to 'F_2
bool_of_F2 x == boolean corresponding to x : 'F_2
negF2 x == boolean negation over 'F_2
```
Set Implicit Arguments.
Set SsrOldRewriteGoalsOrder.
Unset Strict Implicit.
Import Prenex Implicits.
Import GRing.Theory.
Local Open Scope ring_scope.
Section AboutF2.
Coercion
F2_of_bool
(b : bool) : 'F_2 := if b then 1 else 0.F2_of_bool not a defined object.
Implicit Type x y : 'F_2.
Definition
bool_of_F2
x : bool := x != 0.bool_of_F2 not a defined object.
Definition
negF2
x : 'F_2 := x == 0.negF2 not a defined object.
Lemma F2_0_1 x : x = (x != 0).
Proof.
Lemma F2_eq1 x : (x == 1) = (x != 0).
Proof.
Lemma F2_eq0 x : (x == 0) = (x != 1).
Proof.
CoInductive F2_spec : 'F_2 -> bool -> bool -> Prop :=
| F2_0 : F2_spec 0 true false
| F2_1 : F2_spec 1 false true.
Lemma F2P x : F2_spec x (x == 0) (x == 1).
Proof.
Lemma expr2_char2 x : x ^+ 2 = x.
Lemma F2_of_bool_addr x y : x + (y == 0) = ((x + y) == 0).
Lemma F2_of_bool_0_inv b : F2_of_bool b = 0 -> b = false.
Proof.
by case: b. Qed.
Lemma F2_of_boolK b : bool_of_F2 (F2_of_bool b) = b.
Proof.
by case: b. Qed.
Lemma bool_of_F2K x : bool_of_F2 x = x :> 'F_2.
Lemma bijective_F2_of_bool : {on [pred i in 'F_2], bijective F2_of_bool}.
Proof.
Lemma bool_of_F2_add_xor x y :
bool_of_F2 (x + y) = bool_of_F2 x (+) bool_of_F2 y.
Lemma morph_F2_of_bool : {morph F2_of_bool : x y / x (+) y >-> (x + y) : 'F_2}.
Proof.
Lemma morph_bool_of_F2 : {morph bool_of_F2 : x y / (x + y) : 'F_2 >-> x (+) y}.
Proof.
Lemma F2_addmx m n (a : 'M['F_2]_(m, n)) : a + a = 0.
Proof.
Lemma F2_mx_opp m n (a : 'M['F_2]_(m, n)) : - a = a.
Proof.
Lemma F2_addmx0 m n (a b : 'M['F_2]_(m, n)) : a + b = 0 -> a = b.
End AboutF2.
Lemma bitseq_row_nth n (i j : bitseq) : (size i <= n)%nat -> size i = size j ->
\row_(k < n) F2_of_bool (nth false i k) =
\row_(k < n) F2_of_bool (nth false j k) -> i = j.
Proof.
Section AboutPolyF2.
Implicit Types p q : {poly 'F_2}.
Lemma F2_poly_add p : p + p = 0.
Proof.
Lemma size_lead_coef_F2 p : size p <> O -> lead_coef p = 1.
Proof.
Lemma size1_polyC_F2 p : size p = 1%nat -> p = 1%:P.
Proof.
Lemma lead_coef_F2 p q : size p = size q -> lead_coef p = lead_coef q.
Proof.
move=> X.
case/boolP : (size p == O) => Y.
- move: X; rewrite (eqP Y) => /esym/eqP; rewrite size_poly_eq0 => /eqP ->.
by move: Y; rewrite size_poly_eq0 => /eqP ->.
- rewrite !size_lead_coef_F2 //; last by apply/eqP.
rewrite -X; by apply/eqP.
Qed.
case/boolP : (size p == O) => Y.
- move: X; rewrite (eqP Y) => /esym/eqP; rewrite size_poly_eq0 => /eqP ->.
by move: Y; rewrite size_poly_eq0 => /eqP ->.
- rewrite !size_lead_coef_F2 //; last by apply/eqP.
rewrite -X; by apply/eqP.
Qed.
Lemma monic_F2 p : p != 0 -> p \is monic.
Proof.
End AboutPolyF2.