0

Cấu trúc dữ liệu và Giải thuật Bài 70: Định lý thặng dư Trung Hoa (Chinese Remainder Theorem) - Giải hệ phương trình đồng dư.

Tiếp nối Chương 15 về toán học hệ thống và đại số cấu trúc, chúng ta đối mặt với một định lý toán học cổ xưa nhưng sở hữu sức mạnh tối thượng trong các hệ thống mã hóa hiện đại và xử lý số học lớn: Định lý thặng dư Trung Hoa (Chinese Remainder Theorem - CRT).

Trong các bài toán hệ thống phân tán hoặc mật mã học, đôi khi bạn cần giải quyết một hệ phương trình đồng dư dạng:

x≡a1(modm1)x \equiv a_1 \pmod{m_1}

x≡a2(modm2)x \equiv a_2 \pmod{m_2}

…\dots

x≡ak(modmk)x \equiv a_k \pmod{m_k}

Nếu các mô-đun m1,m2,…,mkm_1, m_2, \dots, m_k đôi một nguyên tố cùng nhau (gcd⁡(mi,mj)=1\gcd(m_i, m_j) = 1), Định lý thặng dư Trung Hoa khẳng định rằng hệ phương trình này luôn có một nghiệm duy nhất nằm trong khoảng từ 00 đến M−1M - 1 (với tích tổng quát M=m1⋅m2⋯mkM = m_1 \cdot m_2 \cdots m_k).

1. Cơ chế Toán học của CRT

Để tìm ra nghiệm tổng quát xx, thuật toán thực hiện theo các bước sau:

  1. Tính tích tổng quát của các mô-đun:

    M=m1⋅m2⋯mkM = m_1 \cdot m_2 \cdots m_k

  2. Tính phần bù cho từng phương trình: Với mỗi phương trình ii, tính Mi=MmiM_i = \frac{M}{m_i} (tích tất cả các mô-đun ngoại trừ mim_i).

  3. Tìm nghịch đảo modulo: Áp dụng Thuật toán Euclid mở rộng (từ Bài 69) để tìm phần tử nghịch đảo NiN_i của MiM_i dưới mô-đun mim_i, sao cho:

    (Mi⋅Ni)≡1(modmi)(M_i \cdot N_i) \equiv 1 \pmod{m_i}

  4. Tính nghiệm tổng quát xx:

    x=(∑i=1kai⋅Mi⋅Ni)(modM)x = \left( \sum_{i=1}^{k} a_i \cdot M_i \cdot N_i \right) \pmod M

2. Triển khai Định lý thặng dư Trung Hoa bằng Golang

Dưới đây là mã nguồn chuẩn mực giải hệ phương trình đồng dư bằng Go, tích hợp trực tiếp hàm tìm nghịch đảo modulo thông qua Euclid mở rộng:

Go

package main

import "fmt"

// Hàm mở rộng Euclid từ Bài 69 để tìm nghịch đảo modulo
func extendedGCD(a, b int64) (int64, int64, int64) {
	if b == 0 {
		return a, 1, 0
	}
	gcd, x1, y1 := extendedGCD(b, a%b)
	x := y1
	y := x1 - (a/b)*y1
	return gcd, x, y
}

func modInverse(a, m int64) int64 {
	_, x, _ := extendedGCD(a, m)
	return (x%m + m) % m
}

// Giải hệ phương trình đồng dư bằng Định lý thặng dư Trung Hoa (CRT)
// rem: mảng chứa các số dư [a_1, a_2, ..., a_k]
// mod: mảng chứa các mô-đun [m_1, m_2, ..., m_k] (đôi một nguyên tố cùng nhau)
func ChineseRemainderTheorem(rem []int64, mod []int64) int64 {
	k := len(rem)
	var totalProduct int64 = 1
	for i := 0; i < k; i++ {
		totalProduct *= mod[i]
	}

	var result int64 = 0
	for i := 0; i < k; i++ {
		mi := mod[i]
		ai := rem[i]

		// M_i = M / m_i
		Mi := totalProduct / mi

		// Tìm nghịch đảo modulo N_i của M_i dưới mô-đun m_i
		Ni := modInverse(Mi, mi)

		// Cộng dồn vào kết quả tổng
		result = (result + ai*Mi*Ni) % totalProduct
	}

	// Đảm bảo kết quả dương
	return (result + totalProduct) % totalProduct
}

func main() {
	// Ví dụ: Tìm số nguyên x nhỏ nhất sao cho:
	// x ≡ 2 (mod 3)
	// x ≡ 3 (mod 5)
	rem := []int64{2, 3}
	mod := []int64{3, 5}

	ans := ChineseRemainderTheorem(rem, mod)
	fmt.Printf("Nghiệm nhỏ nhất của hệ phương trình đồng dư là: %d\n", ans)
	// Kiểm tra: 8 % 3 = 2, 8 % 5 = 3 (Chính xác tuyệt đối!)
}

3. Phân tích Hiệu năng (Big-O)

  • Thời gian (Time Complexity): O(klog⁡(max⁡(mi)))O(k \log(\max(m_i))) (với kk là số lượng phương trình trong hệ). Độ phức tạp phụ thuộc hoàn toàn vào số lần gọi thuật toán Euclid mở rộng để tính nghịch đảo modulo cho từng mô-đun, đảm bảo tốc độ cực nhanh.

  • Không gian (Space Complexity): O(1)O(1) bộ nhớ phụ trợ ngoài việc lưu trữ các mảng đầu vào.

4. Ứng dụng Thực tế trong Hệ thống Enterprise

Định lý thặng dư Trung Hoa không chỉ là công cụ lý thuyết số mà đóng vai trò sống còn trong kiến trúc bảo mật:

  • Tối ưu hóa Thuật toán RSA (CRT-RSA): Trong mã hóa bất đối xứng RSA, thay vì thực hiện phép tính lũy thừa modulo trên một số nguyên cực lớn N=p⋅qN = p \cdot q (gây tốn kém chu kỳ CPU), hệ thống sử dụng CRT để tách quá trình giải mã thành hai phép tính nhỏ hơn trên pp và qq, sau đó kết hợp kết quả lại. Kỹ thuật này giúp tăng tốc độ giải mã RSA lên gấp 3 đến 4 lần trong thực tế.

  • Hệ thống Phân chia Bí mật (Secret Sharing Schemes): Sử dụng các thặng dư số học để chia nhỏ một khóa mã hóa tối mật thành nhiều phần phân rã lưu trữ trên các máy chủ độc lập khác nhau nhằm tăng cường độ bảo mật chống xâm nhập.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí