:: RADIX_2 semantic presentation

theorem Th1: :: RADIX_2:1
for b1 being Nat holds b1 mod 1 = 0
proof end;

theorem Th2: :: RADIX_2:2
for b1, b2 being Integer
for b3 being Nat st b3 > 0 holds
((b1 mod b3) + (b2 mod b3)) mod b3 = (b1 + (b2 mod b3)) mod b3
proof end;

theorem Th3: :: RADIX_2:3
for b1, b2 being Integer
for b3 being Nat st b3 > 0 holds
(b1 * b2) mod b3 = (b1 * (b2 mod b3)) mod b3
proof end;

theorem Th4: :: RADIX_2:4
for b1, b2, b3 being Nat st 1 <= b3 & 0 < b2 holds
(b1 mod (b2 |^ b3)) div (b2 |^ (b3 -' 1)) = (b1 div (b2 |^ (b3 -' 1))) mod b2
proof end;

theorem Th5: :: RADIX_2:5
for b1, b2 being Nat st b1 in Seg b2 holds
b1 + 1 in Seg (b2 + 1)
proof end;

theorem Th6: :: RADIX_2:6
for b1 being Nat holds Radix b1 > 0
proof end;

theorem Th7: :: RADIX_2:7
for b1 being Nat
for b2 being Tuple of 1,(b1 -SD ) holds SDDec b2 = DigA b2,1
proof end;

theorem Th8: :: RADIX_2:8
for b1 being Nat
for b2 being Integer holds (SD_Add_Data b2,b1) + ((SD_Add_Carry b2) * (Radix b1)) = b2
proof end;

theorem Th9: :: RADIX_2:9
for b1, b2 being Nat
for b3 being Tuple of (b2 + 1),(b1 -SD )
for b4 being Tuple of b2,(b1 -SD ) st ( for b5 being Nat st b5 in Seg b2 holds
b3 . b5 = b4 . b5 ) holds
Sum (DigitSD b3) = Sum ((DigitSD b4) ^ <*(SubDigit b3,(b2 + 1),b1)*>)
proof end;

theorem Th10: :: RADIX_2:10
for b1, b2 being Nat
for b3 being Tuple of (b2 + 1),(b1 -SD )
for b4 being Tuple of b2,(b1 -SD ) st ( for b5 being Nat st b5 in Seg b2 holds
b3 . b5 = b4 . b5 ) holds
(SDDec b4) + (((Radix b1) |^ b2) * (DigA b3,(b2 + 1))) = SDDec b3
proof end;

theorem Th11: :: RADIX_2:11
for b1, b2 being Nat st b2 >= 1 holds
for b3, b4 being Tuple of b2,(b1 -SD ) st b1 >= 2 holds
(SDDec (b3 '+' b4)) + ((SD_Add_Carry ((DigA b3,b2) + (DigA b4,b2))) * ((Radix b1) |^ b2)) = (SDDec b3) + (SDDec b4)
proof end;

