Proof (fun x => mulc_WW_spec x x).

(* Specifications: *)
Lemma diveucl_spec_aux : forall a b, 0 < φ b ->
let (q,r) := diveucl a b in
φ a = φ q * φ b + φ r /\
0 <= φ r < φ b.
Lemma shift_unshift_mod_2 : forall n p a, 0 <= p <= n ->
((a * 2 ^ (n - p)) mod (2^n) / 2 ^ (n - p)) mod (2^n) =
a mod 2 ^ p.
Lemma div_le_0 : forall p x, 0 <= x -> 0 <= x / 2 ^ p.
Lemma div_lt : forall p x y, 0 <= x < y -> x / 2^p < y.
Lemma P (A B C: Prop) :
A → (B → C) → (A → B) → C.
Lemma pos_mod_spec w p : φ(pos_mod p w) = φ(w) mod (2 ^ φ(p)).
Global Instance int_specs : ZnZ.Specs int_ops := {
spec_to_Z   := to_Z_bounded;
spec_of_pos := positive_to_int_spec;
spec_zdigits := refl_equal _;
spec_more_than_1_digit:= refl_equal _;
spec_0 := to_Z_0;
spec_1 := to_Z_1;
spec_m1 := refl_equal _;
spec_compare := compare_spec;
spec_eq0 := is_zero_spec_aux;
spec_opp_c := oppc_spec;
spec_opp := opp_spec;
spec_opp_carry := oppcarry_spec;
spec_succ_c := succc_spec;
spec_add_c := addc_spec;
spec_add_carry_c := addcarryc_spec;
spec_succ := succ_spec;
spec_add := add_spec;
spec_add_carry := addcarry_spec;
spec_pred_c := predc_spec;
spec_sub_c := subc_spec;
spec_sub_carry_c := subcarryc_spec;
spec_pred := pred_spec;
spec_sub := sub_spec;
spec_sub_carry := subcarry_spec;
spec_mul_c := mulc_WW_spec;
spec_mul := mul_spec;
spec_square_c := squarec_spec;
spec_div21 := diveucl_21_spec_aux;
spec_div_gt := fun a b _ => diveucl_spec_aux a b;
spec_div := diveucl_spec_aux;
spec_modulo_gt := fun a b _ _ => mod_spec a b;
spec_modulo := fun a b _ => mod_spec a b;
spec_gcd_gt := fun a b _ => gcd_spec a b;
spec_gcd := gcd_spec;
spec_head00 := head00_spec;
spec_head0 := head0_spec;
spec_tail00 := tail00_spec;
spec_tail0 := tail0_spec;
spec_add_mul_div := addmuldiv_spec;
spec_pos_mod := pos_mod_spec;
spec_is_even := is_even_spec;
spec_sqrt2 := sqrt2_spec;
spec_sqrt := sqrt_spec;
spec_land := land_spec';
spec_lor := lor_spec';
spec_lxor := lxor_spec' }.