:: GCD_1 semantic presentation

registration
cluster non empty commutative right_unital -> non empty left_unital multLoopStr ;
coherence
for b1 being non empty multLoopStr st b1 is commutative & b1 is right_unital holds
b1 is left_unital
proof end;
end;

registration
cluster non empty commutative right-distributive -> non empty distributive doubleLoopStr ;
coherence
for b1 being non empty doubleLoopStr st b1 is commutative & b1 is right-distributive holds
b1 is distributive
proof end;
cluster non empty commutative left-distributive -> non empty distributive doubleLoopStr ;
coherence
for b1 being non empty doubleLoopStr st b1 is commutative & b1 is left-distributive holds
b1 is distributive
proof end;
end;

registration
cluster -> unital doubleLoopStr ;
coherence
for b1 being Ring holds b1 is unital
;
end;

registration
cluster F_Real -> domRing-like ;
coherence
F_Real is domRing-like
proof end;
end;

registration
cluster non empty Abelian add-associative right_zeroed right_complementable unital associative commutative strict distributive Field-like non degenerated domRing-like doubleLoopStr ;
existence
ex b1 being non empty doubleLoopStr st
( b1 is strict & b1 is Abelian & b1 is add-associative & b1 is right_zeroed & b1 is right_complementable & b1 is associative & b1 is commutative & b1 is domRing-like & b1 is distributive & b1 is unital & not b1 is degenerated & b1 is Field-like )
proof end;
end;

theorem Th1: :: GCD_1:1
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b2 <> 0. b1 holds
( ( b2 * b3 = b2 * b4 implies b3 = b4 ) & ( b3 * b2 = b4 * b2 implies b3 = b4 ) )
proof end;

definition
let c1 be non empty HGrStr ;
let c2, c3 be Element of c1;
pred c2 divides c3 means :Def1: :: GCD_1:def 1
ex b1 being Element of a1 st a3 = a2 * b1;
end;

:: deftheorem Def1 defines divides GCD_1:def 1 :
for b1 being non empty HGrStr
for b2, b3 being Element of b1 holds
( b2 divides b3 iff ex b4 being Element of b1 st b3 = b2 * b4 );

definition
let c1 be non empty unital multLoopStr ;
let c2, c3 be Element of c1;
redefine pred divides as c2 divides c3;
reflexivity
for b1 being Element of c1 holds b1 divides b1
proof end;
end;

definition
let c1 be non empty multLoopStr ;
let c2 be Element of c1;
attr a2 is unital means :Def2: :: GCD_1:def 2
a2 divides 1. a1;
end;

:: deftheorem Def2 defines unital GCD_1:def 2 :
for b1 being non empty multLoopStr
for b2 being Element of b1 holds
( b2 is unital iff b2 divides 1. b1 );

definition
let c1 be non empty multLoopStr ;
let c2, c3 be Element of c1;
pred c2 is_associated_to c3 means :Def3: :: GCD_1:def 3
( a2 divides a3 & a3 divides a2 );
symmetry
for b1, b2 being Element of c1 st b1 divides b2 & b2 divides b1 holds
( b2 divides b1 & b1 divides b2 )
;
end;

:: deftheorem Def3 defines is_associated_to GCD_1:def 3 :
for b1 being non empty multLoopStr
for b2, b3 being Element of b1 holds
( b2 is_associated_to b3 iff ( b2 divides b3 & b3 divides b2 ) );

notation
let c1 be non empty multLoopStr ;
let c2, c3 be Element of c1;
antonym c2 is_not_associated_to c3 for c2 is_associated_to c3;
end;

definition
let c1 be non empty unital multLoopStr ;
let c2, c3 be Element of c1;
redefine pred is_associated_to as c2 is_associated_to c3;
reflexivity
for b1 being Element of c1 holds b1 is_associated_to b1
proof end;
end;

definition
let c1 be commutative domRing-like Ring;
let c2, c3 be Element of c1;
assume E5: c3 divides c2 ;
assume E6: c3 <> 0. c1 ;
func c2 / c3 -> Element of a1 means :Def4: :: GCD_1:def 4
a4 * a3 = a2;
existence
ex b1 being Element of c1 st b1 * c3 = c2
proof end;
uniqueness
for b1, b2 being Element of c1 st b1 * c3 = c2 & b2 * c3 = c2 holds
b1 = b2
by E6, Th1;
end;

:: deftheorem Def4 defines / GCD_1:def 4 :
for b1 being commutative domRing-like Ring
for b2, b3 being Element of b1 st b3 divides b2 & b3 <> 0. b1 holds
for b4 being Element of b1 holds
( b4 = b2 / b3 iff b4 * b3 = b2 );

theorem Th2: :: GCD_1:2
for b1 being non empty associative multLoopStr
for b2, b3, b4 being Element of b1 st b2 divides b3 & b3 divides b4 holds
b2 divides b4
proof end;

theorem Th3: :: GCD_1:3
for b1 being non empty associative commutative multLoopStr
for b2, b3, b4, b5 being Element of b1 st b3 divides b2 & b5 divides b4 holds
b3 * b5 divides b2 * b4
proof end;

theorem Th4: :: GCD_1:4
for b1 being non empty associative multLoopStr
for b2, b3, b4 being Element of b1 st b2 is_associated_to b3 & b3 is_associated_to b4 holds
b2 is_associated_to b4
proof end;

theorem Th5: :: GCD_1:5
for b1 being non empty associative multLoopStr
for b2, b3, b4 being Element of b1 st b2 divides b3 holds
b4 * b2 divides b4 * b3
proof end;

theorem Th6: :: GCD_1:6
for b1 being non empty multLoopStr
for b2, b3 being Element of b1 holds
( b2 divides b2 * b3 & ( b1 is commutative implies b3 divides b2 * b3 ) )
proof end;

