2016-07-24 16 views
2

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; 
} 
+0

Haben Sie versucht, einen Debugger zu verwenden und durch die Logik zu gehen? – MarcinJuraszek

+0

Haben Sie 'IsMersennePrime (5)' und 'IsMersennePrime (7)' jeweils versucht? Oder "IsmersennePrime (31)" und "IsmersennePrime (127)"? – Arnauld

+0

@Arnauld das Check IsMersennePrime (127) gibt false zurück. – yq8

Antwort

2

Da Sie nur Mersenne-Primzahlen, die in eine uint passt der beste Weg gegen tatsächliche Werte zu überprüfen ist. Lesen Sie mehr über A000043 und A000668.

private static int[] A000043 = new int[] { 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917, 20996011, 24036583, 25964951, 30402457, 32582657 }; 
private static int[] A000668 = new int[] { 3, 7, 31, 127, 8191, 131071, 524287, 2147483647 }; 

public static bool IsInA000668(int value) => A000668.Contains(value); 
public static bool IsInA000043(int value) => A000043.Contains(value);