Chuyển đến nội dung chính

Các cách kiểm tra số nguyên tố

Trong đời sống, số nguyên tố được ứng dụng trong rất nhiều lĩnh vực của chúng ta. Nhờ vào tính chất số học của mình, nó đã được sử dụng nhiều trong lĩnh vực mã hóa, bảo mật, cũng như trong một số thuật toán tạo số ngẫu nhiên, bảng băm, hay trong giải thuật mã hóa RSA...Nhưng quan trọng nhất vẫn là làm sao để chúng ta biết được một số nào đó có phải là số nguyên tố? Vì vậy trong bài viết hôm nay chúng ta sẽ cùng điểm qua một số cách để kiểm tra tính nguyên tố của một số bất kì.

Lưu ý: các thuật toán trong bài viết này được sắp xếp theo độ phực tạp thời gian giảm dần.

    1. Số nguyên tố là gì?

Số nguyên tố là số tự nhiên  lớn hơn 1 không phải là tích của hai số tự nhiên nhỏ hơn. Nói cách khác, số nguyên tố là những số chỉ có đúng hai ước số  là 1 và chính nó. 

Tất cả số nguyên tố lớn hơn 3 đều có thể biểu diễn dưới dạng  6k ± 1.

Ngoại trừ số 2 các số nguyên tố lớn hơn đều là số lẻ.

    2. Môt số giải thuật kiểm tra số nguyên tố n:

    • Giải thuật đơn giản O(n):

                    Dựa vào tính chất của số nguyên tố chỉ có 2 ước duy nhất là một và chính nó nên một  trong những phương pháp đơn giản là chúng ta sẽ duyệt qua các số từ 2 đến n-1 và kiểm tra xem với mỗi số duyệt qua n có chia hết cho số nào hay không? nếu có ta có thể kết luận ngây số n không là số nguyên tố ngược lại số n là một số nguyên tố.

    • Giải thuật chia thử O(√n):

                      Chúng ta có thể cải tiến thuật toán ở trên như sau thay vì duyệt tới n-1 ta có thể duyệt tới √n vì  nếu n chia hết cho một thừa số nhỏ hơn thì cũng chia hết cho thừa số lớn hơn bé hơn n vì thừa số lớn hơn là bội của thừa số nhỏ hơn đã duyệt. Hay nói cách khác nếu n chia hết cho i cũng đồng nghĩa n chia hết cho n/i.

    • Cải tiến giải thuật chia thử O(√n):

                    Chúng ta biết một tính chất quan trọng của số nguyên tố là với mọi số nguyên tố lớn hơn 3 chúng ta đều có thể biểu diễn dưới dạng  6k ± 1.Vì vậy để cải tiến thuật trên chúng ta sẽ xét xem số có chia hết cho 2 hoặc 3 hay không sau đó kiểm tra qua các số có dạng  6k ± 1 bé hơn hoặc bằng căn của n. Ngoài ra việc sử dụng hàm sqrt() có thể dẫn đến một số rất rối với số lớn vì hàm sqrt() trả về một kiểu dữ liệu số thực nên ta có thể cải tiến hàm sqrt() bằng i*i<=n việc đảm bảo tính an toàn hơn của thuật.
    
Qua việc cải tiến trên ta có thể thấy tốc độ kiểm tra bây giờ đã tăng gấp 3 lần so với ban đầu.

    • Sàng nguyên tố Eratosthenes O(nlogn):

                    Giả sử chúng ta cố một bài toán yêu cầu kiểm tra các số từ 1 đến N có phải là số nguyên tố hay không với N khoảng 10^6. Nếu chúng ta áp dụng giải thuật chia thử đã cải tiến với các số từ 1 đến N độ phức tạp có thể đạt được là O(n√n) với N lến tới 10^6 thì đây với độ phức tạp này có thể xem là tương đối lớn. Tuy nhiên chúng ta có thể cải tiến bằng cách sử dụng sàng số nguyên tố với độ phức tạp là O(nlogn) với độ phức tạp này ta có thể giải quyết một số bài toàn trong 1s mà độ phức tạp trong không thể làm được.
                    Nguyên lý hoạt động của thuật toán này khá đơn giản:

                        +Đầu tiên ta sẽ dựng nên một sàng gồm các số tự nhiên từ 1 đến N
                        +Sau đó vào mỗi lần duyệt sàng ta sẽ chọn một số nguyên tố và loại ra khỏi sàng tất cả các bội của số nguyên tố đó mà lớn hơn số đó. Sau khi duyệt xong các số trong sàng sẽ đều là các số nguyên tố bé hơn N