theorem Th7: :: GCD_1:7
for b1 being non empty associative multLoopStr
for b2, b3, b4 being Element of b1 st b2 divides b3 holds
b2 divides b3 * b4
proof end;

theorem Th8: :: GCD_1:8
for b1 being commutative domRing-like Ring
for b2, b3 being Element of b1 st b3 divides b2 & b3 <> 0. b1 holds
( b2 / b3 = 0. b1 iff b2 = 0. b1 )
proof end;

theorem Th9: :: GCD_1:9
for b1 being commutative domRing-like Ring
for b2 being Element of b1 st b2 <> 0. b1 holds
b2 / b2 = 1. b1
proof end;

theorem Th10: :: GCD_1:10
for b1 being commutative non degenerated domRing-like Ring
for b2 being Element of b1 holds b2 / (1. b1) = b2
proof end;

theorem Th11: :: GCD_1:11
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b4 <> 0. b1 holds
( ( b4 divides b2 * b3 & b4 divides b2 implies (b2 * b3) / b4 = (b2 / b4) * b3 ) & ( b4 divides b2 * b3 & b4 divides b3 implies (b2 * b3) / b4 = b2 * (b3 / b4) ) )
proof end;

theorem Th12: :: GCD_1:12
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b4 <> 0. b1 & b4 divides b2 & b4 divides b3 & b4 divides b2 + b3 holds
(b2 / b4) + (b3 / b4) = (b2 + b3) / b4
proof end;

theorem Th13: :: GCD_1:13
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b4 <> 0. b1 & b4 divides b2 & b4 divides b3 holds
( b2 / b4 = b3 / b4 iff b2 = b3 )
proof end;

theorem Th14: :: GCD_1:14
for b1 being commutative domRing-like Ring
for b2, b3, b4, b5 being Element of b1 st b3 <> 0. b1 & b5 <> 0. b1 & b3 divides b2 & b5 divides b4 holds
(b2 / b3) * (b4 / b5) = (b2 * b4) / (b3 * b5)
proof end;

theorem Th15: :: GCD_1:15
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b2 <> 0. b1 & b2 * b3 divides b2 * b4 holds
b3 divides b4
proof end;

theorem Th16: :: GCD_1:16
for b1 being commutative domRing-like Ring
for b2 being Element of b1 st b2 is_associated_to 0. b1 holds
b2 = 0. b1
proof end;

theorem Th17: :: GCD_1:17
for b1 being commutative domRing-like Ring
for b2, b3 being Element of b1 st b2 <> 0. b1 & b2 * b3 = b2 holds
b3 = 1. b1
proof end;

theorem Th18: :: GCD_1:18
for b1 being commutative domRing-like Ring
for b2, b3 being Element of b1 holds
( b2 is_associated_to b3 iff ex b4 being Element of b1 st
( b4 is unital & b2 * b4 = b3 ) )
proof end;

theorem Th19: :: GCD_1:19
for b1 being commutative domRing-like Ring
for b2, b3, b4 being Element of b1 st b4 <> 0. b1 & b4 * b2 is_associated_to b4 * b3 holds
b2 is_associated_to b3
proof end;

