Tôi đang viết một thư viện nhỏ với một số phương pháp liên quan đến số nguyên tố. Như tôi đã làm nền tảng (aka phương pháp làm việc) và bây giờ tôi đang tìm kiếm một số tối ưu hóa. Ofcourse internet là một nơi tuyệt vời để làm như vậy. Tôi đã, tuy nhiên, tình cờ gặp một vấn đề làm tròn và tôi đã tự hỏi làm thế nào để giải quyết điều này. Trong vòng lặp tôi sử dụng để kiểm tra một số cho nó nguyên thủy nó hiệu quả hơn để tìm kiếm cho đến khi sqrt (n) thay vì n/2 hoặc thậm chí n - 1. Nhưng do làm tròn vấn đề một số số bị bỏ qua và do đó một số số nguyên tố bị bỏ qua! Ví dụ: nguyên tố 10000 sẽ là: 104729, nhưng phiên bản 'được tối ưu hóa' kết thúc bằng: 103811.Làm thế nào tôi có thể kiểm tra tính nguyên thủy?
Một số mã (mở để tối ưu hóa nhiều hơn, tôi biết, nhưng tôi chỉ có thể xử lý một thứ một lần) :
/// <summary>
/// Method for testing the primality of a number e.g.: return IsPrime(29);
/// History:
/// 1. Initial version, most basic form of testing: m smaller then n -1
/// 2. Implemented m smaller then sqrt(n), optimization due to prime factoring
/// </summary>
/// <param name="test">Number to be tested on primality</param>
/// <returns>True if the number is prime, false otherwise</returns>
public static bool IsPrime(int test)
{
// 0 and 1 are not prime numbers
if (test == 0 || test == 1) return false;
// 2 and 3 are prime numbers
if (test == 2) return true;
// all even numbers, save 2, are not prime
if (test % 2 == 0) return false;
double squared = Math.Sqrt(test);
int flooredAndSquared = Convert.ToInt32(Math.Floor(squared));
// start with 5, make increments of 2, even numbers do not need to be tested
for (int idx = 3; idx < flooredAndSquared; idx++)
{
if (test % idx == 0)
{
return false;
}
}
return true;
}
Tôi biết phần bình phương không thành công (hoặc tôi thất bại), đã thử Math.Ceiling, với kết quả tương tự.
của bạn cho vòng lặp dường như bắt đầu vào lúc 3, và tăng thêm 1; bình luận của bạn nói rằng nó bắt đầu ở mức 5 và tăng thêm 2. –
Câu hỏi này dường như không có chủ đề vì đó là lý thuyết số. thử math.stackexchange.com. – jww
'bình phương' không phải là tên biến thích hợp cho kết quả của một căn bậc hai. "Squared" có nghĩa là nâng lên sức mạnh thứ hai; căn bậc hai đang nâng lên 1/2 sức mạnh. Có thể gọi nó là 'sqrt_test' hay gì đó. –