I. Phép đồng dư thức cơ bản
Đồng dư thức là luật lệ toán lấy số dư của số này Lúc phân tách cho tới số không giống, kí hiệu là . Ví dụ: , Lúc bại rất có thể viết lách là .
Phép đồng dư thức với đặc điểm phân phối so với luật lệ nằm trong, luật lệ nhân và luật lệ trừ, ví dụ như sau:
Bạn đang xem: Số học đồng dư (Phần 1): Đồng dư thức và Nghịch đảo modulo
- .
- .
- .
Riêng so với luật lệ phân tách, tất cả chúng ta không tồn tại đặc điểm phân phối, nhưng mà nên dùng một lí thuyết là Nghịch hòn đảo modulo.
II. Nghịch hòn đảo modulo của một số
1. Định nghĩa
Như tất cả chúng ta đều biết rõ ở lịch trình Toán phổ thông, nghịch tặc hòn đảo của một trong những vẹn toàn (kí hiệu ) là số thỏa mãn: .
Đối với nghịch tặc hòn đảo modulo, tao cũng đều có định nghĩa tương tự động, tuy nhiên là xét bên trên luyện số dư Lúc phân tách cho tới . Nghịch hòn đảo modulo của một trong những (cũng kí hiệu ) là số vẹn toàn thỏa mãn: (Nói cách thứ hai, đó là . Lấy ví dụ, nếu như tao lựa chọn thì .
Không nên khi nào thì cũng tồn bên trên . Chỉ Lúc thì mới có thể tồn bên trên là nghịch tặc hòn đảo modulo của . Để tính nghịch tặc hòn đảo modulo của một trong những, tao rất có thể dùng nhì giải thuật: Giải thuật Euclid không ngừng mở rộng hoặc dựa vào toan lý Fermat nhỏ (áp dụng giải thuật phân tách nhằm trị tính ).
2. Giải thuật Euclid cởi rộng
với 1 đặc điểm là luôn luôn rất có thể trình diễn bên dưới dạng phương trình:
Giải thuật Euclid không ngừng mở rộng dùng nhằm thăm dò một cặp số vẹn toàn thỏa mãn nhu cầu phương trình bên trên, và còn dùng làm tính nghịch tặc hòn đảo modulo (mình tiếp tục rằng cho tới tại phần sau). Cặp số rất có thể có mức giá trị âm, hoặc bởi đều được. Dưới phía trên tôi tiếp tục trình diễn giải thuật thăm dò và một cặp thỏa mãn nhu cầu phương trình.
long long d, x, y; // UCLN và cặp nghiệm (x, y).
void extended_euclid(long long A, long long B)
{
if (B == 0)
{
x = 1;
nó = 0;
d = A;
}
else
{
extended_euclid(B, A % B);
long long temp = x;
x = y;
nó = temp – (A / B) * y;
}
}
int main()
{
cin >> A >> B;
extended_euclid(A, B);
cout << d << ' ' << x << ‘ ‘ << y;
return 0;
}
Cơ chế của giải thuật như sau: Ban đầu lịch trình thực đua tương đương giải thuật Euclid, cho tới Lúc Lúc bại tao sẽ sở hữu là ước cộng đồng lớn số 1 của và tiếp sau đó đặt điều . Bởi vì như thế và lúc này nên phương trình trở thành:
Sau bại lịch trình gọi lại những mệnh lệnh bên dưới điều gọi đệ quy nhằm thăm dò đi ra và . Chứng minh như sau:
- Sau Lúc gọi đệ quy, phương trình ở bước tiếp sau của giải thuật là:
- Thay , phương trình trở thành:
B.x+(A-\left \lfloor{\frac{A}{B}} \right \rfloor.B).y=\text{GCD}(A,B)$$ $$\Leftrightarrow A.y+B.(x-\left \lfloor{\frac{A}{B}} \right \rfloor.y)=\text{GCD}(A,B)
- Từ phía trên được công thức đệ quy:
- Như vậy kể từ bước cơ bạn dạng lịch trình tiếp tục nối tiếp tính ngược lên nhằm đi ra được thỏa mãn nhu cầu phương trình lúc đầu. Độ phức tạp giải thuật là .
Ngoài đi ra, giải thuật Euclid không ngừng mở rộng còn rất có thể dùng nhằm giải phương trình Diophantine tuyến tính, sẽ tiến hành rằng cho tới ở một nội dung bài viết không giống.
3. Tính toán nghịch tặc hòn đảo Modulo của một số
Sử dụng giải thuật Euclid cởi rộng
Như tiếp tục trình diễn phía trên, theo dõi giải thuật Euclid không ngừng mở rộng, nếu như , tao luôn luôn tìm ra và thỏa mãn: . Mà phân tách không còn cho tới , vì thế phương trình trở thành:
Xem thêm: Người bán vé số lời bao nhiêu? Thu nhập trung bình khi bán 100 tờ
Từ phía trên suy đi ra đó là . Tuy nhiên nhập giải thuật Euclid không ngừng mở rộng, rất có thể đem độ quý hiếm âm, nên tao tiếp tục kiểm soát và điều chỉnh một chút ít nhằm tính giá tốt trị luôn luôn ko âm. Code tiếp sau đây tiếp tục tái mét dùng lại đoạn code giải thuật Euclid không ngừng mở rộng ở phía trên:
long long modulo_inverse(long long a, long long M)
{
extended_euclid(a, M);
// a và M ko nhân tố bên nhau, ko tồn bên trên nghịch tặc hòn đảo modulo M của a.
if (d != 1)
return -1;
// Do x rất có thể âm, tao thực hiện dương nó.
return (x % M + M) % M;
}
Tính nghịch tặc hòn đảo modulo bởi toan lý Fermat nhỏ
Theo toan lý Fermat nhỏ, tao có: Nếu là số nhân tố và ko phân tách không còn cho tới thì:
a^{M-1}\equiv 1 \ (\text{mod} \ M)$$ hoặc rằng cơ hội khác: $$a\times a^{M-2} \equiv 1 \ (\text{mod} \ M)
Điều này tương tự với việc nếu như là số nhân tố và ko phân tách không còn cho tới thì đó là nghịch tặc hòn đảo modulo của , cũng tương tự với là nghịch tặc hòn đảo modulo của .
long long power_mod(long long a, long long b, long long M) // Tính a^b % M.
{
if (b == 0)
return 1;
if (b == 1)
return a;
long long half = power_mod(a, b / 2, M) % M;
if (b % 2 == 0)
return (half * half) % M;
else
return (((half * half) % M) * a) % M;
}
long long modulo_inverse(int a, int M)
{
return power_mod(a, M – 2, M);
}
4. gí dụng nghịch tặc hòn đảo modulo nhằm tính
Mình tiếp tục rằng ở mục , luật lệ phân tách không tồn tại đặc điểm phân phối so với luật lệ đồng dư thức tương đương tựa như những luật lệ nằm trong, trừ và nhân. Để tính tao thực hiện như sau:
- Tách nhập bại là nghịch tặc hòn đảo modulo của .
- Sau bại vận dụng đặc điểm phân phối của luật lệ nhân so với luật lệ đồng dư thức, thời điểm hiện tại luật lệ phân tách modulo phát triển thành luật lệ nhân với nghịch tặc hòn đảo modulo. Lưu ý, tùy nhập độ quý hiếm nhưng mà tao chọn lựa cách thăm dò nghịch tặc hòn đảo modulo phù hợp ( với là số nhân tố hoặc không).
Cài đặt:
long long modulo_divide(long long a, long long b, long long c)
{
long long inverse = modulo_inverse(b, c);
return (a % c * inverse) % c;
}
III. Một số kỹ năng và kiến thức nâng lên khác
1. Bậc lũy quá theo dõi modulo (Multiplicative Order)
Xét nhì số vẹn toàn và nhân tố bên nhau, bậc lũy thừa của theo dõi modulo là số vẹn toàn dương nhỏ nhất thỏa mãn: , kí hiệu là .
Theo toan lý Euler, vì như thế và là nhì số nhân tố bên nhau nên với là con số số vẹn toàn dương ko vượt lên trên quá và nhân tố bên nhau với . Mà , vì thế , vậy nhằm thăm dò chỉ việc duyệt một vòng lặp kể từ cho tới với chừng phức tạp .
int find_m_order(int a, int N)
{
int mul = 1;
for (int i = 1; i <= N; ++i)
{
mul = (mul * a) % N;
if (mul == 1)
return i;
}
}
2. Tiêu chuẩn chỉnh Euler (Euler's Criterion)
Đầu tiên, tao thích nghi với định nghĩa Thặng dư bậc hai: Một số vẹn toàn được gọi là thặng dư bậc hai theo dõi modulo nếu mà nó đồng dư với một trong những chủ yếu phương theo dõi modulo tức thị tồn bên trên một trong những vẹn toàn sao cho tới .
Trong lý thuyết số, tiêu chuẩn chỉnh Euler là một trong những công thức dùng làm xác lập coi một trong những vẹn toàn với nên là một trong những thặng dư bậc nhì theo dõi modulo (với là một trong những vẹn toàn tố) hay là không. Theo bại, xét nhì số vẹn toàn và nhân tố bên nhau, nhập bại là một trong những nhân tố lẻ. Ta với công thức sau:
Đối với tình huống từng số vẹn toàn đều là thặng dư bậc nhì theo dõi modulo .
Ví dụ, xét , tao với là thặng dư bậc nhì của , vì như thế tồn bên trên nhì số vẹn toàn và thỏa mãn nhu cầu .
long long power_mod(long long a, long long b, long long P)
{
if (b == 0)
return 1;
if (b == 1)
return a;
long long half = power_mod(a, b / 2, P) % P;
if (b % 2 == 0)
return (half * half) % P;
else
return (((half * half) % P) * (a % P)) % P;
}
// Kiểm tra N với nên thặng dư bậc 2 của P.. hay là không.
bool check_quadratic_residue(long long N, long long P)
{
if (P == 2)
return true;
else
return (power_mod(N, (P - 1) / 2, P) == 1);
}
Trong tình huống và cùng theo với dạng , thì độ quý hiếm thỏa mãn nhu cầu (nếu tồn tại) chỉ rất có thể là: . Dựa nhập phán xét này tao rất có thể tính thời gian nhanh đi ra độ quý hiếm . Chứng minh phán xét như sau:
Xem thêm: Tải phim về xem offline
- Theo toan lý Euler, tao có: .
- Nhân cả nhì vế với :
- Lại có: . (do đẳng thức ). (do ). . (do ).
Cài đặt:
int find_quadratic_residue(int N, int P)
{
// P.. và N ko ở chính dạng 4i + 3, ko tính được Theo phong cách này.
if (P % 4 != 3 || N % 4 != 3)
return -1;
int x = power_mod(N, (P + 1) / 2, P);
// Kiểm tra độ quý hiếm x loại nhất với hợp thức ko.
if ((x * x) % P.. == N % P)
return x;
// Kiểm tra độ quý hiếm x loại nhì với hợp thức ko.
x = P.. - x;
if ((x * x) % P.. == N % P)
return x;
// Nếu ko tồn bên trên x, Kết luận N ko nên thặng dư bậc 2 của P
return -1;
}
IV. Tài liệu tham ô khảo
- https://en.wikipedia.org/wiki/Quadratic_residue
- https://en.wikipedia.org/wiki/Euler%27s_criterion
- https://vnoi.info/wiki/translate/he/So-hoc-Phan-1-Modulo-gcd.md
- https://vnoi.info/wiki/algo/math/modular-inverse.md
- https://en.wikipedia.org/wiki/Modular_multiplicative_inverse
- https://en.wikipedia.org/wiki/Multiplicative_order
- https://vi.wikipedia.org/wiki/%C4%90%E1%BB%8Bnh_l%C3%BD_Euler
- https://www.geeksforgeeks.org/find-square-root-under-modulo-p-set-1-when-p-is-in-form-of-4i-3/
©️ Tác giả: Vũ Quế Lâm kể từ Viblo
Bình luận