definition
let c1 be non empty multLoopStr ;
let c2 be Element of c1;
func Class c2 -> Subset of a1 means :Def5: :: GCD_1:def 5
for b1 being Element of a1 holds
( b1 in a3 iff b1 is_associated_to a2 );
existence
ex b1 being Subset of c1 st
for b2 being Element of c1 holds
( b2 in b1 iff b2 is_associated_to c2 )
proof end;
uniqueness
for b1, b2 being Subset of c1 st ( for b3 being Element of c1 holds
( b3 in b1 iff b3 is_associated_to c2 ) ) & ( for b3 being Element of c1 holds
( b3 in b2 iff b3 is_associated_to c2 ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def5 defines Class GCD_1:def 5 :
for b1 being non empty multLoopStr
for b2 being Element of b1
for b3 being Subset of b1 holds
( b3 = Class b2 iff for b4 being Element of b1 holds
( b4 in b3 iff b4 is_associated_to b2 ) );

registration
let c1 be non empty unital multLoopStr ;
let c2 be Element of c1;
cluster Class a2 -> non empty ;
coherence
not Class c2 is empty
proof end;
end;

theorem Th20: :: GCD_1:20
for b1 being non empty associative multLoopStr
for b2, b3 being Element of b1 st Class b2 meets Class b3 holds
Class b2 = Class b3
proof end;

definition
let c1 be non empty multLoopStr ;
func Classes c1 -> Subset-Family of a1 means :Def6: :: GCD_1:def 6
for b1 being Subset of a1 holds
( b1 in a2 iff ex b2 being Element of a1 st b1 = Class b2 );
existence
ex b1 being Subset-Family of c1 st
for b2 being Subset of c1 holds
( b2 in b1 iff ex b3 being Element of c1 st b2 = Class b3 )
proof end;
uniqueness
for b1, b2 being Subset-Family of c1 st ( for b3 being Subset of c1 holds
( b3 in b1 iff ex b4 being Element of c1 st b3 = Class b4 ) ) & ( for b3 being Subset of c1 holds
( b3 in b2 iff ex b4 being Element of c1 st b3 = Class b4 ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def6 defines Classes GCD_1:def 6 :
for b1 being non empty multLoopStr
for b2 being Subset-Family of b1 holds
( b2 = Classes b1 iff for b3 being Subset of b1 holds
( b3 in b2 iff ex b4 being Element of b1 st b3 = Class b4 ) );

registration
let c1 be non empty multLoopStr ;
cluster Classes a1 -> non empty ;
coherence
not Classes c1 is empty
proof end;
end;

theorem Th21: :: GCD_1:21
for b1 being non empty unital multLoopStr
for b2 being Subset of b1 st b2 in Classes b1 holds
not b2 is empty
proof end;

definition
let c1 be non empty unital associative multLoopStr ;
mode Am of c1 -> non empty Subset of a1 means :Def7: :: GCD_1:def 7
( ( for b1 being Element of a1 ex b2 being Element of a2 st b2 is_associated_to b1 ) & ( for b1, b2 being Element of a2 st b1 <> b2 holds
b1 is_not_associated_to b2 ) );
existence
ex b1 being non empty Subset of c1 st
( ( for b2 being Element of c1 ex b3 being Element of b1 st b3 is_associated_to b2 ) & ( for b2, b3 being Element of b1 st b2 <> b3 holds
b2 is_not_associated_to b3 ) )
proof end;
end;

:: deftheorem Def7 defines Am GCD_1:def 7 :
for b1 being non empty unital associative multLoopStr
for b2 being non empty Subset of b1 holds
( b2 is Am of b1 iff ( ( for b3 being Element of b1 ex b4 being Element of b2 st b4 is_associated_to b3 ) & ( for b3, b4 being Element of b2 st b3 <> b4 holds
b3 is_not_associated_to b4 ) ) );

definition
let c1 be non empty unital associative multLoopStr ;
mode AmpleSet of c1 -> non empty Subset of a1 means :Def8: :: GCD_1:def 8
( a2 is Am of a1 & 1. a1 in a2 );
existence
ex b1 being non empty Subset of c1 st
( b1 is Am of c1 & 1. c1 in b1 )
proof end;
end;

:: deftheorem Def8 defines AmpleSet GCD_1:def 8 :
for b1 being non empty unital associative multLoopStr
for b2 being non empty Subset of b1 holds
( b2 is AmpleSet of b1 iff ( b2 is Am of b1 & 1. b1 in b2 ) );

theorem Th22: :: GCD_1:22
for b1 being non empty unital associative multLoopStr
for b2 being AmpleSet of b1 holds
( 1. b1 in b2 & ( for b3 being Element of b1 ex b4 being Element of b2 st b4 is_associated_to b3 ) & ( for b3, b4 being Element of b2 st b3 <> b4 holds
b3 is_not_associated_to b4 ) )
proof end;

theorem Th23: :: GCD_1:23
for b1 being non empty unital associative multLoopStr
for b2 being AmpleSet of b1
for b3, b4 being Element of b2 st b3 is_associated_to b4 holds
b3 = b4 by Th22;

theorem Th24: :: GCD_1:24
for b1 being commutative domRing-like Ring
for b2 being AmpleSet of b1 holds 0. b1 is Element of b2
proof end;

definition
let c1 be non empty unital associative multLoopStr ;
let c2 be AmpleSet of c1;
let c3 be Element of c1;
func NF c3,c2 -> Element of a1 means :Def9: :: GCD_1:def 9
( a4 in a2 & a4 is_associated_to a3 );
existence
ex b1 being Element of c1 st
( b1 in c2 & b1 is_associated_to c3 )
proof end;
uniqueness
for b1, b2 being Element of c1 st b1 in c2 & b1 is_associated_to c3 & b2 in c2 & b2 is_associated_to c3 holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines NF GCD_1:def 9 :
for b1 being non empty unital associative multLoopStr
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 holds
( b4 = NF b3,b2 iff ( b4 in b2 & b4 is_associated_to b3 ) );

theorem Th25: :: GCD_1:25
for b1 being commutative domRing-like Ring
for b2 being AmpleSet of b1 holds
( NF (0. b1),b2 = 0. b1 & NF (1. b1),b2 = 1. b1 )
proof end;

theorem Th26: :: GCD_1:26
for b1 being commutative domRing-like Ring
for b2 being AmpleSet of b1
for b3 being Element of b1 holds
( b3 in b2 iff b3 = NF b3,b2 ) by Def9;

definition
let c1 be non empty unital associative multLoopStr ;
let c2 be AmpleSet of c1;
attr a2 is multiplicative means :Def10: :: GCD_1:def 10
for b1, b2 being Element of a2 holds b1 * b2 in a2;
end;

:: deftheorem Def10 defines multiplicative GCD_1:def 10 :
for b1 being non empty unital associative multLoopStr
for b2 being AmpleSet of b1 holds
( b2 is multiplicative iff for b3, b4 being Element of b2 holds b3 * b4 in b2 );

theorem Th27: :: GCD_1:27
for b1 being commutative domRing-like Ring
for b2 being AmpleSet of b1 st b2 is multiplicative holds
for b3, b4 being Element of b2 st b4 divides b3 & b4 <> 0. b1 holds
b3 / b4 in b2
proof end;

definition
let c1 be non empty multLoopStr ;
attr a1 is gcd-like means :Def11: :: GCD_1:def 11
for b1, b2 being Element of a1 ex b3 being Element of a1 st
( b3 divides b1 & b3 divides b2 & ( for b4 being Element of a1 st b4 divides b1 & b4 divides b2 holds
b4 divides b3 ) );
end;

:: deftheorem Def11 defines gcd-like GCD_1:def 11 :
for b1 being non empty multLoopStr holds
( b1 is gcd-like iff for b2, b3 being Element of b1 ex b4 being Element of b1 st
( b4 divides b2 & b4 divides b3 & ( for b5 being Element of b1 st b5 divides b2 & b5 divides b3 holds
b5 divides b4 ) ) );

E35: now
let c1 be Field;
let c2, c3 be Element of c1;
now
per cases ( ( c2 <> 0. c1 & c3 <> 0. c1 ) or c2 = 0. c1 or c3 = 0. c1 ) ;
case E36: ( c2 <> 0. c1 & c3 <> 0. c1 ) ;
c2 = (1. c1) * c2 by VECTSP_2:1;
then E37: 1. c1 divides c2 by Def1;
c3 = (1. c1) * c3 by VECTSP_2:1;
then E38: 1. c1 divides c3 by Def1;
for b1 being Element of c1 st b1 divides c2 & b1 divides c3 holds
b1 divides 1. c1
proof
let c4 be Element of c1;
assume E39: ( c4 divides c2 & c4 divides c3 ) ;
now
per cases ( c4 <> 0. c1 or c4 = 0. c1 ) ;
case c4 <> 0. c1 ;
then consider c5 being Element of c1 such that
E40: c4 * c5 = 1. c1 by VECTSP_1:def 20;
thus c4 divides 1. c1 by E40, Def1;
end;
case E40: c4 = 0. c1 ;
assume c4 divides c2 ;
then consider c5 being Element of c1 such that
E41: c4 * c5 = c2 by Def1;
thus c4 divides 1. c1 by E36, E40, E41, VECTSP_1:39;
end;
end;
end;
hence c4 divides 1. c1 by E39;
end;
hence ex b1 being Element of c1 st
( b1 divides c2 & b1 divides c3 & ( for b2 being Element of c1 st b2 divides c2 & b2 divides c3 holds
b2 divides b1 ) ) by E37, E38;
end;
case E36: c2 = 0. c1 ;
c3 * (0. c1) = 0. c1 by VECTSP_1:39;
then E37: c3 divides 0. c1 by Def1;
for b1 being Element of c1 st b1 divides 0. c1 & b1 divides c3 holds
b1 divides c3 ;
hence ex b1 being Element of c1 st
( b1 divides c2 & b1 divides c3 & ( for b2 being Element of c1 st b2 divides c2 & b2 divides c3 holds
b2 divides b1 ) ) by E36, E37;
end;
case E36: c3 = 0. c1 ;
c2 * (0. c1) = 0. c1 by VECTSP_1:39;
then E37: c2 divides 0. c1 by Def1;
for b1 being Element of c1 st b1 divides c2 & b1 divides 0. c1 holds
b1 divides c2 ;
hence ex b1 being Element of c1 st
( b1 divides c2 & b1 divides c3 & ( for b2 being Element of c1 st b2 divides c2 & b2 divides c3 holds
b2 divides b1 ) ) by E36, E37;
end;
end;
end;
hence ex b1 being Element of c1 st
( b1 divides c2 & b1 divides c3 & ( for b2 being Element of c1 st b2 divides c2 & b2 divides c3 holds
b2 divides b1 ) ) ;
end;

registration
cluster gcd-like doubleLoopStr ;
existence
ex b1 being domRing st b1 is gcd-like
proof end;
end;

registration
cluster non empty unital associative commutative gcd-like multLoopStr ;
existence
ex b1 being non empty multLoopStr st
( b1 is gcd-like & b1 is associative & b1 is commutative & b1 is unital )
proof end;
end;

registration
cluster non empty unital associative commutative gcd-like multLoopStr_0 ;
existence
ex b1 being non empty multLoopStr_0 st
( b1 is gcd-like & b1 is associative & b1 is commutative & b1 is unital )
proof end;
end;

registration
cluster non empty add-associative right_zeroed right_complementable commutative right-distributive left-distributive right_unital left_unital Field-like -> non empty add-associative right_zeroed right_complementable commutative right-distributive left-distributive right_unital distributive left_unital Field-like gcd-like doubleLoopStr ;
coherence
for b1 being non empty add-associative right_zeroed right_complementable commutative right-distributive left-distributive right_unital left_unital Field-like doubleLoopStr holds b1 is gcd-like
proof end;
end;

registration
cluster non empty Abelian add-associative right_zeroed right_complementable unital associative commutative distributive non degenerated domRing-like gcd-like doubleLoopStr ;
existence
ex b1 being non empty doubleLoopStr st
( b1 is gcd-like & b1 is associative & b1 is commutative & b1 is unital & b1 is domRing-like & b1 is unital & b1 is distributive & not b1 is degenerated & b1 is Abelian & b1 is add-associative & b1 is right_zeroed & b1 is right_complementable )
proof end;
end;

definition
mode gcdDomain is commutative non degenerated domRing-like gcd-like Ring;
end;

definition
let c1 be non empty unital associative gcd-like multLoopStr ;
let c2 be AmpleSet of c1;
let c3, c4 be Element of c1;
func gcd c3,c4,c2 -> Element of a1 means :Def12: :: GCD_1:def 12
( a5 in a2 & a5 divides a3 & a5 divides a4 & ( for b1 being Element of a1 st b1 divides a3 & b1 divides a4 holds
b1 divides a5 ) );
existence
ex b1 being Element of c1 st
( b1 in c2 & b1 divides c3 & b1 divides c4 & ( for b2 being Element of c1 st b2 divides c3 & b2 divides c4 holds
b2 divides b1 ) )
proof end;
uniqueness
for b1, b2 being Element of c1 st b1 in c2 & b1 divides c3 & b1 divides c4 & ( for b3 being Element of c1 st b3 divides c3 & b3 divides c4 holds
b3 divides b1 ) & b2 in c2 & b2 divides c3 & b2 divides c4 & ( for b3 being Element of c1 st b3 divides c3 & b3 divides c4 holds
b3 divides b2 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def12 defines gcd GCD_1:def 12 :
for b1 being non empty unital associative gcd-like multLoopStr
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 holds
( b5 = gcd b3,b4,b2 iff ( b5 in b2 & b5 divides b3 & b5 divides b4 & ( for b6 being Element of b1 st b6 divides b3 & b6 divides b4 holds
b6 divides b5 ) ) );

theorem Th28: :: GCD_1:28
canceled;

theorem Th29: :: GCD_1:29
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 st b5 divides gcd b3,b4,b2 holds
( b5 divides b3 & b5 divides b4 )
proof end;

theorem Th30: :: GCD_1:30
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 holds gcd b3,b4,b2 = gcd b4,b3,b2
proof end;

theorem Th31: :: GCD_1:31
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3 being Element of b1 holds
( gcd b3,(0. b1),b2 = NF b3,b2 & gcd (0. b1),b3,b2 = NF b3,b2 )
proof end;

theorem Th32: :: GCD_1:32
for b1 being gcdDomain
for b2 being AmpleSet of b1 holds gcd (0. b1),(0. b1),b2 = 0. b1
proof end;

theorem Th33: :: GCD_1:33
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3 being Element of b1 holds
( gcd b3,(1. b1),b2 = 1. b1 & gcd (1. b1),b3,b2 = 1. b1 )
proof end;

theorem Th34: :: GCD_1:34
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 holds
( gcd b3,b4,b2 = 0. b1 iff ( b3 = 0. b1 & b4 = 0. b1 ) )
proof end;

theorem Th35: :: GCD_1:35
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 st b4 is_associated_to b5 holds
( gcd b3,b4,b2 is_associated_to gcd b3,b5,b2 & gcd b4,b3,b2 is_associated_to gcd b5,b3,b2 )
proof end;

theorem Th36: :: GCD_1:36
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 holds gcd (gcd b3,b4,b2),b5,b2 = gcd b3,(gcd b4,b5,b2),b2
proof end;

theorem Th37: :: GCD_1:37
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 holds gcd (b3 * b5),(b4 * b5),b2 is_associated_to b5 * (gcd b3,b4,b2)
proof end;

theorem Th38: :: GCD_1:38
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 st gcd b3,b4,b2 = 1. b1 holds
gcd b3,(b4 * b5),b2 = gcd b3,b5,b2
proof end;

theorem Th39: :: GCD_1:39
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 st b5 = gcd b3,b4,b2 & b5 <> 0. b1 holds
gcd (b3 / b5),(b4 / b5),b2 = 1. b1
proof end;

theorem Th40: :: GCD_1:40
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5 being Element of b1 holds gcd (b3 + (b4 * b5)),b5,b2 = gcd b3,b5,b2
proof end;

theorem Th41: :: GCD_1:41
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st gcd b3,b4,b2 = 1. b1 & gcd b5,b6,b2 = 1. b1 & b4 <> 0. b1 & b6 <> 0. b1 holds
gcd ((b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2)))),(b4 * (b6 / (gcd b4,b6,b2))),b2 = gcd ((b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2)))),(gcd b4,b6,b2),b2
proof end;

theorem Th42: :: GCD_1:42
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st gcd b3,b4,b2 = 1. b1 & gcd b5,b6,b2 = 1. b1 & b4 <> 0. b1 & b6 <> 0. b1 holds
gcd ((b3 / (gcd b3,b6,b2)) * (b5 / (gcd b5,b4,b2))),((b4 / (gcd b5,b4,b2)) * (b6 / (gcd b3,b6,b2))),b2 = 1. b1
proof end;

definition
let c1 be non empty unital associative gcd-like multLoopStr ;
let c2 be AmpleSet of c1;
let c3, c4 be Element of c1;
pred c3,c4 are_canonical_wrt c2 means :Def13: :: GCD_1:def 13
gcd a3,a4,a2 = 1. a1;
end;

:: deftheorem Def13 defines are_canonical_wrt GCD_1:def 13 :
for b1 being non empty unital associative gcd-like multLoopStr
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 holds
( b3,b4 are_canonical_wrt b2 iff gcd b3,b4,b2 = 1. b1 );

theorem Th43: :: GCD_1:43
for b1 being gcdDomain
for b2, b3 being AmpleSet of b1
for b4, b5 being Element of b1 holds
( b4,b5 are_canonical_wrt b2 iff b4,b5 are_canonical_wrt b3 )
proof end;

definition
let c1 be non empty unital associative gcd-like multLoopStr ;
let c2, c3 be Element of c1;
pred c2,c3 are_co-prime means :Def14: :: GCD_1:def 14
ex b1 being AmpleSet of a1 st gcd a2,a3,b1 = 1. a1;
end;

:: deftheorem Def14 defines are_co-prime GCD_1:def 14 :
for b1 being non empty unital associative gcd-like multLoopStr
for b2, b3 being Element of b1 holds
( b2,b3 are_co-prime iff ex b4 being AmpleSet of b1 st gcd b2,b3,b4 = 1. b1 );

definition
let c1 be gcdDomain;
let c2, c3 be Element of c1;
redefine pred are_co-prime as c2,c3 are_co-prime ;
symmetry
for b1, b2 being Element of c1 st b1,b2 are_co-prime holds
b2,b1 are_co-prime
proof end;
end;

theorem Th44: :: GCD_1:44
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 st b3,b4 are_co-prime holds
gcd b3,b4,b2 = 1. b1
proof end;

definition
let c1 be non empty unital associative gcd-like multLoopStr_0 ;
let c2 be AmpleSet of c1;
let c3, c4 be Element of c1;
pred c3,c4 are_normalized_wrt c2 means :Def15: :: GCD_1:def 15
( gcd a3,a4,a2 = 1. a1 & a4 in a2 & a4 <> 0. a1 );
end;

:: deftheorem Def15 defines are_normalized_wrt GCD_1:def 15 :
for b1 being non empty unital associative gcd-like multLoopStr_0
for b2 being AmpleSet of b1
for b3, b4 being Element of b1 holds
( b3,b4 are_normalized_wrt b2 iff ( gcd b3,b4,b2 = 1. b1 & b4 in b2 & b4 <> 0. b1 ) );

definition
let c1 be gcdDomain;
let c2 be AmpleSet of c1;
let c3, c4, c5, c6 be Element of c1;
assume E56: ( c3,c4 are_co-prime & c5,c6 are_co-prime & c4 = NF c4,c2 & c6 = NF c6,c2 ) ;
func add1 c3,c4,c5,c6,c2 -> Element of a1 equals :Def16: :: GCD_1:def 16
a5 if a3 = 0. a1
a3 if a5 = 0. a1
(a3 * a6) + (a4 * a5) if gcd a4,a6,a2 = 1. a1
0. a1 if (a3 * (a6 / (gcd a4,a6,a2))) + (a5 * (a4 / (gcd a4,a6,a2))) = 0. a1
otherwise ((a3 * (a6 / (gcd a4,a6,a2))) + (a5 * (a4 / (gcd a4,a6,a2)))) / (gcd ((a3 * (a6 / (gcd a4,a6,a2))) + (a5 * (a4 / (gcd a4,a6,a2)))),(gcd a4,a6,a2),a2);
coherence
( ( c3 = 0. c1 implies c5 is Element of c1 ) & ( c5 = 0. c1 implies c3 is Element of c1 ) & ( gcd c4,c6,c2 = 1. c1 implies (c3 * c6) + (c4 * c5) is Element of c1 ) & ( (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies 0. c1 is Element of c1 ) & ( not c3 = 0. c1 & not c5 = 0. c1 & not gcd c4,c6,c2 = 1. c1 & not (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ((c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2)))) / (gcd ((c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2)))),(gcd c4,c6,c2),c2) is Element of c1 ) )
;
consistency
for b1 being Element of c1 holds
( ( c3 = 0. c1 & c5 = 0. c1 implies ( b1 = c5 iff b1 = c3 ) ) & ( c3 = 0. c1 & gcd c4,c6,c2 = 1. c1 implies ( b1 = c5 iff b1 = (c3 * c6) + (c4 * c5) ) ) & ( c3 = 0. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = c5 iff b1 = 0. c1 ) ) & ( c5 = 0. c1 & gcd c4,c6,c2 = 1. c1 implies ( b1 = c3 iff b1 = (c3 * c6) + (c4 * c5) ) ) & ( c5 = 0. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = c3 iff b1 = 0. c1 ) ) & ( gcd c4,c6,c2 = 1. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = (c3 * c6) + (c4 * c5) iff b1 = 0. c1 ) ) )
proof end;
end;