definition
let c1, c2, c3 be Nat;
let c4 be Tuple of c3,NAT ;
func SubDigit2 c4,c1,c2 -> Element of NAT equals :: RADIX_2:def 1
((Radix a2) |^ (a1 -' 1)) * (a4 . a1);
coherence
((Radix c2) |^ (c1 -' 1)) * (c4 . c1) is Element of NAT
;
end;

:: deftheorem Def1 defines SubDigit2 RADIX_2:def 1 :
for b1, b2, b3 being Nat
for b4 being Tuple of b3,NAT holds SubDigit2 b4,b1,b2 = ((Radix b2) |^ (b1 -' 1)) * (b4 . b1);

definition
let c1, c2 be Nat;
let c3 be Tuple of c1,NAT ;
func DigitSD2 c3,c2 -> Tuple of a1,NAT means :Def2: :: RADIX_2:def 2
for b1 being Nat st b1 in Seg a1 holds
a4 /. b1 = SubDigit2 a3,b1,a2;
existence
ex b1 being Tuple of c1,NAT st
for b2 being Nat st b2 in Seg c1 holds
b1 /. b2 = SubDigit2 c3,b2,c2
proof end;
uniqueness
for b1, b2 being Tuple of c1,NAT st ( for b3 being Nat st b3 in Seg c1 holds
b1 /. b3 = SubDigit2 c3,b3,c2 ) & ( for b3 being Nat st b3 in Seg c1 holds
b2 /. b3 = SubDigit2 c3,b3,c2 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def2 defines DigitSD2 RADIX_2:def 2 :
for b1, b2 being Nat
for b3, b4 being Tuple of b1,NAT holds
( b4 = DigitSD2 b3,b2 iff for b5 being Nat st b5 in Seg b1 holds
b4 /. b5 = SubDigit2 b3,b5,b2 );

definition
let c1, c2 be Nat;
let c3 be Tuple of c1,NAT ;
func SDDec2 c3,c2 -> Nat equals :: RADIX_2:def 3
Sum (DigitSD2 a3,a2);
coherence
Sum (DigitSD2 c3,c2) is Nat
;
end;

:: deftheorem Def3 defines SDDec2 RADIX_2:def 3 :
for b1, b2 being Nat
for b3 being Tuple of b1,NAT holds SDDec2 b3,b2 = Sum (DigitSD2 b3,b2);

definition
let c1, c2, c3 be Nat;
func DigitDC2 c3,c1,c2 -> Nat equals :: RADIX_2:def 4
(a3 mod ((Radix a2) |^ a1)) div ((Radix a2) |^ (a1 -' 1));
coherence
(c3 mod ((Radix c2) |^ c1)) div ((Radix c2) |^ (c1 -' 1)) is Nat
;
end;

:: deftheorem Def4 defines DigitDC2 RADIX_2:def 4 :
for b1, b2, b3 being Nat holds DigitDC2 b3,b1,b2 = (b3 mod ((Radix b2) |^ b1)) div ((Radix b2) |^ (b1 -' 1));

definition
let c1, c2, c3 be Nat;
func DecSD2 c3,c2,c1 -> Tuple of a2,NAT means :Def5: :: RADIX_2:def 5
for b1 being Nat st b1 in Seg a2 holds
a4 . b1 = DigitDC2 a3,b1,a1;
existence
ex b1 being Tuple of c2,NAT st
for b2 being Nat st b2 in Seg c2 holds
b1 . b2 = DigitDC2 c3,b2,c1
proof end;
uniqueness
for b1, b2 being Tuple of c2,NAT st ( for b3 being Nat st b3 in Seg c2 holds
b1 . b3 = DigitDC2 c3,b3,c1 ) & ( for b3 being Nat st b3 in Seg c2 holds
b2 . b3 = DigitDC2 c3,b3,c1 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def5 defines DecSD2 RADIX_2:def 5 :
for b1, b2, b3 being Nat
for b4 being Tuple of b2,NAT holds
( b4 = DecSD2 b3,b2,b1 iff for b5 being Nat st b5 in Seg b2 holds
b4 . b5 = DigitDC2 b3,b5,b1 );

theorem Th12: :: RADIX_2:12
for b1, b2 being Nat
for b3 being Tuple of b1,NAT
for b4 being Tuple of b1,(b2 -SD ) st b3 = b4 holds
DigitSD2 b3,b2 = DigitSD b4
proof end;

theorem Th13: :: RADIX_2:13
for b1, b2 being Nat
for b3 being Tuple of b1,NAT
for b4 being Tuple of b1,(b2 -SD ) st b3 = b4 holds
SDDec2 b3,b2 = SDDec b4
proof end;

theorem Th14: :: RADIX_2:14
for b1, b2, b3 being Nat holds DecSD2 b1,b2,b3 = DecSD b1,b2,b3
proof end;

theorem Th15: :: RADIX_2:15
for b1 being Nat st b1 >= 1 holds
for b2, b3 being Nat st b2 is_represented_by b1,b3 holds
b2 = SDDec2 (DecSD2 b2,b1,b3),b3
proof end;

definition
let c1 be Integer;
let c2, c3, c4, c5 be Nat;
let c6 be Tuple of c5,(c4 -SD );
func Table1 c1,c6,c2,c3 -> Integer equals :: RADIX_2:def 6
(a1 * (DigA a6,a3)) mod a2;
correctness
coherence
(c1 * (DigA c6,c3)) mod c2 is Integer
;
;
end;

:: deftheorem Def6 defines Table1 RADIX_2:def 6 :
for b1 being Integer
for b2, b3, b4, b5 being Nat
for b6 being Tuple of b5,(b4 -SD ) holds Table1 b1,b6,b2,b3 = (b1 * (DigA b6,b3)) mod b2;

definition
let c1 be Integer;
let c2, c3, c4 be Nat;
let c5 be Tuple of c4,(c2 -SD );
assume E16: c4 >= 1 ;
func Mul_mod c1,c5,c3,c2 -> Tuple of a4,INT means :Def7: :: RADIX_2:def 7
( a6 . 1 = Table1 a1,a5,a3,a4 & ( for b1 being Nat st 1 <= b1 & b1 <= a4 - 1 holds
ex b2, b3 being Integer st
( b2 = a6 . b1 & b3 = a6 . (b1 + 1) & b3 = (((Radix a2) * b2) + (Table1 a1,a5,a3,(a4 -' b1))) mod a3 ) ) );
existence
ex b1 being Tuple of c4,INT st
( b1 . 1 = Table1 c1,c5,c3,c4 & ( for b2 being Nat st 1 <= b2 & b2 <= c4 - 1 holds
ex b3, b4 being Integer st
( b3 = b1 . b2 & b4 = b1 . (b2 + 1) & b4 = (((Radix c2) * b3) + (Table1 c1,c5,c3,(c4 -' b2))) mod c3 ) ) )
proof end;
uniqueness
for b1, b2 being Tuple of c4,INT st b1 . 1 = Table1 c1,c5,c3,c4 & ( for b3 being Nat st 1 <= b3 & b3 <= c4 - 1 holds
ex b4, b5 being Integer st
( b4 = b1 . b3 & b5 = b1 . (b3 + 1) & b5 = (((Radix c2) * b4) + (Table1 c1,c5,c3,(c4 -' b3))) mod c3 ) ) & b2 . 1 = Table1 c1,c5,c3,c4 & ( for b3 being Nat st 1 <= b3 & b3 <= c4 - 1 holds
ex b4, b5 being Integer st
( b4 = b2 . b3 & b5 = b2 . (b3 + 1) & b5 = (((Radix c2) * b4) + (Table1 c1,c5,c3,(c4 -' b3))) mod c3 ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def7 defines Mul_mod RADIX_2:def 7 :
for b1 being Integer
for b2, b3, b4 being Nat
for b5 being Tuple of b4,(b2 -SD ) st b4 >= 1 holds
for b6 being Tuple of b4,INT holds
( b6 = Mul_mod b1,b5,b3,b2 iff ( b6 . 1 = Table1 b1,b5,b3,b4 & ( for b7 being Nat st 1 <= b7 & b7 <= b4 - 1 holds
ex b8, b9 being Integer st
( b8 = b6 . b7 & b9 = b6 . (b7 + 1) & b9 = (((Radix b2) * b8) + (Table1 b1,b5,b3,(b4 -' b7))) mod b3 ) ) ) );

theorem Th16: :: RADIX_2:16
for b1 being Nat st b1 >= 1 holds
for b2 being Integer
for b3, b4, b5 being Nat st b3 is_represented_by b1,b5 & b4 > 0 holds
for b6 being Tuple of b1,(b5 -SD ) st b6 = DecSD b3,b1,b5 holds
(Mul_mod b2,b6,b4,b5) . b1 = (b2 * b3) mod b4
proof end;

definition
let c1, c2, c3, c4 be Nat;
let c5 be Tuple of c1,NAT ;
func Table2 c4,c5,c2,c3 -> Nat equals :: RADIX_2:def 8
(a4 |^ (a5 /. a3)) mod a2;
correctness
coherence
(c4 |^ (c5 /. c3)) mod c2 is Nat
;
;
end;

:: deftheorem Def8 defines Table2 RADIX_2:def 8 :
for b1, b2, b3, b4 being Nat
for b5 being Tuple of b1,NAT holds Table2 b4,b5,b2,b3 = (b4 |^ (b5 /. b3)) mod b2;

definition
let c1, c2, c3, c4 be Nat;
let c5 be Tuple of c4,NAT ;
assume E17: c4 >= 1 ;
func Pow_mod c3,c5,c2,c1 -> Tuple of a4,NAT means :Def9: :: RADIX_2:def 9
( a6 . 1 = Table2 a3,a5,a2,a4 & ( for b1 being Nat st 1 <= b1 & b1 <= a4 - 1 holds
ex b2, b3 being Nat st
( b2 = a6 . b1 & b3 = a6 . (b1 + 1) & b3 = (((b2 |^ (Radix a1)) mod a2) * (Table2 a3,a5,a2,(a4 -' b1))) mod a2 ) ) );
existence
ex b1 being Tuple of c4,NAT st
( b1 . 1 = Table2 c3,c5,c2,c4 & ( for b2 being Nat st 1 <= b2 & b2 <= c4 - 1 holds
ex b3, b4 being Nat st
( b3 = b1 . b2 & b4 = b1 . (b2 + 1) & b4 = (((b3 |^ (Radix c1)) mod c2) * (Table2 c3,c5,c2,(c4 -' b2))) mod c2 ) ) )
proof end;
uniqueness
for b1, b2 being Tuple of c4,NAT st b1 . 1 = Table2 c3,c5,c2,c4 & ( for b3 being Nat st 1 <= b3 & b3 <= c4 - 1 holds
ex b4, b5 being Nat st
( b4 = b1 . b3 & b5 = b1 . (b3 + 1) & b5 = (((b4 |^ (Radix c1)) mod c2) * (Table2 c3,c5,c2,(c4 -' b3))) mod c2 ) ) & b2 . 1 = Table2 c3,c5,c2,c4 & ( for b3 being Nat st 1 <= b3 & b3 <= c4 - 1 holds
ex b4, b5 being Nat st
( b4 = b2 . b3 & b5 = b2 . (b3 + 1) & b5 = (((b4 |^ (Radix c1)) mod c2) * (Table2 c3,c5,c2,(c4 -' b3))) mod c2 ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines Pow_mod RADIX_2:def 9 :
for b1, b2, b3, b4 being Nat
for b5 being Tuple of b4,NAT st b4 >= 1 holds
for b6 being Tuple of b4,NAT holds
( b6 = Pow_mod b3,b5,b2,b1 iff ( b6 . 1 = Table2 b3,b5,b2,b4 & ( for b7 being Nat st 1 <= b7 & b7 <= b4 - 1 holds
ex b8, b9 being Nat st
( b8 = b6 . b7 & b9 = b6 . (b7 + 1) & b9 = (((b8 |^ (Radix b1)) mod b2) * (Table2 b3,b5,b2,(b4 -' b7))) mod b2 ) ) ) );

theorem Th17: :: RADIX_2:17
for b1 being Nat st b1 >= 1 holds
for b2, b3, b4, b5 being Nat st b5 is_represented_by b1,b3 & b4 > 0 holds
for b6 being Tuple of b1,NAT st b6 = DecSD2 b5,b1,b3 holds
(Pow_mod b2,b6,b4,b3) . b1 = (b2 |^ b5) mod b4
proof end;