Điều đầu tiên cần lưu ý là nó đủ để tìm tất cả các yếu tố chính. Một khi bạn có những điều này thật dễ dàng để tìm số tổng số ước: cho mỗi số nguyên tố, thêm 1 vào số lần nó xuất hiện và nhân chúng lại với nhau. Vì vậy, đối với 12 = 2 * 2 * 3 bạn có (2 + 1) * (1 + 1) = 3 * 2 = 6 yếu tố.
Điều tiếp theo sau từ trường hợp đầu tiên: khi bạn tìm thấy một yếu tố, hãy chia nó ra sao cho số kết quả nhỏ hơn. Khi bạn kết hợp điều này với thực tế là bạn chỉ cần kiểm tra căn bậc hai của số hiện tại thì đây là một cải tiến lớn. Ví dụ, hãy xem xét N = 10714293844487412. Naively nó sẽ mất N bước. Kiểm tra đến căn bậc hai của nó có sqrt (N) hoặc khoảng 100 triệu bước. Nhưng vì các yếu tố 2, 2, 3 và 953 được phát hiện sớm trên thực tế bạn chỉ cần kiểm tra một triệu - một cải tiến 100x!
Cải thiện khác: bạn không cần phải kiểm tra mọi số để xem liệu số đó có chia số của bạn hay không, chỉ là số nguyên tố. Nếu nó thuận tiện hơn, bạn có thể sử dụng 2 và các số lẻ, hoặc 2, 3, và các số 6n-1 và 6n + 1 (một rây bánh xe cơ bản).
Đây là một cải tiến tốt đẹp khác. Nếu bạn có thể nhanh chóng xác định xem một số có phải là số nguyên tố hay không, bạn có thể giảm nhu cầu phân chia hơn nữa. Giả sử, sau khi loại bỏ các yếu tố nhỏ, bạn có 120528291333090808192969. Ngay cả khi kiểm tra đến căn bậc hai của nó sẽ mất một thời gian dài - 300 tỷ bước. Nhưng một thử nghiệm Miller-Rabin (rất nhanh - có thể 10 đến 20 nano giây) sẽ cho thấy rằng số này là tổng hợp. Điều này giúp ích như thế nào? Nó có nghĩa là nếu bạn kiểm tra căn bậc hai của nó và tìm thấy không có yếu tố, sau đó có chính xác hai số nguyên tố còn lại. Nếu số là một hình vuông, các nhân tố của nó là số nguyên tố; nếu số không phải là một hình vuông, các con số là số nguyên tố riêng biệt. Điều này có nghĩa là bạn có thể nhân số 'tổng chạy' của bạn bằng 3 hoặc 4, tương ứng, để có được câu trả lời cuối cùng - ngay cả khi không biết các yếu tố! Điều này có thể tạo ra nhiều sự khác biệt hơn bạn dự đoán: số bước cần thiết giảm từ 300 tỷ xuống chỉ còn 50 triệu, cải thiện gấp 6000 lần!
Vấn đề duy nhất với điều trên là Miller-Rabin chỉ có thể chứng minh rằng các số đó là tổng hợp; nếu nó được đưa ra một nguyên tố, nó không thể chứng minh rằng số đó là số nguyên tố. Trong trường hợp đó, bạn có thể viết một chức năng chứng minh nguyên thủy để tha cho chính mình những nỗ lực của bao thanh toán đến căn bậc hai của số. (Thay vào đó, bạn chỉ có thể thực hiện thêm một vài bài kiểm tra Miller-Rabin, nếu bạn hài lòng với độ tin cậy cao là câu trả lời của bạn đúng hơn là một bằng chứng cho nó. . trong một tỷ đồng)
Một tên phương thức tốt hơn sẽ là 'GetFactorCount'. – SLaks
có thể trùng lặp của http://stackoverflow.com/questions/110344/algorithm-to-calculate-the-number-of-divisors-of-a-given-number – empi