Tìm Số Carmichael trong Python

Học lập trình

Số Carmichael là gì?

Số Carmichael là một loại số nguyên dương đặc biệt trong toán học. Một số nguyên dương n được gọi là số Carmichael nếu nó thỏa mãn các điều kiện sau đây:

  1. n là số nguyên dương không phải là số nguyên tố.
  2. Với mọi số nguyên a sao cho a và n không có ước chung, ta có a^(n-1) ≡ 1 (mod n).

Điều thú vị về số Carmichael là chúng có thể đánh lừa thuật toán kiểm tra số nguyên tố thông thường, ví dụ như thuật toán kiểm tra số nguyên tố bằng phép chia. Điều này là do các số Carmichael thỏa mãn rất nhiều điều kiện giống như số nguyên tố, nhưng không phải là số nguyên tố thực sự.

Ví dụ về số Carmichael là 561. Số này không phải là số nguyên tố vì có thể phân tích thành 3 x 11 x 17. Tuy nhiên, khi áp dụng định lý Fermat, ta có a^(560) ≡ 1 (mod 561) cho mọi a không chia hết cho 3, 11, hoặc 17.

Số Carmichael là một khái niệm quan trọng trong lý thuyết số và có ứng dụng trong mật mã học và kiểm tra số nguyên tố.

Thuật toán tìm số Carmichael

Tìm số Carmichael là một vấn đề phức tạp và không có thuật toán hiệu quả để liệt kê tất cả các số Carmichael. Tuy nhiên, có một số thuật toán được sử dụng để tìm một số Carmichael.

Một phương pháp đơn giản để tìm số Carmichael là kiểm tra các số nguyên không phải là số nguyên tố, và sau đó kiểm tra tính chất a^(n-1) ≡ 1 (mod n) với mọi số nguyên a không có ước chung với n. Tuy nhiên, phương pháp này không hiệu quả với các số lớn và không đảm bảo tìm được tất cả các số Carmichael.

Có một thuật toán nhanh hơn được gọi là thuật toán “Bảng nhân” (Square-and-Multiply algorithm) để kiểm tra tính chất a^(n-1) ≡ 1 (mod n). Thuật toán này dựa trên việc tính lũy thừa bằng phép nhân và phép bình phương.

Dưới đây là một phiên bản đơn giản của thuật toán tìm số Carmichael:

  1. Chọn một số nguyên dương n.
  2. Kiểm tra xem n có phải là số nguyên tố hay không. Nếu là số nguyên tố, bỏ qua n và chọn số nguyên dương khác.
  3. Lặp lại các bước từ 4 đến 7 cho mọi số nguyên a từ 2 đến n-1: 4. Tính b = a^(n-1) mod n bằng cách sử dụng thuật toán “Bảng nhân”.
    1. Nếu b không bằng 1, bỏ qua n và chọn số nguyên dương khác.
    2. Nếu b = 1, tiếp tục với các giá trị a tiếp theo.
  4. Nếu đã kiểm tra với tất cả các giá trị a từ 2 đến n-1 và không có giá trị nào không thỏa mãn, thì n là một số Carmichael.

Lưu ý rằng thuật toán trên chỉ tìm một số Carmichael. Để liệt kê tất cả các số Carmichael, bạn sẽ cần sử dụng các phương pháp phức tạp hơn, chẳng hạn như sử dụng công thức phân tích thành thừa số nguyên tố hoặc các thuật toán khác trong lĩnh vực lý thuyết số.

Cài đặt Thuật toán tìm số Carmichael trong Python

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

def square_and_multiply(base, exponent, modulus):
    result = 1
    base = base % modulus
    while exponent > 0:
        if exponent % 2 == 1:
            result = (result * base) % modulus
        exponent = exponent // 2
        base = (base * base) % modulus
    return result

def is_carmichael(n):
    if is_prime(n):
        return False
    for a in range(2, n):
        if square_and_multiply(a, n-1, n) != 1:
            return False
    return True

# Test
print("Carmichael numbers:")
for i in range(2, 100):
    if is_carmichael(i):
        print(i)

Trong đoạn mã trên, hàm is_prime(n) kiểm tra xem một số n có phải là số nguyên tố hay không bằng phương pháp sàng Eratosthenes. Hàm square_and_multiply(base, exponent, modulus) tính a^(n-1) mod n bằng phương pháp “Bảng nhân”. Cuối cùng, hàm is_carmichael(n) kiểm tra xem một số n có phải là số Carmichael hay không bằng cách kiểm tra tính chất a^(n-1) ≡ 1 (mod n) với mọi a từ 2 đến n-1.

Trong ví dụ trên, chương trình tìm và in ra tất cả các số Carmichael từ 2 đến 100. Bạn có thể thay đổi phạm vi hoặc sử dụng hàm is_carmichael(n) để kiểm tra một số cụ thể.

One thought on “Tìm Số Carmichael trong Python

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *