--- /dev/null
+(**************************************************************************)
+(* __ *)
+(* ||M|| *)
+(* ||A|| A project by Andrea Asperti *)
+(* ||T|| *)
+(* ||I|| Developers: *)
+(* ||T|| A.Asperti, C.Sacerdoti Coen, *)
+(* ||A|| E.Tassi, S.Zacchiroli *)
+(* \ / *)
+(* \ / This file is distributed under the terms of the *)
+(* v GNU Lesser General Public License Version 2.1 *)
+(* *)
+(**************************************************************************)
+
+set "baseuri" "cic:/matita/library_autobatch/nat/totient".
+
+include "auto/nat/count.ma".
+include "auto/nat/chinese_reminder.ma".
+
+definition totient : nat \to nat \def
+\lambda n. count n (\lambda m. eqb (gcd m n) (S O)).
+
+theorem totient3: totient (S(S(S O))) = (S(S O)).
+reflexivity.
+qed.
+
+theorem totient6: totient (S(S(S(S(S(S O)))))) = (S(S O)).
+reflexivity.
+qed.
+
+theorem totient_times: \forall n,m:nat. (gcd m n) = (S O) \to
+totient (n*m) = (totient n)*(totient m).
+intro.
+apply (nat_case n)
+[ intros.
+ autobatch
+ (*simplify.
+ reflexivity*)
+| intros 2.
+ apply (nat_case m1)
+ [ rewrite < sym_times.
+ rewrite < (sym_times (totient O)).
+ simplify.
+ intro.
+ reflexivity
+ | intros.
+ unfold totient.
+ apply (count_times m m2 ? ? ?
+ (\lambda b,a. cr_pair (S m) (S m2) a b)
+ (\lambda x. x \mod (S m)) (\lambda x. x \mod (S m2)))
+ [ intros.
+ unfold cr_pair.
+ apply (le_to_lt_to_lt ? (pred ((S m)*(S m2))))
+ [ unfold min.
+ apply le_min_aux_r
+ | autobatch
+ (*unfold lt.
+ apply (nat_case ((S m)*(S m2)))
+ [ apply le_n
+ | intro.
+ apply le_n
+ ]*)
+ ]
+ | intros.
+ generalize in match (mod_cr_pair (S m) (S m2) a b H1 H2 H).
+ intro.
+ elim H3.
+ apply H4
+ | intros.
+ generalize in match (mod_cr_pair (S m) (S m2) a b H1 H2 H).
+ intro.
+ elim H3.
+ apply H5
+ | intros.
+ generalize in match (mod_cr_pair (S m) (S m2) a b H1 H2 H).
+ intro.
+ elim H3.
+ apply eqb_elim
+ [ intro.
+ rewrite > eq_to_eqb_true
+ [ rewrite > eq_to_eqb_true
+ [ reflexivity
+ | rewrite < H4.
+ rewrite > sym_gcd.
+ rewrite > gcd_mod
+ [ apply (gcd_times_SO_to_gcd_SO ? ? (S m2))
+ [ autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | assumption
+ ]
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ ]
+ ]
+ | rewrite < H5.
+ rewrite > sym_gcd.
+ rewrite > gcd_mod
+ [ apply (gcd_times_SO_to_gcd_SO ? ? (S m))
+ [ autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | autobatch
+ (*rewrite > sym_times.
+ assumption*)
+ ]
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ ]
+ ]
+ | intro.
+ apply eqb_elim
+ [ intro.
+ apply eqb_elim
+ [ intro.
+ apply False_ind.
+ apply H6.
+ apply eq_gcd_times_SO
+ [ autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ | rewrite < gcd_mod
+ [ autobatch
+ (*rewrite > H4.
+ rewrite > sym_gcd.
+ assumption*)
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ ]
+ | rewrite < gcd_mod
+ [ autobatch
+ (*rewrite > H5.
+ rewrite > sym_gcd.
+ assumption*)
+ | autobatch
+ (*unfold lt.
+ apply le_S_S.
+ apply le_O_n*)
+ ]
+ ]
+ | intro.
+ reflexivity
+ ]
+ | intro.
+ reflexivity
+ ]
+ ]
+ ]
+ ]
+]
+qed.
\ No newline at end of file