Guest User

Untitled

a guest
Mar 22nd, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. constexpr inline unsigned long pow2(unsigned long i) { return 1 << i; }
  2. inline unsigned long isqrt(unsigned long a)
  3. {
  4. unsigned long x = a;
  5. for(unsigned long z = 0; x != z; )
  6. {
  7. z = x;
  8. x = (x + a/x)/2;
  9. }
  10. return x;
  11. }
  12.  
  13. constexpr unsigned long MAX_LIM = 1000000000; //pow2(31) - 1;
  14. constexpr unsigned long ARR_LIM = (MAX_LIM >> 6) + 1;
  15. const unsigned long SQR_LIM = isqrt(MAX_LIM);;
  16.  
  17. unsigned long primes[ARR_LIM] = { 0 }; // 0 - простое, 1 - составное
  18.  
  19. auto set_primes = [](unsigned long idx) { primes[idx >> 6] |= pow2((idx&0x0000003F)>>1); };
  20. auto get_primes = [](unsigned long idx) { return primes[idx >> 6] & pow2((idx&0x0000003F)>>1); };
  21.  
  22. vector<unsigned long> Primes;
  23.  
  24. void makePrimes()
  25. {
  26. for(unsigned long j = 9; j <= MAX_LIM; j += 3)
  27. {
  28. if (j%2) set_primes(j);
  29. }
  30. for(unsigned long i = 5; i <= SQR_LIM; i += 6)
  31. {
  32. if (get_primes(i)) continue;
  33. for(unsigned long j = i * i; j <= MAX_LIM; j += i)
  34. {
  35. if (j%2) set_primes(j);
  36. }
  37. }
  38. for(unsigned long i = 7; i <= SQR_LIM; i += 6)
  39. {
  40. if (get_primes(i)) continue;
  41. for(unsigned long j = i * i; j <= MAX_LIM; j += i)
  42. {
  43. if (j%2) set_primes(j);
  44. }
  45. }
  46. Primes.reserve(55000000);
  47. Primes.push_back(2);
  48. for(unsigned long i = 3; i <= MAX_LIM; i+=2)
  49. {
  50. if (get_primes(i)) continue;
  51. Primes.push_back(i);
  52. }
  53.  
  54. }
  55.  
  56.  
  57. vector<unsigned long> * factors(long long L, vector<unsigned long> * v = 0)
  58. {
  59. if (v == 0) v = new vector<unsigned long>;
  60. if (L == 1) return v;
  61. for(auto f: Primes)
  62. {
  63. if (f*f > L) {
  64. v->push_back(L);
  65. return v;
  66. }
  67. if (L%f == 0)
  68. {
  69. v->push_back(f);
  70. return factors(L/f,v);
  71. }
  72. }
  73. return v;
  74. }
  75.  
  76.  
  77. int main(int argc, const char * argv[])
  78. {
  79. makePrimes();
  80. printf("Total primes = %dn",Primes.size());
  81.  
  82. for(long long i = 900000000000000000ll; i < 900000000000001000ll; ++i)
  83. {
  84. vector<unsigned long> * f = factors(i);
  85. for(auto x: *f)
  86. {
  87. printf("%lu ",x);
  88. }
  89. printf("%lldn",i);
  90. delete f;
  91. }
  92.  
  93. }
  94.  
  95. #include <iostream>
  96. #include <chrono>
  97.  
  98. constexpr unsigned long N = 1000000000;
  99. bool grid[N + 2];
  100. unsigned long primes[51000000];
  101. unsigned long primesCount;
  102.  
  103. inline void factors(unsigned long num)
  104. {
  105. for (unsigned long i = 0; i < primesCount; ++i)
  106. {
  107. while (num % primes[i] == 0)
  108. {
  109. std::cout << primes[i] << ' ';
  110. num /= primes[i];
  111. }
  112. }
  113. }
  114.  
  115. int main()
  116. {
  117. auto start = std::chrono::high_resolution_clock::now();
  118. grid[0] = grid[1] = true;
  119. grid[2] = false;
  120.  
  121. for (unsigned long p = 3, k; p*p <= N; p += 2)
  122. {
  123. if (! grid[p])
  124. {
  125. for (k = p*p; k <= N; k += p)
  126. grid[k] = true;
  127. }
  128. }
  129. primes[primesCount++] = 2;
  130. for (unsigned long p = 3, k; p <= N; p += 2)
  131. {
  132. if (! grid[p]) primes[primesCount++] = p;
  133. }
  134. for (unsigned long long num = 900000000000000000ll; num < 900000000000000100ll; ++num)
  135. {
  136. std::cout << num << " - ";
  137. factors(num);
  138. std::cout << 'n';
  139. }
  140.  
  141. auto elapsedTime = std::chrono::duration_cast<
  142. std::chrono::milliseconds
  143. >(std::chrono::high_resolution_clock::now() - start);
  144.  
  145. std::cout << elapsedTime.count() / 1000.0f << 'n'
  146. << "primes count: " << primesCount << 'n';
  147. return EXIT_SUCCESS;
  148. }
Add Comment
Please, Sign In to add comment