Was ist ein effizienter Weg zu überprüfen, ob ein Int32
n ein Mersenne Prime ist? Das ist mein Versuch:Wie überprüft man, ob die Nummer ein Mersenne Prime ist?
Scheinbar gibt dieser Code für einige Zahlen, die eine Mersenne-Primzahl sind, z. 31 aber es ist nicht für andere wie 127. Kann mir jemand sagen, was ist falsch mit meinem Code?
/// <summary>
/// Checks if a nubmer is a mersenne prime
/// </summary>
/// <param name="candidate"></param>
/// <returns></returns>
public static bool IsMersennePrime(uint n)
{
var x = Math.Pow(2, n) - 1;
return IsPrime((uint)x);
}
/// <summary>
/// Checks if a nubmer is a prime
/// </summary>
/// <param name="candidate"></param>
/// <returns>true if number is a prime false if its not a prime</returns>
private static bool IsPrime(uint candidate)
{
//
// Test whether the parameter is a prime number.
//
if ((candidate & 1) == 0)
{
if (candidate == 2)
{
return true;
}
else
{
return false;
}
}
int num = (int)Math.Sqrt((double)candidate);
for (int i = 3; i <= num; i += 2)
{
if ((candidate % i) == 0)
{
return false;
}
}
return true;
}
Haben Sie versucht, einen Debugger zu verwenden und durch die Logik zu gehen? – MarcinJuraszek
Haben Sie 'IsMersennePrime (5)' und 'IsMersennePrime (7)' jeweils versucht? Oder "IsmersennePrime (31)" und "IsmersennePrime (127)"? – Arnauld
@Arnauld das Check IsMersennePrime (127) gibt false zurück. – yq8