:: Trigonometric Functions and Existence of Circle Ratio
:: by Yuguang Yang and Yasunari Shidama
::
:: Received October 22, 1998
:: Copyright (c) 1998 Association of Mizar Users


begin

definition
let m, k be Element of NAT ;
canceled;
func CHK (m,k) -> Element of COMPLEX equals :Def2: :: SIN_COS:def 2
1 if m <= k
otherwise 0 ;
correctness
coherence
( ( m <= k implies 1 is Element of COMPLEX ) & ( not m <= k implies 0 is Element of COMPLEX ) )
;
consistency
for b1 being Element of COMPLEX holds verum
;
proof end;
end;

:: deftheorem SIN_COS:def 1 :
canceled;

:: deftheorem Def2 defines CHK SIN_COS:def 2 :
for m, k being Element of NAT holds
( ( m <= k implies CHK (m,k) = 1 ) & ( not m <= k implies CHK (m,k) = 0 ) );

registration
let m, k be Element of NAT ;
cluster CHK (m,k) -> real ;
coherence
CHK (m,k) is real
by Def2;
end;

scheme :: SIN_COS:sch 1
ExComplexCASE{ F1( Nat, Nat) -> complex number } :
for k being Element of NAT ex seq being Complex_Sequence st
for n being Element of NAT holds
( ( n <= k implies seq . n = F1(k,n) ) & ( n > k implies seq . n = 0 ) )
proof end;

scheme :: SIN_COS:sch 2
ExRealCASE{ F1( Nat, Nat) -> real number } :
for k being Element of NAT ex rseq being Real_Sequence st
for n being Element of NAT holds
( ( n <= k implies rseq . n = F1(k,n) ) & ( n > k implies rseq . n = 0 ) )
proof end;

definition
let x be Element of COMPLEX ;
let c be complex number ;
:: original: *
redefine func x * c -> Element of COMPLEX ;
coherence
x * c is Element of COMPLEX
by XCMPLX_0:def 2;
end;

definition
canceled;
canceled;
func Prod_real_n -> Real_Sequence means :Def5: :: SIN_COS:def 5
( it . 0 = 1 & ( for n being Element of NAT holds it . (n + 1) = (it . n) * (n + 1) ) );
existence
ex b1 being Real_Sequence st
( b1 . 0 = 1 & ( for n being Element of NAT holds b1 . (n + 1) = (b1 . n) * (n + 1) ) )
proof end;
uniqueness
for b1, b2 being Real_Sequence st b1 . 0 = 1 & ( for n being Element of NAT holds b1 . (n + 1) = (b1 . n) * (n + 1) ) & b2 . 0 = 1 & ( for n being Element of NAT holds b2 . (n + 1) = (b2 . n) * (n + 1) ) holds
b1 = b2
proof end;
end;

:: deftheorem SIN_COS:def 3 :
canceled;

:: deftheorem SIN_COS:def 4 :
canceled;

:: deftheorem Def5 defines Prod_real_n SIN_COS:def 5 :
for b1 being Real_Sequence holds
( b1 = Prod_real_n iff ( b1 . 0 = 1 & ( for n being Element of NAT holds b1 . (n + 1) = (b1 . n) * (n + 1) ) ) );

definition
canceled;
let n be Nat;
redefine func n ! equals :: SIN_COS:def 7
Prod_real_n . n;
compatibility
for b1 being Element of REAL holds
( b1 = n ! iff b1 = Prod_real_n . n )
proof end;
end;

:: deftheorem SIN_COS:def 6 :
canceled;

:: deftheorem defines ! SIN_COS:def 7 :
for n being Nat holds n ! = Prod_real_n . n;