:: deftheorem Def16 defines add1 GCD_1:def 16 :
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b3,b4 are_co-prime & b5,b6 are_co-prime & b4 = NF b4,b2 & b6 = NF b6,b2 holds
( ( b3 = 0. b1 implies add1 b3,b4,b5,b6,b2 = b5 ) & ( b5 = 0. b1 implies add1 b3,b4,b5,b6,b2 = b3 ) & ( gcd b4,b6,b2 = 1. b1 implies add1 b3,b4,b5,b6,b2 = (b3 * b6) + (b4 * b5) ) & ( (b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2))) = 0. b1 implies add1 b3,b4,b5,b6,b2 = 0. b1 ) & ( not b3 = 0. b1 & not b5 = 0. b1 & not gcd b4,b6,b2 = 1. b1 & not (b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2))) = 0. b1 implies add1 b3,b4,b5,b6,b2 = ((b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2)))) / (gcd ((b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2)))),(gcd b4,b6,b2),b2) ) );

definition
let c1 be gcdDomain;
let c2 be AmpleSet of c1;
let c3, c4, c5, c6 be Element of c1;
assume E57: ( c3,c4 are_co-prime & c5,c6 are_co-prime & c4 = NF c4,c2 & c6 = NF c6,c2 ) ;
func add2 c3,c4,c5,c6,c2 -> Element of a1 equals :Def17: :: GCD_1:def 17
a6 if a3 = 0. a1
a4 if a5 = 0. a1
a4 * a6 if gcd a4,a6,a2 = 1. a1
1. a1 if (a3 * (a6 / (gcd a4,a6,a2))) + (a5 * (a4 / (gcd a4,a6,a2))) = 0. a1
otherwise (a4 * (a6 / (gcd a4,a6,a2))) / (gcd ((a3 * (a6 / (gcd a4,a6,a2))) + (a5 * (a4 / (gcd a4,a6,a2)))),(gcd a4,a6,a2),a2);
coherence
( ( c3 = 0. c1 implies c6 is Element of c1 ) & ( c5 = 0. c1 implies c4 is Element of c1 ) & ( gcd c4,c6,c2 = 1. c1 implies c4 * c6 is Element of c1 ) & ( (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies 1. c1 is Element of c1 ) & ( not c3 = 0. c1 & not c5 = 0. c1 & not gcd c4,c6,c2 = 1. c1 & not (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies (c4 * (c6 / (gcd c4,c6,c2))) / (gcd ((c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2)))),(gcd c4,c6,c2),c2) is Element of c1 ) )
;
consistency
for b1 being Element of c1 holds
( ( c3 = 0. c1 & c5 = 0. c1 implies ( b1 = c6 iff b1 = c4 ) ) & ( c3 = 0. c1 & gcd c4,c6,c2 = 1. c1 implies ( b1 = c6 iff b1 = c4 * c6 ) ) & ( c3 = 0. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = c6 iff b1 = 1. c1 ) ) & ( c5 = 0. c1 & gcd c4,c6,c2 = 1. c1 implies ( b1 = c4 iff b1 = c4 * c6 ) ) & ( c5 = 0. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = c4 iff b1 = 1. c1 ) ) & ( gcd c4,c6,c2 = 1. c1 & (c3 * (c6 / (gcd c4,c6,c2))) + (c5 * (c4 / (gcd c4,c6,c2))) = 0. c1 implies ( b1 = c4 * c6 iff b1 = 1. c1 ) ) )
proof end;
end;

