Thuật toán thừa số nguyên tố: C, Python Ví dụ

⚡ Tóm tắt thông minh

Thuật toán phân tích thừa số nguyên tố phân tích bất kỳ số nguyên dương nào thành tích của các số nguyên tố bằng cách sử dụng phép chia thử đến căn bậc hai, hoặc một biến thể của thuật toán sàng Eratosthenes lưu trữ từng thừa số nguyên tố nhỏ nhất.

  • 🧮 Định nghĩa: Các thừa số nguyên tố của một số nguyên là những số nguyên tố có tích bằng số nguyên đó; 10 chia hết cho 2 và 5.
  • 🔁 Phân khu xét xử: Lặp lại từ 2 đến sqrt(n) và chia khi môđun bằng 0 sẽ mất thời gian O(sqrt(n)).
  • 🧰 Phương pháp sàng lọc: Việc lưu trữ thừa số nguyên tố nhỏ nhất cho mỗi giá trị đến một giới hạn nhất định giúp giảm thời gian phân tích thừa số xuống còn khoảng O(log n) cho mỗi truy vấn.
  • 🐍 Python Code: Lặp đi lặp lại và đệ quy Python Các phương thức này in ra từng thừa số nguyên tố của một số đã nhập.
  • 💻 C Code: Việc so sánh các chương trình C lặp và đệ quy minh họa cùng một logic bằng cách sử dụng stdio và một mảng đã được tính toán trước.
  • 🔐 Sử dụng: Phân tích thừa số nguyên tố, lũy thừa, kiểm tra tính chia hết, đơn giản hóa phân số, mẫu số chung và khóa mật mã dựa trên số.

Thuật toán thừa số nguyên tố

Hệ số nguyên tố là gì?

Thừa số nguyên tố của một số là thừa số mà bản thân nó cũng là một thừa số nguyên tố. số nguyên tốChỉ chia hết cho 1 và chính nó.

Ví dụ: Các thừa số nguyên tố của 10 là 2 và 5, vì 2 × 5 = 10.

Tìm các thừa số nguyên tố bằng cách sử dụng phép lặp

Lặp từ 2 đến sqrt(n) và kiểm tra tính chia hết. Trong khi n chia hết cho ứng viên hiện tại, hãy thực hiện phép chia và in ra.

Ví dụ: mọi số nguyên tố lớn hơn 40 đều phù hợp với n2+n+41, vậy n = 0, 1, 2 cho kết quả 41, 43, 47.

Làm thế nào để in ra thừa số nguyên tố của một số?

  • Lặp lại các số từ 2 đến sqrt(n).
  • Kiểm tra phần dư của n với từng ứng viên; phần dư bằng 0 có nghĩa là ứng viên đó là một thừa số nguyên tố.
  • Thu thập tất cả các số nguyên tố chia hết cho n.
  • Thủ tục này chạy với độ phức tạp thời gian O(sqrt(n)).

Thuật toán:

Set a counter i to 2
While i <= sqrt(n):
    While n % i == 0:
        n = n / i
        print i
    i = i + 1
if n > 1:
    print n

Thuật toán sàng

Phương pháp sàng lưu trữ thừa số nguyên tố nhỏ nhất của mọi số, tối đa đến một giới hạn nhất định, giúp giảm đáng kể chi phí phân tích thừa số sau khi tính toán trước.

  • Ghi lại ước số nguyên tố nhỏ nhất của mỗi số nguyên, đến giới hạn tối đa.
  • Lấy số nguyên tố nhỏ nhất đó và thêm nó vào tập hợp các thừa số.
  • Chia số đó cho số nguyên tố đó và lặp lại cho đến khi đạt đến 1.
  • Mỗi truy vấn chạy trong khoảng O(log n).

Ví dụ: Một số nguyên tố khác 2 và 3 có dạng 6n-1 hoặc 6n+1. Ví dụ, 5 = 6(1)-1 và 19 = 6(3)+1.

Thuật toán: định nghĩa một mảng Nó lưu trữ thừa số nguyên tố nhỏ nhất của mỗi số, sử dụng chỉ số làm giá trị ban đầu cho mỗi phần tử.

Set array[1] to 1
Set i to 2
While i*i <= max_number:
    If array[i] == i:
        Set j to i*i
        While j <= max_number:
            If array[j] == j:
                array[j] = i
            j = j + i
    i = i + 1
while the_number != 1:
    print array[the_number]
    the_number = the_number / array[the_number]

Bài viết liên quan

Python Các yếu tố chính sử dụng phép lặp

Sau đây Python Đoạn mã này tìm các thừa số nguyên tố bằng phương pháp thử và chia lặp đi lặp lại:

import math
def PrimeFactors(n):
    for i in range(2, int(math.sqrt(n)) + 1, 1):
        while n % i == 0:  # find all the occurrences of a prime factor
            print((int)(i))
            n = n // i
    if n != 1:  # if the number was originally a prime
        print((int)(n))
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

Đầu ra:

Enter the number you want: 4
2
2

Python Các thừa số nguyên tố sử dụng đệ quy

Python Đoạn mã bên dưới sử dụng phương pháp sàng để tìm các thừa số nguyên tố của một số cho trước.

import math
High = (int)(1e5 + 7)
array = [0 for i in range(High)]