definition
let z be complex number ;
deffunc H1( Element of NAT ) -> Element of COMPLEX = (z #N $1) / ($1 !);
func z ExpSeq -> Complex_Sequence means :Def8: :: SIN_COS:def 8
for n being Element of NAT holds it . n = (z #N n) / (n !);
existence
ex b1 being Complex_Sequence st
for n being Element of NAT holds b1 . n = (z #N n) / (n !)
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for n being Element of NAT holds b1 . n = (z #N n) / (n !) ) & ( for n being Element of NAT holds b2 . n = (z #N n) / (n !) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def8 defines ExpSeq SIN_COS:def 8 :
for z being complex number
for b2 being Complex_Sequence holds
( b2 = z ExpSeq iff for n being Element of NAT holds b2 . n = (z #N n) / (n !) );

definition
let a be real number ;
deffunc H1( Element of NAT ) -> Element of REAL = (a |^ $1) / ($1 !);
func a rExpSeq -> Real_Sequence means :Def9: :: SIN_COS:def 9
for n being Element of NAT holds it . n = (a |^ n) / (n !);
existence
ex b1 being Real_Sequence st
for n being Element of NAT holds b1 . n = (a |^ n) / (n !)
proof end;
uniqueness
for b1, b2 being Real_Sequence st ( for n being Element of NAT holds b1 . n = (a |^ n) / (n !) ) & ( for n being Element of NAT holds b2 . n = (a |^ n) / (n !) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines rExpSeq SIN_COS:def 9 :
for a being real number
for b2 being Real_Sequence holds
( b2 = a rExpSeq iff for n being Element of NAT holds b2 . n = (a |^ n) / (n !) );

theorem Th1: :: SIN_COS:1
for n being Element of NAT holds
( 0 ! = 1 & n ! <> 0 & (n + 1) ! = (n !) * (n + 1) ) by Def5;

theorem :: SIN_COS:2
canceled;

theorem Th3: :: SIN_COS:3
for k, m being Element of NAT holds
( ( 0 < k implies ((k -' 1) !) * k = k ! ) & ( k <= m implies ((m -' k) !) * ((m + 1) - k) = ((m + 1) -' k) ! ) )
proof end;

definition
let n be Element of NAT ;
func Coef n -> Complex_Sequence means :Def10: :: SIN_COS:def 10
for k being Element of NAT holds
( ( k <= n implies it . k = (n !) / ((k !) * ((n -' k) !)) ) & ( k > n implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = (n !) / ((k !) * ((n -' k) !)) ) & ( k > n implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = (n !) / ((k !) * ((n -' k) !)) ) & ( k > n implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = (n !) / ((k !) * ((n -' k) !)) ) & ( k > n implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def10 defines Coef SIN_COS:def 10 :
for n being Element of NAT
for b2 being Complex_Sequence holds
( b2 = Coef n iff for k being Element of NAT holds
( ( k <= n implies b2 . k = (n !) / ((k !) * ((n -' k) !)) ) & ( k > n implies b2 . k = 0 ) ) );

definition
let n be Element of NAT ;
func Coef_e n -> Complex_Sequence means :Def11: :: SIN_COS:def 11
for k being Element of NAT holds
( ( k <= n implies it . k = 1r / ((k !) * ((n -' k) !)) ) & ( k > n implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = 1r / ((k !) * ((n -' k) !)) ) & ( k > n implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = 1r / ((k !) * ((n -' k) !)) ) & ( k > n implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = 1r / ((k !) * ((n -' k) !)) ) & ( k > n implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def11 defines Coef_e SIN_COS:def 11 :
for n being Element of NAT
for b2 being Complex_Sequence holds
( b2 = Coef_e n iff for k being Element of NAT holds
( ( k <= n implies b2 . k = 1r / ((k !) * ((n -' k) !)) ) & ( k > n implies b2 . k = 0 ) ) );

definition
let seq be Complex_Sequence;
func Shift seq -> Complex_Sequence means :Def12: :: SIN_COS:def 12
( it . 0 = 0 & ( for k being Element of NAT holds it . (k + 1) = seq . k ) );
existence
ex b1 being Complex_Sequence st
( b1 . 0 = 0 & ( for k being Element of NAT holds b1 . (k + 1) = seq . k ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st b1 . 0 = 0 & ( for k being Element of NAT holds b1 . (k + 1) = seq . k ) & b2 . 0 = 0 & ( for k being Element of NAT holds b2 . (k + 1) = seq . k ) holds
b1 = b2
proof end;
end;

:: deftheorem Def12 defines Shift SIN_COS:def 12 :
for seq, b2 being Complex_Sequence holds
( b2 = Shift seq iff ( b2 . 0 = 0 & ( for k being Element of NAT holds b2 . (k + 1) = seq . k ) ) );

definition
let n be Element of NAT ;
let z, w be Element of COMPLEX ;
func Expan (n,z,w) -> Complex_Sequence means :Def13: :: SIN_COS:def 13
for k being Element of NAT holds
( ( k <= n implies it . k = (((Coef n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = (((Coef n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = (((Coef n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = (((Coef n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def13 defines Expan SIN_COS:def 13 :
for n being Element of NAT
for z, w being Element of COMPLEX
for b4 being Complex_Sequence holds
( b4 = Expan (n,z,w) iff for k being Element of NAT holds
( ( k <= n implies b4 . k = (((Coef n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b4 . k = 0 ) ) );

definition
let n be Element of NAT ;
let z, w be Element of COMPLEX ;
func Expan_e (n,z,w) -> Complex_Sequence means :Def14: :: SIN_COS:def 14
for k being Element of NAT holds
( ( k <= n implies it . k = (((Coef_e n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = (((Coef_e n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = (((Coef_e n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = (((Coef_e n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def14 defines Expan_e SIN_COS:def 14 :
for n being Element of NAT
for z, w being Element of COMPLEX
for b4 being Complex_Sequence holds
( b4 = Expan_e (n,z,w) iff for k being Element of NAT holds
( ( k <= n implies b4 . k = (((Coef_e n) . k) * (z |^ k)) * (w |^ (n -' k)) ) & ( n < k implies b4 . k = 0 ) ) );

definition
let n be Element of NAT ;
let z, w be Element of COMPLEX ;
func Alfa (n,z,w) -> Complex_Sequence means :Def15: :: SIN_COS:def 15
for k being Element of NAT holds
( ( k <= n implies it . k = ((z ExpSeq) . k) * ((Partial_Sums (w ExpSeq)) . (n -' k)) ) & ( n < k implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = ((z ExpSeq) . k) * ((Partial_Sums (w ExpSeq)) . (n -' k)) ) & ( n < k implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = ((z ExpSeq) . k) * ((Partial_Sums (w ExpSeq)) . (n -' k)) ) & ( n < k implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = ((z ExpSeq) . k) * ((Partial_Sums (w ExpSeq)) . (n -' k)) ) & ( n < k implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def15 defines Alfa SIN_COS:def 15 :
for n being Element of NAT
for z, w being Element of COMPLEX
for b4 being Complex_Sequence holds
( b4 = Alfa (n,z,w) iff for k being Element of NAT holds
( ( k <= n implies b4 . k = ((z ExpSeq) . k) * ((Partial_Sums (w ExpSeq)) . (n -' k)) ) & ( n < k implies b4 . k = 0 ) ) );

definition
let a, b be real number ;
let n be Element of NAT ;
func Conj (n,a,b) -> Real_Sequence means :: SIN_COS:def 16
for k being Element of NAT holds
( ( k <= n implies it . k = ((a rExpSeq) . k) * (((Partial_Sums (b rExpSeq)) . n) - ((Partial_Sums (b rExpSeq)) . (n -' k))) ) & ( n < k implies it . k = 0 ) );
existence
ex b1 being Real_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = ((a rExpSeq) . k) * (((Partial_Sums (b rExpSeq)) . n) - ((Partial_Sums (b rExpSeq)) . (n -' k))) ) & ( n < k implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Real_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = ((a rExpSeq) . k) * (((Partial_Sums (b rExpSeq)) . n) - ((Partial_Sums (b rExpSeq)) . (n -' k))) ) & ( n < k implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = ((a rExpSeq) . k) * (((Partial_Sums (b rExpSeq)) . n) - ((Partial_Sums (b rExpSeq)) . (n -' k))) ) & ( n < k implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem defines Conj SIN_COS:def 16 :
for a, b being real number
for n being Element of NAT
for b4 being Real_Sequence holds
( b4 = Conj (n,a,b) iff for k being Element of NAT holds
( ( k <= n implies b4 . k = ((a rExpSeq) . k) * (((Partial_Sums (b rExpSeq)) . n) - ((Partial_Sums (b rExpSeq)) . (n -' k))) ) & ( n < k implies b4 . k = 0 ) ) );

definition
let z, w be Element of COMPLEX ;
let n be Element of NAT ;
func Conj (n,z,w) -> Complex_Sequence means :Def17: :: SIN_COS:def 17
for k being Element of NAT holds
( ( k <= n implies it . k = ((z ExpSeq) . k) * (((Partial_Sums (w ExpSeq)) . n) - ((Partial_Sums (w ExpSeq)) . (n -' k))) ) & ( n < k implies it . k = 0 ) );
existence
ex b1 being Complex_Sequence st
for k being Element of NAT holds
( ( k <= n implies b1 . k = ((z ExpSeq) . k) * (((Partial_Sums (w ExpSeq)) . n) - ((Partial_Sums (w ExpSeq)) . (n -' k))) ) & ( n < k implies b1 . k = 0 ) )
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for k being Element of NAT holds
( ( k <= n implies b1 . k = ((z ExpSeq) . k) * (((Partial_Sums (w ExpSeq)) . n) - ((Partial_Sums (w ExpSeq)) . (n -' k))) ) & ( n < k implies b1 . k = 0 ) ) ) & ( for k being Element of NAT holds
( ( k <= n implies b2 . k = ((z ExpSeq) . k) * (((Partial_Sums (w ExpSeq)) . n) - ((Partial_Sums (w ExpSeq)) . (n -' k))) ) & ( n < k implies b2 . k = 0 ) ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def17 defines Conj SIN_COS:def 17 :
for z, w being Element of COMPLEX
for n being Element of NAT
for b4 being Complex_Sequence holds
( b4 = Conj (n,z,w) iff for k being Element of NAT holds
( ( k <= n implies b4 . k = ((z ExpSeq) . k) * (((Partial_Sums (w ExpSeq)) . n) - ((Partial_Sums (w ExpSeq)) . (n -' k))) ) & ( n < k implies b4 . k = 0 ) ) );

Lm1: for p1, p2, g1, g2 being Element of REAL holds
( (p1 + (g1 * <i>)) * (p2 + (g2 * <i>)) = ((p1 * p2) - (g1 * g2)) + (((p1 * g2) + (p2 * g1)) * <i>) & (p2 + (g2 * <i>)) *' = p2 + ((- g2) * <i>) )
proof end;

theorem Th4: :: SIN_COS:4
for n being Element of NAT
for z being complex number holds
( (z ExpSeq) . (n + 1) = (((z ExpSeq) . n) * z) / ((n + 1) + (0 * <i>)) & (z ExpSeq) . 0 = 1 & |.((z ExpSeq) . n).| = (|.z.| rExpSeq) . n )
proof end;

theorem Th5: :: SIN_COS:5
for k being Element of NAT
for seq being Complex_Sequence st 0 < k holds
(Shift seq) . k = seq . (k -' 1)
proof end;

theorem Th6: :: SIN_COS:6
for k being Element of NAT
for seq being Complex_Sequence holds (Partial_Sums seq) . k = ((Partial_Sums (Shift seq)) . k) + (seq . k)
proof end;

theorem Th7: :: SIN_COS:7
for z, w being Element of COMPLEX
for n being Element of NAT holds (z + w) |^ n = (Partial_Sums (Expan (n,z,w))) . n
proof end;

theorem Th8: :: SIN_COS:8
for z, w being Element of COMPLEX
for n being Element of NAT holds Expan_e (n,z,w) = (1r / (n !)) (#) (Expan (n,z,w))
proof end;

theorem Th9: :: SIN_COS:9
for z, w being Element of COMPLEX
for n being Element of NAT holds ((z + w) |^ n) / (n !) = (Partial_Sums (Expan_e (n,z,w))) . n
proof end;

theorem Th10: :: SIN_COS:10
( 0c ExpSeq is absolutely_summable & Sum (0c ExpSeq) = 1r )
proof end;

registration
let z be complex number ;
cluster z ExpSeq -> absolutely_summable ;
coherence
z ExpSeq is absolutely_summable
proof end;
end;

theorem Th11: :: SIN_COS:11
for z, w being Element of COMPLEX holds
( (z ExpSeq) . 0 = 1 & (Expan (0,z,w)) . 0 = 1 )
proof end;

theorem Th12: :: SIN_COS:12
for z, w being Element of COMPLEX
for l, k being Element of NAT st l <= k holds
(Alfa ((k + 1),z,w)) . l = ((Alfa (k,z,w)) . l) + ((Expan_e ((k + 1),z,w)) . l)
proof end;

theorem Th13: :: SIN_COS:13
for z, w being Element of COMPLEX
for k being Element of NAT holds (Partial_Sums (Alfa ((k + 1),z,w))) . k = ((Partial_Sums (Alfa (k,z,w))) . k) + ((Partial_Sums (Expan_e ((k + 1),z,w))) . k)
proof end;

theorem Th14: :: SIN_COS:14
for z, w being Element of COMPLEX
for k being Element of NAT holds (z ExpSeq) . k = (Expan_e (k,z,w)) . k
proof end;

theorem Th15: :: SIN_COS:15
for z, w being Element of COMPLEX
for n being Element of NAT holds (Partial_Sums ((z + w) ExpSeq)) . n = (Partial_Sums (Alfa (n,z,w))) . n
proof end;

theorem Th16: :: SIN_COS:16
for z, w being Element of COMPLEX
for k being Element of NAT holds (((Partial_Sums (z ExpSeq)) . k) * ((Partial_Sums (w ExpSeq)) . k)) - ((Partial_Sums ((z + w) ExpSeq)) . k) = (Partial_Sums (Conj (k,z,w))) . k
proof end;

theorem Th17: :: SIN_COS:17
for z being Element of COMPLEX
for k being Element of NAT holds
( |.((Partial_Sums (z ExpSeq)) . k).| <= (Partial_Sums (|.z.| rExpSeq)) . k & (Partial_Sums (|.z.| rExpSeq)) . k <= Sum (|.z.| rExpSeq) & |.((Partial_Sums (z ExpSeq)) . k).| <= Sum (|.z.| rExpSeq) )
proof end;

theorem Th18: :: SIN_COS:18
for z being Element of COMPLEX holds 1 <= Sum (|.z.| rExpSeq)
proof end;

theorem Th19: :: SIN_COS:19
for z being Element of COMPLEX
for n being Element of NAT holds 0 <= (|.z.| rExpSeq) . n
proof end;

theorem Th20: :: SIN_COS:20
for z being Element of COMPLEX
for n, m being Element of NAT holds
( abs ((Partial_Sums (|.z.| rExpSeq)) . n) = (Partial_Sums (|.z.| rExpSeq)) . n & ( n <= m implies abs (((Partial_Sums (|.z.| rExpSeq)) . m) - ((Partial_Sums (|.z.| rExpSeq)) . n)) = ((Partial_Sums (|.z.| rExpSeq)) . m) - ((Partial_Sums (|.z.| rExpSeq)) . n) ) )
proof end;

theorem Th21: :: SIN_COS:21
for z, w being Element of COMPLEX
for k, n being Element of NAT holds abs ((Partial_Sums |.(Conj (k,z,w)).|) . n) = (Partial_Sums |.(Conj (k,z,w)).|) . n
proof end;

theorem Th22: :: SIN_COS:22
for z, w being Element of COMPLEX
for p being real number st p > 0 holds
ex n being Element of NAT st
for k being Element of NAT st n <= k holds
abs ((Partial_Sums |.(Conj (k,z,w)).|) . k) < p
proof end;

theorem Th23: :: SIN_COS:23
for z, w being Element of COMPLEX
for seq being Complex_Sequence st ( for k being Element of NAT holds seq . k = (Partial_Sums (Conj (k,z,w))) . k ) holds
( seq is convergent & lim seq = 0 )
proof end;

Lm2: for z, w being complex number holds (Sum (z ExpSeq)) * (Sum (w ExpSeq)) = Sum ((z + w) ExpSeq)
proof end;

begin

definition
func exp -> Function of COMPLEX,COMPLEX means :Def18: :: SIN_COS:def 18
for z being complex number holds it . z = Sum (z ExpSeq);
existence
ex b1 being Function of COMPLEX,COMPLEX st
for z being complex number holds b1 . z = Sum (z ExpSeq)
proof end;
uniqueness
for b1, b2 being Function of COMPLEX,COMPLEX st ( for z being complex number holds b1 . z = Sum (z ExpSeq) ) & ( for z being complex number holds b2 . z = Sum (z ExpSeq) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def18 defines exp SIN_COS:def 18 :
for b1 being Function of COMPLEX,COMPLEX holds
( b1 = exp iff for z being complex number holds b1 . z = Sum (z ExpSeq) );

definition
let z be complex number ;
func exp z -> complex number equals :: SIN_COS:def 19
exp . z;
coherence
exp . z is complex number
;
end;

:: deftheorem defines exp SIN_COS:def 19 :
for z being complex number holds exp z = exp . z;

definition
let z be complex number ;
:: original: exp
redefine func exp z -> Element of COMPLEX ;
coherence
exp z is Element of COMPLEX
by XCMPLX_0:def 2;
end;

theorem :: SIN_COS:24
for z1, z2 being complex number holds exp (z1 + z2) = (exp z1) * (exp z2)
proof end;

begin

definition
func sin -> Function of REAL,REAL means :Def20: :: SIN_COS:def 20
for d being Element of REAL holds it . d = Im (Sum ((d * <i>) ExpSeq));
existence
ex b1 being Function of REAL,REAL st
for d being Element of REAL holds b1 . d = Im (Sum ((d * <i>) ExpSeq))
proof end;
uniqueness
for b1, b2 being Function of REAL,REAL st ( for d being Element of REAL holds b1 . d = Im (Sum ((d * <i>) ExpSeq)) ) & ( for d being Element of REAL holds b2 . d = Im (Sum ((d * <i>) ExpSeq)) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def20 defines sin SIN_COS:def 20 :
for b1 being Function of REAL,REAL holds
( b1 = sin iff for d being Element of REAL holds b1 . d = Im (Sum ((d * <i>) ExpSeq)) );

definition
let th be real number ;
func sin th -> set equals :: SIN_COS:def 21
sin . th;
coherence
sin . th is set
;
end;

:: deftheorem defines sin SIN_COS:def 21 :
for th being real number holds sin th = sin . th;

registration
let th be real number ;
cluster sin th -> real ;
coherence
sin th is real
;
end;

definition
let th be Real;
:: original: sin
redefine func sin th -> Real;
coherence
sin th is Real
;
end;

definition
func cos -> Function of REAL,REAL means :Def22: :: SIN_COS:def 22
for d being Real holds it . d = Re (Sum ((d * <i>) ExpSeq));
existence
ex b1 being Function of REAL,REAL st
for d being Real holds b1 . d = Re (Sum ((d * <i>) ExpSeq))
proof end;
uniqueness
for b1, b2 being Function of REAL,REAL st ( for d being Real holds b1 . d = Re (Sum ((d * <i>) ExpSeq)) ) & ( for d being Real holds b2 . d = Re (Sum ((d * <i>) ExpSeq)) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def22 defines cos SIN_COS:def 22 :
for b1 being Function of REAL,REAL holds
( b1 = cos iff for d being Real holds b1 . d = Re (Sum ((d * <i>) ExpSeq)) );

definition
let th be real number ;
func cos th -> set equals :: SIN_COS:def 23
cos . th;
coherence
cos . th is set
;
end;

:: deftheorem defines cos SIN_COS:def 23 :
for th being real number holds cos th = cos . th;

registration
let th be real number ;
cluster cos th -> real ;
coherence
cos th is real
;
end;

definition
let th be Real;
:: original: cos
redefine func cos th -> Real;
coherence
cos th is Real
;
end;

theorem :: SIN_COS:25
canceled;

theorem :: SIN_COS:26
canceled;

theorem Th27: :: SIN_COS:27
( dom sin = REAL & dom cos = REAL ) by FUNCT_2:def 1;

Lm3: for th being Real holds Sum ((th * <i>) ExpSeq) = (cos . th) + ((sin . th) * <i>)
proof end;

theorem :: SIN_COS:28
for th being Real holds exp (th * <i>) = (cos th) + ((sin th) * <i>)
proof end;

Lm4: for th being Real holds (Sum ((th * <i>) ExpSeq)) *' = Sum ((- (th * <i>)) ExpSeq)
proof end;

theorem :: SIN_COS:29
for th being Real holds (exp (th * <i>)) *' = exp (- (th * <i>))
proof end;

Lm5: for th being Real
for th1 being real number st th = th1 holds
( |.(Sum ((th * <i>) ExpSeq)).| = 1 & abs (sin . th1) <= 1 & abs (cos . th1) <= 1 )
proof end;

theorem :: SIN_COS:30
for th being Real holds
( |.(exp (th * <i>)).| = 1 & ( for th being real number holds
( abs (sin th) <= 1 & abs (cos th) <= 1 ) ) )
proof end;

theorem Th31: :: SIN_COS:31
for th being real number holds
( ((cos . th) ^2) + ((sin . th) ^2) = 1 & ((cos . th) * (cos . th)) + ((sin . th) * (sin . th)) = 1 )
proof end;

theorem :: SIN_COS:32
for th being real number holds
( ((cos th) ^2) + ((sin th) ^2) = 1 & ((cos th) * (cos th)) + ((sin th) * (sin th)) = 1 ) by Th31;

theorem Th33: :: SIN_COS:33
for th being real number holds
( cos . 0 = 1 & sin . 0 = 0 & cos . (- th) = cos . th & sin . (- th) = - (sin . th) )
proof end;

theorem :: SIN_COS:34
for th being real number holds
( cos 0 = 1 & sin 0 = 0 & cos (- th) = cos th & sin (- th) = - (sin th) ) by Th33;

definition
let th be real number ;
deffunc H1( Element of NAT ) -> Element of REAL = (((- 1) |^ $1) * (th |^ ((2 * $1) + 1))) / (((2 * $1) + 1) !);
func th P_sin -> Real_Sequence means :Def24: :: SIN_COS:def 24
for n being Element of NAT holds it . n = (((- 1) |^ n) * (th |^ ((2 * n) + 1))) / (((2 * n) + 1) !);
existence
ex b1 being Real_Sequence st
for n being Element of NAT holds b1 . n = (((- 1) |^ n) * (th |^ ((2 * n) + 1))) / (((2 * n) + 1) !)
proof end;
uniqueness
for b1, b2 being Real_Sequence st ( for n being Element of NAT holds b1 . n = (((- 1) |^ n) * (th |^ ((2 * n) + 1))) / (((2 * n) + 1) !) ) & ( for n being Element of NAT holds b2 . n = (((- 1) |^ n) * (th |^ ((2 * n) + 1))) / (((2 * n) + 1) !) ) holds
b1 = b2
proof end;
deffunc H2( Element of NAT ) -> Element of REAL = (((- 1) |^ $1) * (th |^ (2 * $1))) / ((2 * $1) !);
func th P_cos -> Real_Sequence means :Def25: :: SIN_COS:def 25
for n being Element of NAT holds it . n = (((- 1) |^ n) * (th |^ (2 * n))) / ((2 * n) !);
existence
ex b1 being Real_Sequence st
for n being Element of NAT holds b1 . n = (((- 1) |^ n) * (th |^ (2 * n))) / ((2 * n) !)
proof end;
uniqueness
for b1, b2 being Real_Sequence st ( for n being Element of NAT holds b1 . n = (((- 1) |^ n) * (th |^ (2 * n))) / ((2 * n) !) ) & ( for n being Element of NAT holds b2 . n = (((- 1) |^ n) * (th |^ (2 * n))) / ((2 * n) !) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def24 defines P_sin SIN_COS:def 24 :
for th being real number
for b2 being Real_Sequence holds
( b2 = th P_sin iff for n being Element of NAT holds b2 . n = (((- 1) |^ n) * (th |^ ((2 * n) + 1))) / (((2 * n) + 1) !) );

:: deftheorem Def25 defines P_cos SIN_COS:def 25 :
for th being real number
for b2 being Real_Sequence holds
( b2 = th P_cos iff for n being Element of NAT holds b2 . n = (((- 1) |^ n) * (th |^ (2 * n))) / ((2 * n) !) );

theorem Th35: :: SIN_COS:35
for z being complex number
for k being Element of NAT holds
( z |^ (2 * k) = (z |^ k) |^ 2 & z |^ (2 * k) = (z |^ 2) |^ k )
proof end;

theorem Th36: :: SIN_COS:36
for k being Element of NAT
for th being Real holds
( (th * <i>) |^ (2 * k) = ((- 1) |^ k) * (th |^ (2 * k)) & (th * <i>) |^ ((2 * k) + 1) = (((- 1) |^ k) * (th |^ ((2 * k) + 1))) * <i> )
proof end;

theorem :: SIN_COS:37
for n being Element of NAT holds n ! = n ! ;

theorem Th38: :: SIN_COS:38
for n being Element of NAT
for th being Real holds
( (Partial_Sums (th P_sin)) . n = (Partial_Sums (Im ((th * <i>) ExpSeq))) . ((2 * n) + 1) & (Partial_Sums (th P_cos)) . n = (Partial_Sums (Re ((th * <i>) ExpSeq))) . (2 * n) )
proof end;

theorem Th39: :: SIN_COS:39
for th being Real holds
( Partial_Sums (th P_sin) is convergent & Sum (th P_sin) = Im (Sum ((th * <i>) ExpSeq)) & Partial_Sums (th P_cos) is convergent & Sum (th P_cos) = Re (Sum ((th * <i>) ExpSeq)) )
proof end;

theorem Th40: :: SIN_COS:40
for th being real number holds
( cos . th = Sum (th P_cos) & sin . th = Sum (th P_sin) )
proof end;

theorem :: SIN_COS:41
for p, th being real number
for rseq being Real_Sequence st rseq is convergent & lim rseq = th & ( for n being Element of NAT holds rseq . n >= p ) holds
th >= p by PREPOWER:2;

deffunc H1( Real) -> Element of REAL = (2 * $1) + 1;

consider bq being Real_Sequence such that
Lm6: for n being Element of NAT holds bq . n = H1(n) from SEQ_1:sch 1();

bq is increasing sequence of NAT
proof end;

then reconsider bq = bq as increasing sequence of NAT ;

Lm7: for n being Element of NAT
for th, th1, th2, th3 being real number holds
( th |^ (2 * n) = (th |^ n) |^ 2 & (- 1) |^ (2 * n) = 1 & (- 1) |^ ((2 * n) + 1) = - 1 )
proof end;

theorem Th42: :: SIN_COS:42
for n, k being Element of NAT st n <= k holds
n ! <= k !
proof end;

theorem Th43: :: SIN_COS:43
for n, k being Element of NAT
for th being real number st 0 <= th & th <= 1 & n <= k holds
th |^ k <= th |^ n
proof end;

theorem :: SIN_COS:44
canceled;

theorem :: SIN_COS:45
for n being Element of NAT
for th being Real holds (th |^ n) / (n !) = (th |^ n) / (n !) ;

theorem Th46: :: SIN_COS:46
for p being real number holds Im (Sum (p ExpSeq)) = 0
proof end;

theorem Th47: :: SIN_COS:47
( cos . 1 > 0 & sin . 1 > 0 & cos . 1 < sin . 1 )
proof end;

theorem Th48: :: SIN_COS:48
for th being Real holds th rExpSeq = Re (th ExpSeq)
proof end;

theorem Th49: :: SIN_COS:49
for th being Real holds
( th rExpSeq is summable & Sum (th rExpSeq) = Re (Sum (th ExpSeq)) )
proof end;

Lm8: for n being Element of NAT
for z being complex number holds
( (z ExpSeq) . 1 = z & (z ExpSeq) . 0 = 1r & |.(z |^ n).| = |.z.| |^ n )
proof end;

Lm9: for th being Real holds Sum (th ExpSeq) = Sum (th rExpSeq)
proof end;

theorem Th50: :: SIN_COS:50
for p, q being real number holds Sum ((p + q) rExpSeq) = (Sum (p rExpSeq)) * (Sum (q rExpSeq))
proof end;

definition
func exp_R -> Function of REAL,REAL means :Def26: :: SIN_COS:def 26
for d being real number holds it . d = Sum (d rExpSeq);
existence
ex b1 being Function of REAL,REAL st
for d being real number holds b1 . d = Sum (d rExpSeq)
proof end;
uniqueness
for b1, b2 being Function of REAL,REAL st ( for d being real number holds b1 . d = Sum (d rExpSeq) ) & ( for d being real number holds b2 . d = Sum (d rExpSeq) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def26 defines exp_R SIN_COS:def 26 :
for b1 being Function of REAL,REAL holds
( b1 = exp_R iff for d being real number holds b1 . d = Sum (d rExpSeq) );

definition
let th be real number ;
func exp_R th -> set equals :: SIN_COS:def 27
exp_R . th;
coherence
exp_R . th is set
;
end;

:: deftheorem defines exp_R SIN_COS:def 27 :
for th being real number holds exp_R th = exp_R . th;

registration
let th be real number ;
cluster exp_R th -> real ;
coherence
exp_R th is real
;
end;

definition
let th be Real;
:: original: exp_R
redefine func exp_R th -> Real;
coherence
exp_R th is Real
;
end;

theorem Th51: :: SIN_COS:51
dom exp_R = REAL by FUNCT_2:def 1;

theorem :: SIN_COS:52
canceled;

theorem Th53: :: SIN_COS:53
for th being Real holds exp_R . th = Re (Sum (th ExpSeq))
proof end;

theorem :: SIN_COS:54
for th being Real holds exp th = exp_R th
proof end;

Lm10: for p, q being real number holds exp_R . (p + q) = (exp_R . p) * (exp_R . q)
proof end;

theorem :: SIN_COS:55
for p, q being real number holds exp_R (p + q) = (exp_R p) * (exp_R q) by Lm10;

Lm11: exp_R . 0 = 1
proof end;

theorem :: SIN_COS:56
exp_R 0 = 1 by Lm11;

theorem Th57: :: SIN_COS:57
for th being real number st th > 0 holds
exp_R . th >= 1
proof end;

theorem Th58: :: SIN_COS:58
for th being real number st th < 0 holds
( 0 < exp_R . th & exp_R . th <= 1 )
proof end;

theorem Th59: :: SIN_COS:59
for th being real number holds exp_R . th > 0
proof end;

theorem :: SIN_COS:60
for th being real number holds exp_R th > 0 by Th59;

begin

definition
let z be complex number ;
deffunc H2( Element of NAT ) -> Element of COMPLEX = (z #N ($1 + 1)) / (($1 + 2) !);
func z P_dt -> Complex_Sequence means :Def28: :: SIN_COS:def 28
for n being Element of NAT holds it . n = (z |^ (n + 1)) / ((n + 2) !);
existence
ex b1 being Complex_Sequence st
for n being Element of NAT holds b1 . n = (z |^ (n + 1)) / ((n + 2) !)
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for n being Element of NAT holds b1 . n = (z |^ (n + 1)) / ((n + 2) !) ) & ( for n being Element of NAT holds b2 . n = (z |^ (n + 1)) / ((n + 2) !) ) holds
b1 = b2
proof end;
deffunc H3( Element of NAT ) -> Element of COMPLEX = (z #N $1) / (($1 + 2) !);
func z P_t -> Complex_Sequence means :: SIN_COS:def 29
for n being Element of NAT holds it . n = (z #N n) / ((n + 2) !);
existence
ex b1 being Complex_Sequence st
for n being Element of NAT holds b1 . n = (z #N n) / ((n + 2) !)
proof end;
uniqueness
for b1, b2 being Complex_Sequence st ( for n being Element of NAT holds b1 . n = (z #N n) / ((n + 2) !) ) & ( for n being Element of NAT holds b2 . n = (z #N n) / ((n + 2) !) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def28 defines P_dt SIN_COS:def 28 :
for z being complex number
for b2 being Complex_Sequence holds
( b2 = z P_dt iff for n being Element of NAT holds b2 . n = (z |^ (n + 1)) / ((n + 2) !) );

:: deftheorem defines P_t SIN_COS:def 29 :
for z being complex number
for b2 being Complex_Sequence holds
( b2 = z P_t iff for n being Element of NAT holds b2 . n = (z #N n) / ((n + 2) !) );

Lm12: for p being Real
for z being complex number holds
( Re ((p * <i>) * z) = - (p * (Im z)) & Im ((p * <i>) * z) = p * (Re z) & Re (p * z) = p * (Re z) & Im (p * z) = p * (Im z) )
proof end;

Lm13: for p being real number
for z being complex number st p > 0 holds
( Re (z / (p * <i>)) = (Im z) / p & Im (z / (p * <i>)) = - ((Re z) / p) & |.(z / p).| = |.z.| / p )
proof end;

theorem Th61: :: SIN_COS:61
for z being complex number holds z P_dt is absolutely_summable
proof end;

theorem Th62: :: SIN_COS:62
for z being complex number holds z * (Sum (z P_dt)) = ((Sum (z ExpSeq)) - 1r) - z
proof end;

theorem Th63: :: SIN_COS:63
for p being real number st p > 0 holds
ex q being Real st
( q > 0 & ( for z being complex number st |.z.| < q holds
|.(Sum (z P_dt)).| < p ) )
proof end;

theorem Th64: :: SIN_COS:64
for z, z1 being complex number holds (Sum ((z1 + z) ExpSeq)) - (Sum (z1 ExpSeq)) = ((Sum (z1 ExpSeq)) * z) + ((z * (Sum (z P_dt))) * (Sum (z1 ExpSeq)))
proof end;

theorem Th65: :: SIN_COS:65
for p, q being Real holds (cos . (p + q)) - (cos . p) = (- (q * (sin . p))) - (q * (Im ((Sum ((q * <i>) P_dt)) * ((cos . p) + ((sin . p) * <i>)))))
proof end;

theorem Th66: :: SIN_COS:66
for p, q being Real holds (sin . (p + q)) - (sin . p) = (q * (cos . p)) + (q * (Re ((Sum ((q * <i>) P_dt)) * ((cos . p) + ((sin . p) * <i>)))))
proof end;

theorem Th67: :: SIN_COS:67
for p, q being Real holds (exp_R . (p + q)) - (exp_R . p) = (q * (exp_R . p)) + ((q * (exp_R . p)) * (Re (Sum (q P_dt))))
proof end;

theorem Th68: :: SIN_COS:68
for p being real number holds
( cos is_differentiable_in p & diff (cos,p) = - (sin . p) )
proof end;

theorem Th69: :: SIN_COS:69
for p being real number holds
( sin is_differentiable_in p & diff (sin,p) = cos . p )
proof end;

theorem Th70: :: SIN_COS:70
for p being real number holds
( exp_R is_differentiable_in p & diff (exp_R,p) = exp_R . p )
proof end;

theorem Th71: :: SIN_COS:71
for th being real number holds
( exp_R is_differentiable_on REAL & diff (exp_R,th) = exp_R . th )
proof end;

theorem Th72: :: SIN_COS:72
for th being real number holds
( cos is_differentiable_on REAL & diff (cos,th) = - (sin . th) )
proof end;

theorem Th73: :: SIN_COS:73
for th being real number holds
( sin is_differentiable_on REAL & diff (sin,th) = cos . th )
proof end;

theorem Th74: :: SIN_COS:74
for th being real number st th in [.0,1.] holds
( 0 < cos . th & cos . th >= 1 / 2 )
proof end;

definition
func tan -> PartFunc of REAL,REAL equals :: SIN_COS:def 30
sin / cos;
coherence
sin / cos is PartFunc of REAL,REAL
;
func cot -> PartFunc of REAL,REAL equals :: SIN_COS:def 31
cos / sin;
coherence
cos / sin is PartFunc of REAL,REAL
;
end;

:: deftheorem defines tan SIN_COS:def 30 :
tan = sin / cos;

:: deftheorem defines cot SIN_COS:def 31 :
cot = cos / sin;

theorem Th75: :: SIN_COS:75
( [.0,1.] c= dom tan & ].0,1.[ c= dom tan )
proof end;

Lm14: ( dom (tan | [.0,1.]) = [.0,1.] & ( for th being real number st th in [.0,1.] holds
(tan | [.0,1.]) . th = tan . th ) )
proof end;

Lm15: ( tan is_differentiable_on ].0,1.[ & ( for th being real number st th in ].0,1.[ holds
diff (tan,th) > 0 ) )
proof end;

theorem Th76: :: SIN_COS:76
tan | [.0,1.] is continuous
proof end;

theorem Th77: :: SIN_COS:77
for th1, th2 being real number st th1 in ].0,1.[ & th2 in ].0,1.[ & tan . th1 = tan . th2 holds
th1 = th2
proof end;

Lm16: ( tan . 0 = 0 & tan . 1 > 1 )
proof end;

begin

definition
func PI -> real number means :Def32: :: SIN_COS:def 32
( tan . (it / 4) = 1 & it in ].0,4.[ );
existence
ex b1 being real number st
( tan . (b1 / 4) = 1 & b1 in ].0,4.[ )
proof end;
uniqueness
for b1, b2 being real number st tan . (b1 / 4) = 1 & b1 in ].0,4.[ & tan . (b2 / 4) = 1 & b2 in ].0,4.[ holds
b1 = b2
proof end;
end;

:: deftheorem Def32 defines PI SIN_COS:def 32 :
for b1 being real number holds
( b1 = PI iff ( tan . (b1 / 4) = 1 & b1 in ].0,4.[ ) );

definition
:: original: PI
redefine func PI -> Real;
coherence
PI is Real
by XREAL_0:def 1;
end;

theorem Th78: :: SIN_COS:78
sin . (PI / 4) = cos . (PI / 4)
proof end;

begin

theorem Th79: :: SIN_COS:79
for th1, th2 being real number holds
( sin . (th1 + th2) = ((sin . th1) * (cos . th2)) + ((cos . th1) * (sin . th2)) & cos . (th1 + th2) = ((cos . th1) * (cos . th2)) - ((sin . th1) * (sin . th2)) )
proof end;

theorem :: SIN_COS:80
for th1, th2 being real number holds
( sin (th1 + th2) = ((sin th1) * (cos th2)) + ((cos th1) * (sin th2)) & cos (th1 + th2) = ((cos th1) * (cos th2)) - ((sin th1) * (sin th2)) ) by Th79;

theorem Th81: :: SIN_COS:81
( cos . (PI / 2) = 0 & sin . (PI / 2) = 1 & cos . PI = - 1 & sin . PI = 0 & cos . (PI + (PI / 2)) = 0 & sin . (PI + (PI / 2)) = - 1 & cos . (2 * PI) = 1 & sin . (2 * PI) = 0 )
proof end;

theorem :: SIN_COS:82
( cos (PI / 2) = 0 & sin (PI / 2) = 1 & cos PI = - 1 & sin PI = 0 & cos (PI + (PI / 2)) = 0 & sin (PI + (PI / 2)) = - 1 & cos (2 * PI) = 1 & sin (2 * PI) = 0 ) by Th81;

theorem Th83: :: SIN_COS:83
for th being real number holds
( sin . (th + (2 * PI)) = sin . th & cos . (th + (2 * PI)) = cos . th & sin . ((PI / 2) - th) = cos . th & cos . ((PI / 2) - th) = sin . th & sin . ((PI / 2) + th) = cos . th & cos . ((PI / 2) + th) = - (sin . th) & sin . (PI + th) = - (sin . th) & cos . (PI + th) = - (cos . th) )
proof end;

theorem :: SIN_COS:84
for th being real number holds
( sin (th + (2 * PI)) = sin th & cos (th + (2 * PI)) = cos th & sin ((PI / 2) - th) = cos th & cos ((PI / 2) - th) = sin th & sin ((PI / 2) + th) = cos th & cos ((PI / 2) + th) = - (sin th) & sin (PI + th) = - (sin th) & cos (PI + th) = - (cos th) ) by Th83;

Lm17: for th being real number st th in [.0,1.] holds
sin . th >= 0
proof end;

theorem Th85: :: SIN_COS:85
for th being real number st th in ].0,(PI / 2).[ holds
cos . th > 0
proof end;

theorem :: SIN_COS:86
for th being real number st th in ].0,(PI / 2).[ holds
cos th > 0 by Th85;

begin

theorem :: SIN_COS:87
canceled;

theorem :: SIN_COS:88
for a, b being real number holds sin (a - b) = ((sin a) * (cos b)) - ((cos a) * (sin b))
proof end;

theorem :: SIN_COS:89
for a, b being real number holds cos (a - b) = ((cos a) * (cos b)) + ((sin a) * (sin b))
proof end;

registration
cluster sin -> continuous ;
coherence
sin is continuous
proof end;
cluster cos -> continuous ;
coherence
cos is continuous
proof end;
cluster exp_R -> continuous ;
coherence
exp_R is continuous
proof end;
end;