
theorem AL:
  for p be Prime, n be Nat,k be Nat holds
  (n choose k) mod p =
     (((n mod p) choose (k mod p))*((n div p) choose (k div p))) mod p
  proof
    let p be Prime;
    defpred P[Nat] means for k be Nat holds
    ($1 choose k) mod p =
      ((($1 mod p) choose (k mod p))*(($1 div p) choose (k div p))) mod p;
    A2: P[0]
    proof
      let k be Nat;
      per cases;
      suppose k is zero; then
        reconsider k as zero Nat;
        (0 mod p) choose k = 1 &
          (0 mod p) choose (k mod p) = 1 &
            (0 div p) choose (k div p) = 1 by NEWTON:19;
        hence thesis;
      end;
      suppose k is non zero; then
        reconsider k as non zero Nat;
        per cases;
        suppose
          p divides k; then
          p <= k by NAT_D:7; then
          k div p is non zero by NAT_2:12;
          hence thesis;
        end;
        suppose
          not p divides k; then
          k mod p is non zero by PEPIN:6;
          hence thesis;
        end;
      end;
    end;
    A3: for i be Nat holds P[i] implies P[i+1]
    proof
      let i be Nat;
      assume
      B1: for s be Nat holds
        (i choose s) mod p =
           (((i mod p) choose (s mod p))*((i div p) choose (s div p))) mod p;
      P[i + 1]
      proof
        let k be Nat;
        per cases;
        suppose
          k = 0; then
          ((i + 1) choose k) = 1 &
          ((i + 1) div p) choose (k div p) = 1 &
          ((i + 1) mod p) choose (k mod p) = 1 by NEWTON:19;
          hence thesis;
        end;
        suppose
          k > 0; then
          reconsider k as non zero Nat;
          reconsider m = k - 1 as Nat;
      C0: (((i mod p) choose (m mod p))*((i div p) choose (m div p))) mod p =
            (i choose m) mod p &
              (((i mod p) choose (k mod p))*((i div p) choose (k div p)))
                mod p =
                 (i choose k) mod p by B1;
          per cases;
          suppose
            not p divides i + 1; then
            reconsider j = (i + 1) mod p as non zero Nat by PEPIN:6;
            D1: 0 < j  < p by NAT_D:1; then
            D2: ((i + 1) - 1) mod p = ((i+1) mod p) - 1 by ND3;
            D2a: (i + 1) mod p = 1 + (i mod p) by D2;
            D3: (i + 1) div p = ((i+1)-1) div p by D1,ND4;
            D6: ((i+1) choose (m + 1)) mod p =
              ((i choose m) + (i choose (m+1))) mod p by NEWTON:22
            .= (((((i mod p) choose (m mod p))*((i div p) choose
                (m div p))) mod p)
            + ((((i mod p) choose (k mod p))*((i div p) choose
              (k div p))) mod p)) mod p by C0,NAT_D:66;
            per cases;
            suppose
              E1: k mod p = 0;
              E2: m mod p = p - 1 by E1,ND1;
              E4: ((i+1) mod p) choose (k mod p) = 1 &
              (i mod p) choose (k mod p) = 1 by E1,NEWTON:19;
              i mod p <> p - 1 by NAT_D:1,D2a; then
              (i mod p) choose (p - 1) <> 1 by NPR; then
              (i mod p) choose (p - 1) = 0 by NPP,NAT_1:23;
              hence thesis by E4,D3,E2,D6;
            end;
            suppose
              E1: k mod p > 0;
              E1a: ((m + 1) - 1) mod p = ((m + 1) mod p) - 1 by E1,ND3;
              E3: k div p = m div p by E1,ND4;
              ((i+1) choose (m + 1)) mod p
              =  (((((i mod p) choose (m mod p))*((i div p) choose
                (k div p)))) + ((((i mod p) choose (k mod p))*((i div p)
                  choose (k div p))))) mod p by E3,NAT_D:66,D6
              .= ((((i mod p) choose (m mod p)) +
                 ((i mod p) choose ((m mod p)+1)))*((i div p) choose
                   (k div p))) mod p by E1a
              .= (((((i mod p)+1) choose ((m mod p)+1)))*((i div p) choose
                (k div p))) mod p by NEWTON:22
              .= (((((i+1) mod p) choose ((m+1) mod p)))*((i div p) choose
                (k div p))) mod p by D2,E1a;
              hence thesis by D3;
            end;
          end;
            suppose
              C1: p divides i + 1; then
              i + 1 >= p by NAT_D:7; then
              (i + 1) - 1 >= p - 1 by XREAL_1:9; then
              reconsider i as non zero Nat;
              C2: (i + 1) mod p = 0 by C1,PEPIN:6; then
              C2a: ((i + 1) - 1) mod p = p - 1 by ND1;
              per cases;
              suppose
                D1: (k mod p) > 0; then
                D2: (m mod p) = (k mod p) - 1 by ND3;
                D3: (((i mod p) choose (m mod p))*((i div p) choose
                  (m div p))) mod p = (i choose m) mod p &
                (((i mod p) choose (k mod p))*((i div p) choose (k div p)))
                  mod p = (i choose k) mod p by B1;
                D4a: k mod p < p by NAT_D:1;
                D6:  (((i + 1) mod p) choose (k mod p)) = 0
                  by D1,NEWTON:def 3,C2;
                ((i+1) choose (m + 1)) mod p =
                  ((i choose m) + (i choose (m+1))) mod p by NEWTON:22
                .= (((((i mod p) choose (m mod p))*((i div p)
                  choose (m div p))) mod p)
                + ((((i mod p) choose (k mod p))*((i div p) choose (k div p)))
                  mod p)) mod p by D3,NAT_D:66
                .= (((((i mod p) choose (m mod p))*((i div p)
                  choose (k div p))) mod p)
                + ((((i mod p) choose (1+(m mod p)))*((i div p)
                  choose (k div p))) mod p)) mod p by D2,ND4
                .= (((((i mod p) choose (m mod p))*((i div p)
                  choose (k div p))))
                + ((((i mod p) choose (1+(m mod p)))*((i div p)
                  choose (k div p))))) mod p by NAT_D:66
                .= (((((i mod p) choose (m mod p)) +
                  ((i mod p) choose (1+(m mod p))))*((i div p)
                    choose (k div p)))) mod p
                .= ((((i mod p) + 1) choose (1+(m mod p)))*((i div p)
                  choose (k div p))) mod p by NEWTON:22
                .= (((p choose (k mod p)) mod p)*((i div p)
                  choose (k div p))) mod p by EULER_2:8,C2a,D2
                .= (0*((i div p) choose (k div p))) mod p by D4a,D1,PCK;
                hence thesis by D6;
              end;
              suppose
                D1: k mod p = 0; then
                p divides k by PEPIN:6; then
                p <= k by NAT_D:7; then
                p - 1 <= k - 1 by XREAL_1:9; then
                reconsider  m = k - 1 as non zero Nat;
                E2: (m + 1) div p = (m div p) + 1 by D1,ND2;
                E3: (((i div p) choose (k div p))*((i mod p) choose
                  (k mod p))) mod p = (i choose k) mod p &
                (((i div p) choose (m div p))*((i mod p) choose
                  (m mod p))) mod p = (i choose m) mod p by B1;
                ((m + 1)-1) mod p = p - 1 by D1,ND1; then
                E5: (i mod p) choose (m mod p) = 1 by C2a,NEWTON:21;
                E6: (i mod p) choose (k mod p) = 1 by D1, NEWTON:19;
                (0 choose (k mod p)) = 1 by D1,NEWTON:19; then
                ((0 choose (k mod p))*(((i div p) + 1) choose (k div p))) mod p
                = (((i choose m) mod p) + ((i choose (m + 1))mod p)) mod p
                  by E3,E5,E6,E2,CPP
                .= ((i choose m) + (i choose (m + 1))) mod p by NAT_D:66
                .= ((i + 1) choose (m + 1)) mod p by NEWTON:22;
                hence thesis by C2,ND2;
            end;
          end;
        end;
      end;
      hence thesis;
    end;
    for c be Nat holds P[c] from NAT_1:sch 2(A2,A3);
    hence thesis;
  end;
