Sto scrivendo una piccola libreria con alcuni metodi relativi ai numeri primi. Come ho fatto il lavoro di base (ovvero i metodi di lavoro) e ora sto cercando qualche ottimizzazione. Ofcourse internet è un posto eccellente per farlo. Tuttavia, sono incappato in un problema di arrotondamento e mi chiedevo come risolvere questo problema.Come posso testare per la primalità?
Nel ciclo che utilizzo per testare un numero per la sua primalità è più efficiente cercare fino a sqrt (n) invece di n/2 o anche di n - 1. Ma a causa di problemi di arrotondamento alcuni numeri vengono saltati e quindi alcuni numeri primi sono saltati! Ad esempio, il 10000 primo dovrebbe essere: 104729, ma la versione "ottimizzata" termina con: 103811.
Un po 'di codice (è aperto per ulteriori ottimizzazioni, lo so, ma posso gestire solo una cosa alla volta) :
/// <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;
}
so che la parte quadrato me non riesce (o non riesco), provato Math.Ceiling pure, con gli stessi risultati.
vostro ciclo sembra iniziare a 3, e l'incremento di 1; il tuo commento afferma che inizia alle 5 e aumenta di 2. –
Questa domanda sembra essere fuori tema perché riguarda la teoria dei numeri. prova math.stackexchange.com. – jww
'squared' non è il nome della variabile corretta per il risultato di una radice quadrata. "Squared" significa elevato al secondo potere; la radice quadrata si alza alla potenza di 1/2. Forse chiamalo 'sqrt_test' o qualcosa del genere. –