:: Integers
:: by Micha{\l} J. Trybulec
::
:: Copyright (c) 1990-2012 Association of Mizar Users

begin

Lm1: for z being set st z in \ holds
ex k being Element of NAT st z = - k

proof end;

Lm2: for x being set
for k being Element of NAT st x = - k & k <> x holds
x in \

proof end;

definition
redefine func INT means :Def1: :: INT_1:def 1
for x being set holds
( x in it iff ex k being Element of NAT st
( x = k or x = - k ) );
compatibility
for b1 being set holds
( b1 = INT iff for x being set holds
( x in b1 iff ex k being Element of NAT st
( x = k or x = - k ) ) )
proof end;
end;

:: deftheorem Def1 defines INT INT_1:def 1 :
for b1 being set holds
( b1 = INT iff for x being set holds
( x in b1 iff ex k being Element of NAT st
( x = k or x = - k ) ) );

definition
let i be number ;
attr i is integer means :Def2: :: INT_1:def 2
i in INT ;
end;

:: deftheorem Def2 defines integer INT_1:def 2 :
for i being number holds
( i is integer iff i in INT );

registration
existence
ex b1 being Real st b1 is integer
proof end;
existence
ex b1 being number st b1 is integer
proof end;
cluster -> integer for Element of INT ;
coherence
for b1 being Element of INT holds b1 is integer
by Def2;
end;

definition end;

theorem Th1: :: INT_1:1
for r being real number
for k being Nat st ( r = k or r = - k ) holds
r is Integer
proof end;

theorem Th2: :: INT_1:2
for r being real number st r is Integer holds
ex k being Element of NAT st
( r = k or r = - k )
proof end;

:: Relations between sets INT, NAT and REAL ( and their elements )
registration
cluster natural -> integer for set ;
coherence
for b1 being number st b1 is natural holds
b1 is integer
by Th1;
end;

Lm3: for x being set st x in INT holds
x in REAL

by NUMBERS:15;

registration
cluster integer -> real for set ;
coherence
for b1 being number st b1 is integer holds
b1 is real
proof end;
end;

registration
let i1, i2 be Integer;
cluster i1 + i2 -> integer ;
coherence
i1 + i2 is integer
proof end;
cluster i1 * i2 -> integer ;
coherence
i1 * i2 is integer
proof end;
end;

registration
let i0 be Integer;
cluster - i0 -> integer ;
coherence
- i0 is integer
proof end;
end;

registration
let i1, i2 be Integer;
cluster i1 - i2 -> integer ;
coherence
i1 - i2 is integer
proof end;
end;

:: Some basic theorems about integers
theorem Th3: :: INT_1:3
for i0 being Integer st 0 <= i0 holds
i0 in NAT
proof end;

theorem :: INT_1:4
for r being real number st r is Integer holds
( r + 1 is Integer & r - 1 is Integer ) ;

theorem Th5: :: INT_1:5
for i2, i1 being Integer st i2 <= i1 holds
i1 - i2 in NAT
proof end;

theorem Th6: :: INT_1:6
for k being Element of NAT
for i1, i2 being Integer st i1 + k = i2 holds
i1 <= i2
proof end;

Lm4: for j being Element of NAT st j < 1 holds
j = 0

proof end;

Lm5: for i1 being Integer st 0 < i1 holds
1 <= i1

proof end;

theorem Th7: :: INT_1:7
for i0, i1 being Integer st i0 < i1 holds
i0 + 1 <= i1
proof end;

theorem Th8: :: INT_1:8
for i1 being Integer st i1 < 0 holds
i1 <= - 1
proof end;

theorem Th9: :: INT_1:9
for i1, i2 being Integer holds
( i1 * i2 = 1 iff ( ( i1 = 1 & i2 = 1 ) or ( i1 = - 1 & i2 = - 1 ) ) )
proof end;

theorem :: INT_1:10
for i1, i2 being Integer holds
( i1 * i2 = - 1 iff ( ( i1 = - 1 & i2 = 1 ) or ( i1 = 1 & i2 = - 1 ) ) )
proof end;

Lm6: for i0, i1 being Integer st i0 <= i1 holds
ex k being Element of NAT st i0 + k = i1

proof end;

