
theorem Th47: :: Factor theorem (Bezout)
  for L being non degenerated comRing, r being Element of L, p
being Polynomial of L st r is_a_root_of p holds p = <%-r,1.L%>*'poly_quotient(p
  ,r)
proof
  let L be non degenerated comRing, x be Element of L, p be Polynomial of L;
  assume
A1: x is_a_root_of p;
  set r = <%-x,1.L%>, pq = poly_quotient(p,x);
  per cases;
  suppose
A2: len p > 0;
    r.(len r -'1) = r.(1+1-'1) by POLYNOM5:40
      .= r.1 by NAT_D:34
      .= 1.L by POLYNOM5:38;
    then
A3: r.(len r -'1) * pq.(len pq -'1) = pq.(len pq -'1);
    p is non-zero by A2,Th14;
    then
A4: len pq > 0 by A1,Th44;
    now
      len (r *' pq) = len r + len pq - 1 by A4,A3,Th15,POLYNOM4:10
        .= len pq +(1+1)-1 by POLYNOM5:40
        .= len pq +1
        .= len p by A1,A2,Def6;
      hence len p = len (r *' pq);
      defpred P[Nat] means p.$1 = (r*'pq).$1;
      let k be Nat;
      assume k < len p;
A5:   0.L = eval(p,x) by A1
        .= eval(poly_shift(p,0),x) by Th39
        .= x*eval(poly_shift(p,0 qua Nat+1),x) + p.0 by A2,Th42;
A6:   (-x)*eval(poly_shift(p, 0 qua Nat+1),x) = (-x)*eval(poly_shift(p, 0
      qua Nat+1),x) + 0.L by RLVECT_1:def 4
        .= (-x)*eval(poly_shift(p, 0 qua Nat+1),x) + x*eval(poly_shift(p,1),
      x) + p.0 by A5,RLVECT_1:def 3
        .= -x*eval(poly_shift(p, 0 qua Nat+1),x) + x*eval(poly_shift(p,1),x)
      + p.0 by VECTSP_1:9
        .= 0.L +p.0 by RLVECT_1:5
        .= p.0 by RLVECT_1:4;
A7:   for k being Nat st P[k] holds P[k+1]
      proof
        let k be Nat;
        assume P[k];
A8:     pq.(k+1) = eval(poly_shift(p, k+1+1),x) by A1,A2,Def6;
A9:     pq.k = eval(poly_shift(p, k+1),x) by A1,A2,Def6;
        per cases;
        suppose
A10:      k+1 >= len p;
          then
A11:      pq.(k+1) = eval(0_.L,x) by A8,Th40,NAT_1:12
            .= 0.L by POLYNOM4:17;
A12:      pq.k = eval(0_.L,x) by A9,A10,Th40
            .= 0.L by POLYNOM4:17;
          (r*'pq).(k+1) = (-x)*pq.(k+1)+(1.L)*pq.k by Th34
            .= 0.L + (1.L)*pq.k by A11
            .= 0.L + 0.L by A12
            .= 0.L by RLVECT_1:4;
          hence thesis by A10,ALGSEQ_1:8;
        end;
        suppose
          k+1 < len p;
          then pq.k = x*eval(poly_shift(p, k+1+1),x) + p.(k+1) by A9,Th42;
          then
A13:      -x*pq.(k+1)+pq.k = -x*pq.(k+1)+x*eval(poly_shift(p, k+1+1),x)+p
          .(k+1) by RLVECT_1:def 3
            .= 0.L + p.(k+1) by A8,RLVECT_1:5;
          (r*'pq).(k+1) = (-x)*pq.(k+1)+(1.L)*pq.k by Th34
            .= (-x)*pq.(k+1)+pq.k
            .= -x*pq.(k+1)+pq.k by VECTSP_1:9;
          hence thesis by A13,RLVECT_1:4;
        end;
      end;
      (r*'pq).0 = (-x)*pq.0 by Th34
        .= (-x)*eval(poly_shift(p, 0 qua Nat+1),x) by A1,A2,Def6;
      then
A14:  P[ 0 ] by A6;
      for k being Nat holds P[k] from NAT_1:sch 2(A14,A7);
      hence p.k = (r*'pq).k;
    end;
    hence thesis by ALGSEQ_1:12;
  end;
  suppose
    len p = 0;
    then pq = 0_. L & p = 0_. L by A1,Def6,POLYNOM4:5;
    hence thesis by POLYNOM3:34;
  end;
end;
