chức năng ban đầu của tôi để xác định xem một số là số nguyên tố là:Kiểm tra nếu thủ lớn-o
bool is_prime(int x) {
for (int y = 2; y < x; ++y) {
if (x % y == 0) {
return false;
}
}
return true;
}
này chạy với một phức tạp của O(x)
như bạn có thể đã phải đi đến x
.
Tôi đã học được một số cách tối ưu hóa và cần kiểm tra trên tài khoản lớn của tôi. Đây là chương trình được cải tiến:
bool is_prime(int x)
{
if (x % 2 == 0 && x > 2) {
return false;
}
for (int y = 3; y*y <= x; y += 2) {
if (x % y == 0) {
return false;
}
}
return true;
}
Liệu thực tế là tôi bây giờ đi lên với sự thay đổi sqrt()
này để O(sqrt(x))
?
@MattTimmermans Đồng ý với bạn và đề xuất của AndyG. Tôi đã viết hàm với 'x' vì vậy nó phải là' x' chứ không phải 'n'. – datta
Một tối ưu hóa khác là tính trước số nguyên căn bậc hai của 'x' (tức là tìm số nguyên' m', sao cho 'm * m' nằm giữa' x-1' và 'x' cho số nguyên' x') . Có các thuật toán hiệu quả (độ phức tạp O (log (x)) hoặc tốt hơn) để tính toán một số nguyên căn bậc hai, mà không cần đến điểm nổi. – Peter
@Peter Ban đầu tôi đã không chuyển đổi dấu chấm động, nhưng toán học cho thấy rằng 'm * m' sẽ phục vụ mục đích của nó ở đây. – datta