Lm7: for i0, i1 being Integer st i0 <= i1 holds
ex k being Element of NAT st i1 - k = i0

proof end;

scheme :: INT_1:sch 1
SepInt{ P1[ Integer] } :
ex X being Subset of INT st
for x being Integer holds
( x in X iff P1[x] )
proof end;

scheme :: INT_1:sch 2
IntIndUp{ F1() -> Integer, P1[ Integer] } :
for i0 being Integer st F1() <= i0 holds
P1[i0]
provided
A1: P1[F1()] and
A2: for i2 being Integer st F1() <= i2 & P1[i2] holds
P1[i2 + 1]
proof end;

scheme :: INT_1:sch 3
IntIndDown{ F1() -> Integer, P1[ Integer] } :
for i0 being Integer st i0 <= F1() holds
P1[i0]
provided
A1: P1[F1()] and
A2: for i2 being Integer st i2 <= F1() & P1[i2] holds
P1[i2 - 1]
proof end;

scheme :: INT_1:sch 4
IntIndFull{ F1() -> Integer, P1[ Integer] } :
for i0 being Integer holds P1[i0]
provided
A1: P1[F1()] and
A2: for i2 being Integer st P1[i2] holds
( P1[i2 - 1] & P1[i2 + 1] )
proof end;

scheme :: INT_1:sch 5
IntMin{ F1() -> Integer, P1[ Integer] } :
ex i0 being Integer st
( P1[i0] & ( for i1 being Integer st P1[i1] holds
i0 <= i1 ) )
provided
A1: for i1 being Integer st P1[i1] holds
F1() <= i1 and
A2: ex i1 being Integer st P1[i1]
proof end;

scheme :: INT_1:sch 6
IntMax{ F1() -> Integer, P1[ Integer] } :
ex i0 being Integer st
( P1[i0] & ( for i1 being Integer st P1[i1] holds
i1 <= i0 ) )
provided
A1: for i1 being Integer st P1[i1] holds
i1 <= F1() and
A2: ex i1 being Integer st P1[i1]
proof end;

:: The divisibility relation
definition
let i1, i2 be Integer;
pred i1 divides i2 means :Def3: :: INT_1:def 3
ex i3 being Integer st i2 = i1 * i3;
reflexivity
for i1 being Integer ex i3 being Integer st i1 = i1 * i3
proof end;
end;

:: deftheorem Def3 defines divides INT_1:def 3 :
for i1, i2 being Integer holds
( i1 divides i2 iff ex i3 being Integer st i2 = i1 * i3 );

definition
let i1, i2, i3 be Integer;
pred i1,i2 are_congruent_mod i3 means :: INT_1:def 4
i3 divides i1 - i2;
end;

:: deftheorem defines are_congruent_mod INT_1:def 4 :
for i1, i2, i3 being Integer holds
( i1,i2 are_congruent_mod i3 iff i3 divides i1 - i2 );

definition
let i1, i2, i3 be Integer;
redefine pred i1,i2 are_congruent_mod i3 means :Def5: :: INT_1:def 5
ex i4 being Integer st i3 * i4 = i1 - i2;
compatibility
( i1,i2 are_congruent_mod i3 iff ex i4 being Integer st i3 * i4 = i1 - i2 )
proof end;
end;

:: deftheorem Def5 defines are_congruent_mod INT_1:def 5 :
for i1, i2, i3 being Integer holds
( i1,i2 are_congruent_mod i3 iff ex i4 being Integer st i3 * i4 = i1 - i2 );

theorem :: INT_1:11
for i1, i2 being Integer holds i1,i1 are_congruent_mod i2
proof end;

theorem :: INT_1:12
for i1 being Integer holds
( i1, 0 are_congruent_mod i1 & 0 ,i1 are_congruent_mod i1 )
proof end;

theorem :: INT_1:13
for i1, i2 being Integer holds i1,i2 are_congruent_mod 1
proof end;

theorem :: INT_1:14
for i1, i2, i3 being Integer st i1,i2 are_congruent_mod i3 holds
i2,i1 are_congruent_mod i3
proof end;

theorem :: INT_1:15
for i1, i2, i5, i3 being Integer st i1,i2 are_congruent_mod i5 & i2,i3 are_congruent_mod i5 holds
i1,i3 are_congruent_mod i5
proof end;

