fork(1) download
  1. #include <stdio.h>
  2.  
  3. char isMersenneLucasLehmer(unsigned long int prime)
  4. {
  5. unsigned long long int i, termN = 4;
  6. unsigned long mersenne;
  7. unsigned int limit;
  8. int res;
  9.  
  10. mersenne = (unsigned long) pow(2, (double)prime) - 1;
  11. if (prime % 2 == 0)
  12. {
  13. return prime == 2;
  14. }
  15. else
  16. {
  17. res = (int)sqrt((double) prime);
  18. for (i = 3; i <= res; i += 2)
  19. {
  20. if (prime % i == 0)
  21. {
  22. return 0;
  23. }
  24. }
  25.  
  26. limit = prime - 2;
  27. for (i = 1; i <= limit; ++i)
  28. {
  29. termN = (termN * termN - 2) % mersenne;
  30.  
  31. }
  32. }
  33. return termN == 0;
  34. }
  35. //----------------------------------------------------------
  36.  
  37. /*
  38.   Function: findMersenneLucasLehmer()
  39.  
  40. */
  41. void findMersenneLucasLehmer(unsigned int limit)
  42. {
  43. unsigned int i, current = 0;
  44. unsigned long mersenne, bitsInLong = 64;
  45.  
  46. for (i = 2; i <= bitsInLong; i++)
  47. {
  48. if (current >= limit)
  49. {
  50. break;
  51. }
  52.  
  53.  
  54. if (isMersenneLucasLehmer(i))
  55. {
  56. mersenne = (unsigned long) pow(2, (double)i) - 1;
  57. printf("current = %lu, mersenne = %lu, index = %u\n", current, mersenne, i);
  58. ++current;
  59. }
  60. }
  61. }
  62.  
  63. int main(void) {
  64. printf("Size of unsigned long: %d\n", sizeof (unsigned long));
  65. printf("Size of unsigned long long: %d\n\n", sizeof (unsigned long long));
  66. findMersenneLucasLehmer(8);
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0s 2168KB
stdin
Standard input is empty
stdout
Size of unsigned long: 4
Size of unsigned long long: 8

current = 0, mersenne = 3, index = 2
current = 1, mersenne = 7, index = 3
current = 2, mersenne = 31, index = 5
current = 3, mersenne = 127, index = 7
current = 4, mersenne = 8191, index = 13
current = 5, mersenne = 131071, index = 17
current = 6, mersenne = 524287, index = 19
current = 7, mersenne = 2147483647, index = 31