:: deftheorem Def17 defines add2 GCD_1:def 17 :
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b3,b4 are_co-prime & b5,b6 are_co-prime & b4 = NF b4,b2 & b6 = NF b6,b2 holds
( ( b3 = 0. b1 implies add2 b3,b4,b5,b6,b2 = b6 ) & ( b5 = 0. b1 implies add2 b3,b4,b5,b6,b2 = b4 ) & ( gcd b4,b6,b2 = 1. b1 implies add2 b3,b4,b5,b6,b2 = b4 * b6 ) & ( (b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2))) = 0. b1 implies add2 b3,b4,b5,b6,b2 = 1. b1 ) & ( not b3 = 0. b1 & not b5 = 0. b1 & not gcd b4,b6,b2 = 1. b1 & not (b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2))) = 0. b1 implies add2 b3,b4,b5,b6,b2 = (b4 * (b6 / (gcd b4,b6,b2))) / (gcd ((b3 * (b6 / (gcd b4,b6,b2))) + (b5 * (b4 / (gcd b4,b6,b2)))),(gcd b4,b6,b2),b2) ) );

theorem Th45: :: GCD_1:45
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b2 is multiplicative & b3,b4 are_normalized_wrt b2 & b5,b6 are_normalized_wrt b2 holds
add1 b3,b4,b5,b6,b2, add2 b3,b4,b5,b6,b2 are_normalized_wrt b2
proof end;

