(* *)
(**************************************************************************)
-set "baseuri" "cic:/matita/nat/primes".
-
include "nat/div_and_mod.ma".
include "nat/minimization.ma".
include "nat/sigma_and_pi.ma".
simplify.exact (not_le_Sn_n O).
qed.
-
-(*divides and div*)
+(*a variant of or_div_mod *)
+theorem or_div_mod1: \forall n,q. O < q \to
+(divides q (S n)) \land S n = (S (div n q)) * q \lor
+(\lnot (divides q (S n)) \land S n= (div n q) * q + S (n\mod q)).
+intros.elim (or_div_mod n q H);elim H1
+ [left.split
+ [apply (witness ? ? (S (n/q))).
+ rewrite > sym_times.assumption
+ |assumption
+ ]
+ |right.split
+ [intro.
+ apply (not_eq_O_S (n \mod q)).
+ (* come faccio a fare unfold nelleipotesi ? *)
+ cut ((S n) \mod q = O)
+ [rewrite < Hcut.
+ apply (div_mod_spec_to_eq2 (S n) q (div (S n) q) (mod (S n) q) (div n q) (S (mod n q)))
+ [apply div_mod_spec_div_mod.
+ assumption
+ |apply div_mod_spec_intro;assumption
+ ]
+ |apply divides_to_mod_O;assumption
+ ]
+ |assumption
+ ]
+ ]
+qed.
theorem divides_to_div: \forall n,m.divides n m \to m/n*n = m.
intro.
]
qed.
+theorem eq_div_plus: \forall n,m,d. O < d \to
+divides d n \to divides d m \to
+(n + m ) / d = n/d + m/d.
+intros.
+elim H1.
+elim H2.
+rewrite > H3.rewrite > H4.
+rewrite < distr_times_plus.
+rewrite > sym_times.
+rewrite > sym_times in ⊢ (? ? ? (? (? % ?) ?)).
+rewrite > sym_times in ⊢ (? ? ? (? ? (? % ?))).
+rewrite > lt_O_to_div_times
+ [rewrite > lt_O_to_div_times
+ [rewrite > lt_O_to_div_times
+ [reflexivity
+ |assumption
+ ]
+ |assumption
+ ]
+ |assumption
+ ]
+qed.
(* boolean divides *)
definition divides_b : nat \to nat \to bool \def
intros.elim H.apply lt_to_le.assumption.
qed.
+theorem prime_to_lt_SO: \forall p. prime p \to S O < p.
+intros.elim H.
+assumption.
+qed.
+
(* smallest factor *)
definition smallest_factor : nat \to nat \def
\lambda n:nat.