+
+theorem divides_times_gcd_aux: \forall p,m,n,d,c.
+O \lt c \to O < n \to n \le m \to n \le p \to
+d \divides (c*m) \to d \divides (c*n) \to d \divides c*gcd_aux p m n.
+intro.
+elim p
+[ absurd (O < n)
+ [ assumption
+ | apply le_to_not_lt.
+ assumption
+ ]
+| simplify.
+ cut (n1 \divides m \lor n1 \ndivides m)
+ [ elim Hcut
+ [ rewrite > divides_to_divides_b_true
+ [ simplify.
+ assumption
+ | assumption
+ | assumption
+ ]
+ | rewrite > not_divides_to_divides_b_false
+ [ simplify.
+ apply H
+ [ assumption
+ | cut (O \lt m \mod n1 \lor O = m \mod n1)
+ [ elim Hcut1
+ [ assumption
+ | absurd (n1 \divides m)
+ [ apply mod_O_to_divides
+ [ assumption
+ | apply sym_eq.
+ 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 (m \mod n1 < n1).
+ apply lt_mod_m_m.
+ assumption
+ | assumption
+ ]
+ | assumption
+ | rewrite < times_mod
+ [ rewrite < (sym_times c m).
+ rewrite < (sym_times c n1).
+ apply divides_mod
+ [ rewrite > (S_pred c)
+ [ rewrite > (S_pred n1)
+ [ apply (lt_O_times_S_S)
+ | assumption
+ ]
+ | assumption
+ ]
+ | assumption
+ | assumption
+ ]
+ | assumption
+ | assumption
+ ]
+ ]
+ | assumption
+ | assumption
+ ]
+ ]
+ | apply (decidable_divides n1 m).
+ assumption
+ ]
+]
+qed.
+
+(*a particular case of the previous theorem (setting c=1)*)