theorem Th46: :: GCD_1:46
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b2 is multiplicative & b3,b4 are_normalized_wrt b2 & b5,b6 are_normalized_wrt b2 holds
(add1 b3,b4,b5,b6,b2) * (b4 * b6) = (add2 b3,b4,b5,b6,b2) * ((b3 * b6) + (b5 * b4))
proof end;

definition
let c1 be gcdDomain;
let c2 be AmpleSet of c1;
let c3, c4, c5, c6 be Element of c1;
func mult1 c3,c4,c5,c6,c2 -> Element of a1 equals :Def18: :: GCD_1:def 18
0. a1 if ( a3 = 0. a1 or a5 = 0. a1 )
a3 * a5 if ( a4 = 1. a1 & a6 = 1. a1 )
(a3 * a5) / (gcd a3,a6,a2) if ( a6 <> 0. a1 & a4 = 1. a1 )
(a3 * a5) / (gcd a5,a4,a2) if ( a4 <> 0. a1 & a6 = 1. a1 )
otherwise (a3 / (gcd a3,a6,a2)) * (a5 / (gcd a5,a4,a2));
coherence
( ( ( c3 = 0. c1 or c5 = 0. c1 ) implies 0. c1 is Element of c1 ) & ( c4 = 1. c1 & c6 = 1. c1 implies c3 * c5 is Element of c1 ) & ( c6 <> 0. c1 & c4 = 1. c1 implies (c3 * c5) / (gcd c3,c6,c2) is Element of c1 ) & ( c4 <> 0. c1 & c6 = 1. c1 implies (c3 * c5) / (gcd c5,c4,c2) is Element of c1 ) & ( c3 = 0. c1 or c5 = 0. c1 or ( c4 = 1. c1 & c6 = 1. c1 ) or ( c6 <> 0. c1 & c4 = 1. c1 ) or ( c4 <> 0. c1 & c6 = 1. c1 ) or (c3 / (gcd c3,c6,c2)) * (c5 / (gcd c5,c4,c2)) is Element of c1 ) )
;
consistency
for b1 being Element of c1 holds
( ( ( c3 = 0. c1 or c5 = 0. c1 ) & c4 = 1. c1 & c6 = 1. c1 implies ( b1 = 0. c1 iff b1 = c3 * c5 ) ) & ( ( c3 = 0. c1 or c5 = 0. c1 ) & c6 <> 0. c1 & c4 = 1. c1 implies ( b1 = 0. c1 iff b1 = (c3 * c5) / (gcd c3,c6,c2) ) ) & ( ( c3 = 0. c1 or c5 = 0. c1 ) & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = 0. c1 iff b1 = (c3 * c5) / (gcd c5,c4,c2) ) ) & ( c4 = 1. c1 & c6 = 1. c1 & c6 <> 0. c1 & c4 = 1. c1 implies ( b1 = c3 * c5 iff b1 = (c3 * c5) / (gcd c3,c6,c2) ) ) & ( c4 = 1. c1 & c6 = 1. c1 & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = c3 * c5 iff b1 = (c3 * c5) / (gcd c5,c4,c2) ) ) & ( c6 <> 0. c1 & c4 = 1. c1 & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = (c3 * c5) / (gcd c3,c6,c2) iff b1 = (c3 * c5) / (gcd c5,c4,c2) ) ) )
proof end;
end;

