rewrite > sym_times.
apply eq_plus_to_le ? ? (mod m n).
reflexivity.
+assumption.
rewrite > sym_times.
-apply div_mod.assumption. assumption.
+apply div_mod.assumption.
qed.
theorem divides_mod_to_divides: \forall p,m,n:nat. O < n \to
elim Hcut.rewrite > divides_to_divides_b_true.
simplify.
split.assumption.apply witness n1 n1 (S O).apply times_n_SO.
+assumption.assumption.
rewrite > not_divides_to_divides_b_false.
change with
(divides (gcd_aux n n1 (mod m n1)) m) \land
apply trans_le ? n1.
change with mod m n1 < n1.
apply lt_mod_m_m.assumption.assumption.
-apply decidable_divides n1 m.assumption.
-apply lt_to_le_to_lt ? n1.assumption.reflexivity.
-assumption.
assumption.assumption.
+apply decidable_divides n1 m.assumption.
qed.
theorem divides_gcd_nm: \forall n,m.
elim Hcut.
rewrite > divides_to_divides_b_true.
simplify.assumption.
+assumption.assumption.
rewrite > not_divides_to_divides_b_false.
change with divides d (gcd_aux n n1 (mod m n1)).
apply H.
apply lt_mod_m_m.assumption.assumption.
assumption.
apply divides_mod.assumption.assumption.assumption.
+assumption.assumption.
apply decidable_divides n1 m.assumption.
-apply lt_to_le_to_lt ? n1.assumption.reflexivity.
-assumption.assumption.assumption.
qed.
theorem divides_d_gcd: \forall m,n,d.
apply ex_intro ? ? O.
left.simplify.rewrite < plus_n_O.
apply sym_eq.apply minus_n_O.
+assumption.assumption.
rewrite > not_divides_to_divides_b_false.
change with
ex nat (\lambda a. ex nat (\lambda b.
rewrite < sym_plus.
rewrite < plus_minus.
rewrite < minus_n_n.reflexivity.
+apply le_n.
+assumption.
(* second case *)
rewrite < H7.
apply ex_intro ? ? (a1+a*(div m n1)).
rewrite < sym_plus.
rewrite < plus_minus.
rewrite < minus_n_n.reflexivity.
-(* end second case *)
+apply le_n.
+assumption.
apply H n1 (mod m n1).
-(* a lot of trivialities left *)
cut O \lt mod m n1 \lor O = mod m n1.
-elim Hcut2.assumption.
+elim Hcut2.assumption.
absurd divides n1 m.apply mod_O_to_divides.
-assumption.apply sym_eq.assumption.assumption.
+assumption.
+symmetry.assumption.assumption.
apply le_to_or_lt_eq.apply le_O_n.
apply lt_to_le.
apply lt_mod_m_m.assumption.
apply le_S_S_to_le.
apply trans_le ? n1.
change with mod m n1 < n1.
-apply lt_mod_m_m.assumption.assumption.
+apply lt_mod_m_m.
+assumption.assumption.assumption.assumption.
apply decidable_divides n1 m.assumption.
apply lt_to_le_to_lt ? n1.assumption.assumption.
-assumption.assumption.assumption.assumption.assumption.
-apply le_n.assumption.
-apply le_n.
qed.
theorem eq_minus_gcd: \forall m,n.
change with (S (S O)) \le gcd n m \to False.intro.
apply H1.rewrite < H3 (gcd n m).
apply divides_gcd_m.
+apply divides_gcd_n.assumption.
cut O < gcd n m \lor O = gcd n m.
elim Hcut.assumption.
apply False_ind.
elim Hcut1.rewrite < H5 in \vdash (? ? %).assumption.
apply gcd_O_to_eq_O.apply sym_eq.assumption.
apply le_to_or_lt_eq.apply le_O_n.
-apply divides_gcd_n.assumption.
qed.
(* esempio di sfarfallalmento !!! *)
(* end second case *)
rewrite < prime_to_gcd_SO n p.
apply eq_minus_gcd.
+assumption.assumption.
apply decidable_divides n p.
apply trans_lt ? (S O).simplify.apply le_n.
simplify in H.elim H. assumption.
-assumption.assumption.
qed.