|
| 1 | +Require Export (ltac.notations) NsatzTactic. |
| 2 | + |
| 3 | +Require Import Zdivisibility Lia NsatzTactic. |
| 4 | +Require Import ZmodDef ZmodBase ZmodInv. |
| 5 | + |
| 6 | +#[export] |
| 7 | +Instance Ring_ops_Zmod m : @Ring_ops (Zmod m) Zmod.zero Zmod.one Zmod.add Zmod.mul Zmod.sub Zmod.opp Logic.eq := {}. |
| 8 | + |
| 9 | +#[export] |
| 10 | +Instance Ring_Zmod m : Ring (Ro:=Ring_ops_Zmod m). |
| 11 | +Proof. |
| 12 | + split. |
| 13 | + { apply eq_equivalence. } |
| 14 | + 1,2,3,4 : Morphisms.solve_proper. |
| 15 | + { apply Zmod.add_0_l. } |
| 16 | + { apply Zmod.add_comm. } |
| 17 | + { apply Zmod.add_assoc. } |
| 18 | + { apply Zmod.mul_1_l. } |
| 19 | + { apply Zmod.mul_1_r. } |
| 20 | + { apply Zmod.mul_assoc. } |
| 21 | + { apply Zmod.mul_add_l. } |
| 22 | + { intros ? ? ?. apply Zmod.mul_add_r. } |
| 23 | + { symmetry; apply Zmod.add_opp_r. } |
| 24 | + { apply Zmod.add_opp_same_r. } |
| 25 | +Qed. |
| 26 | + |
| 27 | +#[export] |
| 28 | +Instance Cring_ZMod m : Cring (Rr:=Ring_Zmod m). |
| 29 | +Proof. |
| 30 | + cbv [Cring]. |
| 31 | + apply Zmod.mul_comm. |
| 32 | +Qed. |
| 33 | + |
| 34 | +#[export] |
| 35 | +Instance Integral_domain_Zmod m : Z.prime m -> Integral_domain (Rr:=Ring_Zmod m). |
| 36 | +Proof. |
| 37 | + intros H; split. |
| 38 | + { apply Zmod.mul_0_iff_prime, H. } |
| 39 | + { apply Zmod.one_neq_zero. pose proof Z.prime_ge_2 _ H. lia. } |
| 40 | +Qed. |
| 41 | + |
| 42 | +Local Ltac extra_reify_of_Z := |
| 43 | + lazymatch goal with |- Ncring_tac.extra_reify _ (@Zmod.of_Z ?m ?z) => |
| 44 | + constr_eq true ltac:(isZcst m); |
| 45 | + constr_eq true ltac:(isZcst z); |
| 46 | + exact (PEc z) |
| 47 | + end. |
| 48 | + |
| 49 | +Local Ltac extra_reify_pow_pos := |
| 50 | + lazymatch goal with |- @Ncring_tac.extra_reify ?R ?ring0 ?ring1 ?add ?mul ?sub ?opp ?lvar (Zmod.pow ?t (Z.pos ?p)) => |
| 51 | + constr_eq true ltac:(isPcst p); |
| 52 | + let et := Ncring_tac.reify_term R ring0 ring1 add mul sub opp lvar t in |
| 53 | + exact (PEpow et (BinNat.N.pos p)) |
| 54 | + end. |
| 55 | + |
| 56 | +#[export] Hint Extern 1 (Ncring_tac.extra_reify _ (Zmod.of_Z ?m ?z)) => extra_reify_of_Z : typeclass_instances. |
| 57 | +#[export] Hint Extern 1 (Ncring_tac.extra_reify _ (Zmod.pow _ (Z.pos _))) => extra_reify_pow_pos : typeclass_instances. |
| 58 | +#[export] Hint Extern 1 (Ncring_tac.extra_reify _ (Zmod.pow _ Z0)) => exact (PEc 0%Z) : typeclass_instances. |
| 59 | +(* [Zmod.pow _ (Z.neg) = Zmod.inv (Zmod.pow _ _)] can't be reified directly *) |
0 commit comments