theorem :: INT_1:16
for i1, i2, i5, i3, i4 being Integer st i1,i2 are_congruent_mod i5 & i3,i4 are_congruent_mod i5 holds
i1 + i3,i2 + i4 are_congruent_mod i5
proof end;

theorem :: INT_1:17
for i1, i2, i5, i3, i4 being Integer st i1,i2 are_congruent_mod i5 & i3,i4 are_congruent_mod i5 holds
i1 - i3,i2 - i4 are_congruent_mod i5
proof end;

theorem :: INT_1:18
for i1, i2, i5, i3, i4 being Integer st i1,i2 are_congruent_mod i5 & i3,i4 are_congruent_mod i5 holds
i1 * i3,i2 * i4 are_congruent_mod i5
proof end;

theorem :: INT_1:19
for i1, i2, i3, i5 being Integer holds
( i1 + i2,i3 are_congruent_mod i5 iff i1,i3 - i2 are_congruent_mod i5 )
proof end;

theorem :: INT_1:20
for i4, i5, i3, i1, i2 being Integer st i4 * i5 = i3 & i1,i2 are_congruent_mod i3 holds
i1,i2 are_congruent_mod i4
proof end;

theorem :: INT_1:21
for i1, i2, i5 being Integer holds
( i1,i2 are_congruent_mod i5 iff i1 + i5,i2 are_congruent_mod i5 )
proof end;

theorem :: INT_1:22
for i1, i2, i5 being Integer holds
( i1,i2 are_congruent_mod i5 iff i1 - i5,i2 are_congruent_mod i5 )
proof end;

theorem Th23: :: INT_1:23
for r being real number
for i1, i2 being Integer st i1 <= r & r - 1 < i1 & i2 <= r & r - 1 < i2 holds
i1 = i2
proof end;

theorem Th24: :: INT_1:24
for r being real number
for i1, i2 being Integer st r <= i1 & i1 < r + 1 & r <= i2 & i2 < r + 1 holds
i1 = i2
proof end;

Lm8: for r being real number ex n being Element of NAT st r < n
proof end;

definition
let r be real number ;
func [\r/] -> Integer means :Def6: :: INT_1:def 6
( it <= r & r - 1 < it );
existence
ex b1 being Integer st
( b1 <= r & r - 1 < b1 )
proof end;
uniqueness
for b1, b2 being Integer st b1 <= r & r - 1 < b1 & b2 <= r & r - 1 < b2 holds
b1 = b2
by Th23;
projectivity
for b1 being Integer
for b2 being real number st b1 <= b2 & b2 - 1 < b1 holds
( b1 <= b1 & b1 - 1 < b1 )
by XREAL_1:44;
end;