# generate smallest prime factors
def Sieve():
    for i in range(1, High):
        array[i] = i
    for i in range(2, math.ceil(math.sqrt(High))):
        if array[i] == i:
            for j in range(i * i, High, i):
                if array[j] == j:
                    array[j] = i

def PrimeFactors(n):  # divide until we reach 1
    if n == 1:
        return
    print((int)(array[n]))
    PrimeFactors((int)(n / array[n]))

Sieve()
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

Đầu ra:

Enter the number you want: 4
2
2

Chương trình thừa số nguyên tố C sử dụng phép lặp

Giải pháp lặp tương tự được viết trong C: nhập một số, sau đó với mỗi ứng viên từ 2 đến sqrt(n), kiểm tra tính chia hết và in ra mọi lần xuất hiện của thừa số nguyên tố.

#include <stdio.h>
int main()
{
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    for (int i = 2; i * i <= n; i++)
    {
        while (n % i == 0)  // find all the occurrences of a prime factor
        {
            printf("%d\n", i);
            n /= i;
        }
    }
    if (n != 1)  // if the number was originally a prime
    {
        printf("%d", n);
    }
    return 0;
}

Đầu ra:

Enter the number you want: 2
2

Chương trình thừa số nguyên tố C sử dụng đệ quy

Chương trình thừa số nguyên tố C sử dụng đệ quy

Phiên bản đệ quy C phản ánh Python Một: xây dựng mảng các thừa số nguyên tố nhỏ nhất, sau đó lặp lại phép chia cho thừa số đó cho đến khi n đạt đến 1.

#include <stdio.h>
int Max = 100007;
int array[100007];

void Sieve()  // smallest prime factors up to Max
{
    for (int i = 1; i < Max; i++)
        array[i] = i;
    for (int i = 2; i * i <= Max; i++)
    {
        if (array[i] == i)
        {
            for (int j = i * i; j < Max; j += i)
            {
                if (array[j] == j)
                    array[j] = i;
            }
        }
    }
}

void PrimeFactors(int n)
{
    if (n == 1)  // divide until we reach 1
        return;
    printf("%d\n", array[n]);
    PrimeFactors(n / array[n]);
}

int main()
{
    Sieve();
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    PrimeFactors(n);
    return 0;
}

Đầu ra:

Enter the number you want: 2
2

Một số sự thật thú vị về số Prime

  • Bất kỳ số chẵn nào khác 2 đều có thể được viết dưới dạng tổng của hai số nguyên tố (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Không có số nguyên tố nào liên tiếp khác ngoài 2 và 3, vì 2 là số nguyên tố chẵn duy nhất.
  • Mọi số nguyên tố ngoại trừ 2 và 3 đều có dạng 6n + 1 hoặc 6n − 1, trong đó n là một số nguyên dương.
  • Tập hợp các thừa số nguyên tố của một số là duy nhất.
  • Số 1 không phải là số nguyên tố cũng không phải là số hợp số.
  • Phân tích thừa số nguyên tố giúp kiểm tra tính chia hết, đơn giản hóa phân số và tìm mẫu số chung.
  • Phân tích thừa số nguyên tố cũng là nền tảng của các mã mật mã dựa trên số.

Câu Hỏi Thường Gặp

Phân tích thừa số nguyên tố chia một số nguyên thành tích của các số nguyên tố, ví dụ 12 = 2 × 2 × 3. Các thừa số nguyên tố là duy nhất đối với mọi số nguyên lớn hơn một.

Nếu n có thừa số lớn hơn sqrt(n), thì cặp của nó nhỏ hơn và đã được tìm thấy. Bất cứ thứ gì vượt quá sqrt(n) đều lặp lại được.

Phép chia thử chạy trong O(sqrt(n)). Thuật toán sàng tính toán trước các thừa số nguyên tố nhỏ nhất trong O(N log log N), sau đó trả lời mỗi phép phân tích thừa số trong khoảng O(log n).

Sử dụng phương pháp sàng khi phân tích nhiều số thành thừa số trong một giới hạn trên đã biết. Một phép tính trước cho phép mỗi truy vấn sau đó chạy trong khoảng O(log n).

Không. Số 1 không phải là số nguyên tố cũng không phải là hợp số, vì vậy nó không bao giờ xuất hiện trong danh sách các thừa số nguyên tố. Phân tích thừa số nguyên tố chỉ sử dụng các số nguyên tố lớn hơn hoặc bằng 2.

Phân tích thừa số nguyên tố là nền tảng của các phép thử chia hết, rút ​​gọn phân số, bội chung nhỏ nhất (LCM) và ước chung lớn nhất (GCD), cũng như mật mã khóa công khai như RSA, nơi việc phân tích thừa số một tích lớn của hai số nguyên tố là rất khó.

Các hệ thống AI áp dụng phân tích thừa số nguyên tố vào các đặc điểm lý thuyết số, phân tích khóa mật mã và học tập liên kết an toàn. Nghiên cứu học máy hậu lượng tử cũng nghiên cứu khả năng chống phân tích thừa số.

Đúng vậy. GitHub Copilot và các trợ lý AI tương tự tự động hóa các đoạn mã lặp đi lặp lại cho các thuật toán phân chia thử nghiệm và sàng lọc, mặc dù các nhà phát triển vẫn kiểm tra độ phức tạp và các trường hợp ngoại lệ như n = 1.

Tóm tắt bài viết này với: