Extended Euclid and Inverse Element
See the complete article of my own blog https://dyingdown.github.io/2019/08/14/Extended-Euclid-and-Inverse-element/
Today’s importance is inverse element, however, inverse element calculation is based on the extended Euclid algorithm. At first, we need to know the Euclid’s algorithm.
A much more efficient method is the Euclidean algorithm, which uses a division algorithm such as long division in combination with the observation that the gcd of two numbers also divides their difference. --from Wikipedia
Extended Euclided
a x + b y = g c d ( a , b ) ax+by = gcd(a, b) ax+by=gcd(a,b)
From the Euclid Method of calculating gcd, we know that
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
%
b
)
gcd(a, b) = gcd(b,a \% b)
gcd(a,b)=gcd(b,a%b)
We set another function
b
x
1
+
(
a
%
b
)
y
1
=
g
c
d
(
b
,
a
%
b
)
bx_1 + (a\%b)y_1 = gcd(b, a \% b)
bx1+(a%b)y1=gcd(b,a%b)
So, combine the first function with the third function we got
a
x
+
b
y
=
b
x
1
+
(
a
%
b
)
y
1
⇒
a
x
+
b
y
=
b
x
1
+
(
a
−
a
/
b
×
b
)
y
1
⇒
a
x
+
b
y
=
b
x
1
+
a
y
1
−
b
×
(
a
/
b
)
y
1
⇒
a
x
+
b
y
=
a
y
1
+
b
(
x
1
−
a
/
b
×
y
1
)
⇒
{
x
=
y
1
y
=
(
x
1
)
−
a
/
b
×
y
1
)
ax+by = bx_1+(a\%b)y_1\\ \Rightarrow ax+by=bx_1+(a-a /b \times b)y_1\\ \Rightarrow ax+by=bx_1+ay_1-b\times(a/b)y_1\\ \Rightarrow ax + by = ay_1+ b(x_1-a/b\times y_1)\\ \Rightarrow \left\{ \begin{aligned} x & = y_1 \\ y & = (x_1) - a / b \times y_1) \end{aligned} \right.
ax+by=bx1+(a%b)y1⇒ax+by=bx1+(a−a/b×b)y1⇒ax+by=bx1+ay1−b×(a/b)y1⇒ax+by=ay1+b(x1−a/b×y1)⇒{xy=y1=(x1)−a/b×y1)
We define that if
b
=
0
:
x
=
1
,
y
=
0
b = 0:x = 1 , y = 0
b=0:x=1,y=0
So we can write our function in this way
typedef pair<int,int> P;
P gcdEx(int a, int b){
if(b == 0) return P(1, 0);
else{
P p = gcdEx(b, a % b);
return P(t.second, t.first - (a / b) * t.second);
}
}
The previous one is the direct one we can get from the mathematical function. Here is a better way of writing it.
void gcdEx(int a, int b, int &x, int &y){
if(b == 0){
x = 1; y = 0;
}else{
gcdEx(b, a % b, y, x);
y -= a / b * x;
}
}
Inverse Element
a x ≡ 1 ( m o d b ) ax \equiv 1 (mod \space b) ax≡1(mod b)
There is a inverse element only if a and b are both prime numbers. The equation above means both side mod b at the same time is equal. x is a reverse element of a under mod b.
We can change the equation into this.
a
x
m
o
d
m
=
1
a
x
−
m
y
=
1
ax \space mod \space m = 1\\ ax -my = 1
ax mod m=1ax−my=1
y is the middle element used to solve x.
So the code looks like this.
int x, y;
gcdEx(a, m, x, y);
x = (x % m + m) % m;
x is the inverse element of a.