:: deftheorem Def6 defines [\ INT_1:def 6 :
for r being real number
for b2 being Integer holds
( b2 = [\r/] iff ( b2 <= r & r - 1 < b2 ) );

theorem Th25: :: INT_1:25
for r being real number holds
( [\r/] = r iff r is integer )
proof end;

theorem Th26: :: INT_1:26
for r being real number holds
( [\r/] < r iff not r is integer )
proof end;

theorem :: INT_1:27
for r being real number holds
( [\r/] - 1 < r & [\r/] < r + 1 )
proof end;

theorem Th28: :: INT_1:28
for r being real number
for i0 being Integer holds [\r/] + i0 = [\(r + i0)/]
proof end;

theorem Th29: :: INT_1:29
for r being real number holds r < [\r/] + 1
proof end;

definition
let r be real number ;
func [/r\] -> Integer means :Def7: :: INT_1:def 7
( r <= it & it < r + 1 );
existence
ex b1 being Integer st
( r <= b1 & b1 < r + 1 )
proof end;
uniqueness
for b1, b2 being Integer st r <= b1 & b1 < r + 1 & r <= b2 & b2 < r + 1 holds
b1 = b2
by Th24;
projectivity
for b1 being Integer
for b2 being real number st b2 <= b1 & b1 < b2 + 1 holds
( b1 <= b1 & b1 < b1 + 1 )
by XREAL_1:29;
end;

:: deftheorem Def7 defines [/ INT_1:def 7 :
for r being real number
for b2 being Integer holds
( b2 = [/r\] iff ( r <= b2 & b2 < r + 1 ) );

theorem Th30: :: INT_1:30
for r being real number holds
( [/r\] = r iff r is integer )
proof end;

theorem Th31: :: INT_1:31
for r being real number holds
( r < [/r\] iff not r is integer )
proof end;

theorem :: INT_1:32
for r being real number holds
( r - 1 < [/r\] & r < [/r\] + 1 )
proof end;

theorem :: INT_1:33
for r being real number
for i0 being Integer holds [/r\] + i0 = [/(r + i0)\]
proof end;

theorem Th34: :: INT_1:34
for r being real number holds
( [\r/] = [/r\] iff r is integer )
proof end;

theorem Th35: :: INT_1:35
for r being real number holds
( [\r/] < [/r\] iff not r is integer )
proof end;

theorem :: INT_1:36
for r being real number holds [\r/] <= [/r\]
proof end;

theorem :: INT_1:37
for r being real number holds = [/r\] by Th25;

theorem :: INT_1:38
canceled;

theorem :: INT_1:39
canceled;

theorem :: INT_1:40
for r being real number holds = [\r/] by Th30;

theorem :: INT_1:41
for r being real number holds
( [\r/] = [/r\] iff not [\r/] + 1 = [/r\] )
proof end;

definition
let r be real number ;
func frac r -> set equals :: INT_1:def 8
r - [\r/];
coherence
r - [\r/] is set
;
end;

:: deftheorem defines frac INT_1:def 8 :
for r being real number holds frac r = r - [\r/];

registration
let r be real number ;
cluster frac r -> real ;
coherence
frac r is real
;
end;

definition
let r be real number ;
:: original: frac
redefine func frac r -> Real;
coherence
frac r is Real
by XREAL_0:def 1;
end;

theorem :: INT_1:42
for r being real number holds r = [\r/] + (frac r) ;

theorem Th43: :: INT_1:43
for r being real number holds
( frac r < 1 & 0 <= frac r )
proof end;

theorem :: INT_1:44
for r being real number holds [\(frac r)/] = 0
proof end;

theorem Th45: :: INT_1:45
for r being real number holds
( frac r = 0 iff r is integer )
proof end;

theorem :: INT_1:46
for r being real number holds
( 0 < frac r iff not r is integer )
proof end;

:: Functions div and mod
definition
let i1, i2 be Integer;
func i1 div i2 -> Integer equals :: INT_1:def 9
[\(i1 / i2)/];
correctness
coherence
[\(i1 / i2)/] is Integer
;
;
end;

:: deftheorem defines div INT_1:def 9 :
for i1, i2 being Integer holds i1 div i2 = [\(i1 / i2)/];

definition
let i1, i2 be Integer;
func i1 mod i2 -> Integer equals :Def10: :: INT_1:def 10
i1 - ((i1 div i2) * i2) if i2 <> 0
otherwise 0 ;
correctness
coherence
( ( i2 <> 0 implies i1 - ((i1 div i2) * i2) is Integer ) & ( not i2 <> 0 implies 0 is Integer ) )
;
consistency
for b1 being Integer holds verum
;
;
end;

:: deftheorem Def10 defines mod INT_1:def 10 :
for i1, i2 being Integer holds
( ( i2 <> 0 implies i1 mod i2 = i1 - ((i1 div i2) * i2) ) & ( not i2 <> 0 implies i1 mod i2 = 0 ) );

theorem Th47: :: INT_1:47
for r being real number st r <> 0 holds
[\(r / r)/] = 1
proof end;

theorem :: INT_1:48
for i being Integer holds i div 0 = 0
proof end;

theorem :: INT_1:49
for i being Integer st i <> 0 holds
i div i = 1 by Th47;

theorem :: INT_1:50
for i being Integer holds i mod i = 0
proof end;

begin

:: from FSM_1
theorem :: INT_1:51
for k, i being Integer st k < i holds
ex j being Element of NAT st
( j = i - k & 1 <= j )
proof end;

:: from SCMFSA_7, 2005.02.05, A.T.
theorem Th52: :: INT_1:52
for a, b being Integer st a < b holds
a <= b - 1
proof end;

:: from UNIFORM1, 2005.08.22, A.T.
theorem :: INT_1:53
for r being real number st r >= 0 holds
( [/r\] >= 0 & [\r/] >= 0 & [/r\] is Element of NAT & [\r/] is Element of NAT )
proof end;

:: from SCMFSA9A, 2005.11.16, A.T.
theorem Th54: :: INT_1:54
for i being Integer
for r being real number st i <= r holds
i <= [\r/]
proof end;

theorem :: INT_1:55
for m, n being Nat holds 0 <= m div n by Th54;

:: from SCMFSA9A, 2006.03.14, A.T.
theorem :: INT_1:56
for i, j being Integer st 0 < i & 1 < j holds
i div j < i
proof end;

:: from NEWTON, 2007.01.02, AK
theorem :: INT_1:57
for i2, i1 being Integer st i2 >= 0 holds
i1 mod i2 >= 0
proof end;

theorem :: INT_1:58
for i2, i1 being Integer st i2 > 0 holds
i1 mod i2 < i2
proof end;

theorem :: INT_1:59
for i2, i1 being Integer st i2 <> 0 holds
i1 = ((i1 div i2) * i2) + (i1 mod i2)
proof end;

:: from AMI_3, 2007.06.14, A.T.
theorem :: INT_1:60
for m, j being Integer holds m * j, 0 are_congruent_mod m
proof end;

:: from AMI_4, 2007.06.14, A.T.
theorem :: INT_1:61
for i, j being Integer st i >= 0 & j >= 0 holds
i div j >= 0
proof end;

:: from INT_3, 2007.07.27, A.T.
theorem :: INT_1:62
for n being Nat st n > 0 holds
for a being Integer holds
( a mod n = 0 iff n divides a )
proof end;

theorem :: INT_1:63
for r, s being real number st r / s is not Integer holds
- [\(r / s)/] = [\((- r) / s)/] + 1
proof end;

theorem :: INT_1:64
for r, s being real number st r / s is Integer holds
- [\(r / s)/] = [\((- r) / s)/]
proof end;

:: missing, 2008.05.16, A.T.
theorem :: INT_1:65
for i being Integer
for r being real number st r <= i holds
[/r\] <= i
proof end;

:: from POLYNOM2, 2010.02.13, A.T.
scheme :: INT_1:sch 7
FinInd{ F1() -> Element of NAT , F2() -> Element of NAT , P1[ Nat] } :
for i being Element of NAT st F1() <= i & i <= F2() holds
P1[i]
provided
A1: P1[F1()] and
A2: for j being Element of NAT st F1() <= j & j < F2() & P1[j] holds
P1[j + 1]
proof end;

scheme :: INT_1:sch 8
FinInd2{ F1() -> Element of NAT , F2() -> Element of NAT , P1[ Nat] } :
for i being Element of NAT st F1() <= i & i <= F2() holds
P1[i]
provided
A1: P1[F1()] and
A2: for j being Element of NAT st F1() <= j & j < F2() & ( for j9 being Element of NAT st F1() <= j9 & j9 <= j holds
P1[j9] ) holds
P1[j + 1]
proof end;

theorem :: INT_1:66
for i being Integer
for r being real number holds frac (r + i) = frac r
proof end;

theorem Th67: :: INT_1:67
for r, a being real number st r <= a & a < [\r/] + 1 holds
[\a/] = [\r/]
proof end;

theorem Th68: :: INT_1:68
for r, a being real number st r <= a & a < [\r/] + 1 holds
frac r <= frac a
proof end;

theorem :: INT_1:69
for r, a being real number st r < a & a < [\r/] + 1 holds
frac r < frac a
proof end;

theorem Th70: :: INT_1:70
for a, r being real number st a >= [\r/] + 1 & a <= r + 1 holds
[\a/] = [\r/] + 1
proof end;

theorem Th71: :: INT_1:71
for a, r being real number st a >= [\r/] + 1 & a < r + 1 holds
frac a < frac r
proof end;

theorem :: INT_1:72
for r, a, b being real number st r <= a & a < r + 1 & r <= b & b < r + 1 & frac a = frac b holds
a = b
proof end;