Sau khi xây dựng sàn việc kiểm tra 1 số trong khoảng từ đến N có phải là số nguyên tố hay không chỉ mất O(1).

    • Thuật toán Fermat:

    • Thuật toán MillerRabin:












                



    

Nhận xét

Bài đăng phổ biến từ blog này

Thuật toán lùa bò vào chuồng(Đếm phân phối)

Làm cách nào từ một coder chân chính  trở thành một người chăn bò 😃😃 Chắc hẳn trong lập trình chúng ta không khó để gặp gỡ các bài toán đếm.Tuy nhiên việc thực hiện các bài toán đếm thường được diễn ra trên dữ liệu lớn, nếu các bạn không biết cách tổ chức dữ liệu và thực hiện  thuật toán hiệu quả thường sẽ dẫn đến kết quả sai lầm. Vì vậy trong bài viết hôm nay chúng ta sẽ cùng tìm hiểu qua một trong những cách tiếp cận bài toán đếm đó là thuật toán lùa bò vào chuồng hay còn gọi là đếm phân phối. 1. Đặt vấn đề: Ban đầu bạn có một mảng số gồm N phần tử ( N <10^5) mỗi giá trị trong mảng đều bé hơn hoặc bằng 100. Bạn được giao nhiệm vụ đếm xem trong mảng số đó có bao nhiêu phần tử riêng biệt.      VD: N=10      arr []  =   1 6 9 1  7 9 9 9 2 3 => 6 phần tử riêng biệt. 2.Thuật toán lùa bò vào chuồng:   Tư tưởng của thuật toán: giả sử bạn là một người nông dân sở hữu một nông trại bò và bạn cần phải đếm chính xác số lượng những chú bò trong trang trại để dễ quản lý. Vi những chú bò

Vét cạn hay duyệt trâu (Brute Force)

Thuật toán vét cạn:  Thuật toán vét cạn hay duyệt trâu (Brute Force) được  hiểu đúng như tên gọi của nó, chúng ta sẽ dùng những phương pháp đơn giản để duyệt qua toàn bộ các trường hợp của bài toán và bằng sức mạnh của máy  tính để tìm ra được đáp án chính xác thay vì dùng các thuật toán hiệu quả hơn .  VD: bài toán sống sót qua cuối tháng khi hết tiền tiêu:  Giải pháp của bài này là chúng ta sẽ dùng  vòng for vét can toàn bộ lương thực quanh nhà như mì tôm, hủ gạo... Để có thể tìm ra bữa ăn sống sót qua ngày và vì phải chạy đi tìm kiếm khắp nơi nên cách làm này sẽ có hơi tốn sức (dẫn đến chết đói). Có nhiều cách duyệt khác nhau như: Dùng nhiều vòng for If, else Đệ Quy, quay lui (Backtracking) Bitmask .... Giải thuật này thường rất hiệu quả với những bài toán có dữ liệu đầu vào nhỏ nhưng đối với các dữ liệu lớn hơn hay các bài toán phức tạp hơn sẽ tốn rất nhiều thời gian và đòi hỏi một lực code trâu bò để có thể vét cạn hết toàn bộ.

(MESEC) MỘT SỐ TRANG WEB LUYỆN TẬP OSINT CHO NGƯỜI MỚI BẮT ĐẦU

OSINT là một trong các mảng của hình thức Jeopardy CTF và đang dần tiếp cận được với nhiều người hơn bởi những lợi ích mà nó đem lại. Vậy OSINT là gì? OSINT (Open Source Intelligency) là thuật ngữ dùng để chỉ bất kỳ thông tin nào có thể được thu thập hợp pháp từ các nguồn công khai, miễn phí về một cá nhân hoặc tổ chức. Trên thực tế, bất cứ hoạt động nào thông qua Internet đều phải để lại các thông tin có thể thu thập được, từ thông tin về tên miền, máy chủ web, máy chủ e-mail đến các file tài liệu, bài thuyết trình, video, hình ảnh… và cả những bài post, comment, hashtag trên các mạng xã hội có liên quan đến từ khóa nào đó. OSINT cũng là công cụ mà giới tội phạm mạng dùng để nghiên cứu thông tin đối tượng mà họ nhắm tới trước khi tấn công. Tuy nhiên, ở chiều ngược lại thì doanh nghiệp cũng có thể dùng để điều tra xác minh đối tác giao dịch qua mạng để phát hiện những dấu hiện khả nghi. Trong bài viết ngày hôm nay, MeSec sẽ đề xuất một vài trang web sẽ giúp cho bạn học tập và rèn luyện