:: deftheorem Def18 defines mult1 GCD_1:def 18 :
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 holds
( ( ( b3 = 0. b1 or b5 = 0. b1 ) implies mult1 b3,b4,b5,b6,b2 = 0. b1 ) & ( b4 = 1. b1 & b6 = 1. b1 implies mult1 b3,b4,b5,b6,b2 = b3 * b5 ) & ( b6 <> 0. b1 & b4 = 1. b1 implies mult1 b3,b4,b5,b6,b2 = (b3 * b5) / (gcd b3,b6,b2) ) & ( b4 <> 0. b1 & b6 = 1. b1 implies mult1 b3,b4,b5,b6,b2 = (b3 * b5) / (gcd b5,b4,b2) ) & ( b3 = 0. b1 or b5 = 0. b1 or ( b4 = 1. b1 & b6 = 1. b1 ) or ( b6 <> 0. b1 & b4 = 1. b1 ) or ( b4 <> 0. b1 & b6 = 1. b1 ) or mult1 b3,b4,b5,b6,b2 = (b3 / (gcd b3,b6,b2)) * (b5 / (gcd b5,b4,b2)) ) );

definition
let c1 be gcdDomain;
let c2 be AmpleSet of c1;
let c3, c4, c5, c6 be Element of c1;
assume E59: ( c3,c4 are_co-prime & c5,c6 are_co-prime & c4 = NF c4,c2 & c6 = NF c6,c2 ) ;
func mult2 c3,c4,c5,c6,c2 -> Element of a1 equals :Def19: :: GCD_1:def 19
1. a1 if ( a3 = 0. a1 or a5 = 0. a1 )
1. a1 if ( a4 = 1. a1 & a6 = 1. a1 )
a6 / (gcd a3,a6,a2) if ( a6 <> 0. a1 & a4 = 1. a1 )
a4 / (gcd a5,a4,a2) if ( a4 <> 0. a1 & a6 = 1. a1 )
otherwise (a4 / (gcd a5,a4,a2)) * (a6 / (gcd a3,a6,a2));
coherence
( ( ( c3 = 0. c1 or c5 = 0. c1 ) implies 1. c1 is Element of c1 ) & ( c4 = 1. c1 & c6 = 1. c1 implies 1. c1 is Element of c1 ) & ( c6 <> 0. c1 & c4 = 1. c1 implies c6 / (gcd c3,c6,c2) is Element of c1 ) & ( c4 <> 0. c1 & c6 = 1. c1 implies c4 / (gcd c5,c4,c2) is Element of c1 ) & ( c3 = 0. c1 or c5 = 0. c1 or ( c4 = 1. c1 & c6 = 1. c1 ) or ( c6 <> 0. c1 & c4 = 1. c1 ) or ( c4 <> 0. c1 & c6 = 1. c1 ) or (c4 / (gcd c5,c4,c2)) * (c6 / (gcd c3,c6,c2)) is Element of c1 ) )
;
consistency
for b1 being Element of c1 holds
( ( ( c3 = 0. c1 or c5 = 0. c1 ) & c4 = 1. c1 & c6 = 1. c1 implies ( b1 = 1. c1 iff b1 = 1. c1 ) ) & ( ( c3 = 0. c1 or c5 = 0. c1 ) & c6 <> 0. c1 & c4 = 1. c1 implies ( b1 = 1. c1 iff b1 = c6 / (gcd c3,c6,c2) ) ) & ( ( c3 = 0. c1 or c5 = 0. c1 ) & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = 1. c1 iff b1 = c4 / (gcd c5,c4,c2) ) ) & ( c4 = 1. c1 & c6 = 1. c1 & c6 <> 0. c1 & c4 = 1. c1 implies ( b1 = 1. c1 iff b1 = c6 / (gcd c3,c6,c2) ) ) & ( c4 = 1. c1 & c6 = 1. c1 & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = 1. c1 iff b1 = c4 / (gcd c5,c4,c2) ) ) & ( c6 <> 0. c1 & c4 = 1. c1 & c4 <> 0. c1 & c6 = 1. c1 implies ( b1 = c6 / (gcd c3,c6,c2) iff b1 = c4 / (gcd c5,c4,c2) ) ) )
proof end;
end;

:: deftheorem Def19 defines mult2 GCD_1:def 19 :
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b3,b4 are_co-prime & b5,b6 are_co-prime & b4 = NF b4,b2 & b6 = NF b6,b2 holds
( ( ( b3 = 0. b1 or b5 = 0. b1 ) implies mult2 b3,b4,b5,b6,b2 = 1. b1 ) & ( b4 = 1. b1 & b6 = 1. b1 implies mult2 b3,b4,b5,b6,b2 = 1. b1 ) & ( b6 <> 0. b1 & b4 = 1. b1 implies mult2 b3,b4,b5,b6,b2 = b6 / (gcd b3,b6,b2) ) & ( b4 <> 0. b1 & b6 = 1. b1 implies mult2 b3,b4,b5,b6,b2 = b4 / (gcd b5,b4,b2) ) & ( b3 = 0. b1 or b5 = 0. b1 or ( b4 = 1. b1 & b6 = 1. b1 ) or ( b6 <> 0. b1 & b4 = 1. b1 ) or ( b4 <> 0. b1 & b6 = 1. b1 ) or mult2 b3,b4,b5,b6,b2 = (b4 / (gcd b5,b4,b2)) * (b6 / (gcd b3,b6,b2)) ) );

theorem Th47: :: GCD_1:47
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b2 is multiplicative & b3,b4 are_normalized_wrt b2 & b5,b6 are_normalized_wrt b2 holds
mult1 b3,b4,b5,b6,b2, mult2 b3,b4,b5,b6,b2 are_normalized_wrt b2
proof end;

theorem Th48: :: GCD_1:48
for b1 being gcdDomain
for b2 being AmpleSet of b1
for b3, b4, b5, b6 being Element of b1 st b2 is multiplicative & b3,b4 are_normalized_wrt b2 & b5,b6 are_normalized_wrt b2 holds
(mult1 b3,b4,b5,b6,b2) * (b4 * b6) = (mult2 b3,b4,b5,b6,b2) * (b3 * b5)
proof end;

theorem Th49: :: GCD_1:49
canceled;

theorem Th50: :: GCD_1:50
canceled;

theorem Th51: :: GCD_1:51
for b1 being non empty Abelian add-associative right_zeroed right_complementable distributive doubleLoopStr
for b2, b3 being Element of b1 holds
( (- b2) * b3 = - (b2 * b3) & b2 * (- b3) = - (b2 * b3) ) by VECTSP_1:40, VECTSP_1:41;

theorem Th52: :: GCD_1:52
canceled;

theorem Th53: :: GCD_1:53
for b1 being commutative Field-like Ring
for b2, b3 being Element of b1 st b2 <> 0. b1 & b3 <> 0. b1 holds
(b2 " ) * (b3 " ) = (b3 * b2) "
proof end;