Почему хранение всех простых чисел 203280221 UINT32_T в векторе использует столько памяти?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему хранение всех простых чисел 203280221 UINT32_T в векторе использует столько памяти?

Сообщение Anonymous »

Я написал две рабочие программы C ++, чтобы найти все простые простые числа 203280221 в соответствии с 4294967295, используя сито эратосфен с факторизацией колеса и кучей других оптимизаций. < /p>
Все простые числа, кроме 2, являются нечетными, поэтому нам нужно только проверять нечетные числа, пространство поиска вдвое. Другими словами, все простые простые числа, кроме 2, являются 2-копримами. И это также относится к всем другим простым числам, все простые числа, кроме 3, являются 3-купкими, все простые числа, кроме 5, являются 5-турми и т. Д. Все пары простые простые простые отношения должны быть связаны друг с другом, и начиная с 5 человек все простые промывания должны быть во все 2, так и 3, начиная с 7 все просты В 7 должен быть согласованным с {1, 7, 11, 13, 17, 19, 23, 29} Modulo 30, все простые простые расстройства, начинающиеся в 11

Код: Выделить всё

{
1  , 11 , 13 , 17 , 19 , 23 ,
29 , 31 , 37 , 41 , 43 , 47 ,
53 , 59 , 61 , 67 , 71 , 73 ,
79 , 83 , 89 , 97 , 101, 103,
107, 109, 113, 121, 127, 131,
137, 139, 143, 149, 151, 157,
163, 167, 169, 173, 179, 181,
187, 191, 193, 197, 199, 209
}
Использование колеса на уровне 3 -го уровня. Пространство поиска сузится до 4/15, колесо 4 -го уровня сужает пространство поиска до 8/35 и колесо 5 до 16/77.
Теперь следующая программа C ++ находит все 203280221 Primes Motion 429967295, A Uint32_T ISITES, 20320202020202020202021 813120884 байт, или 775,4525mib. Программа находит все простые числа uint32_t, а затем записывает их в файл, простые числа преобразуются в одну двоичную последовательность, простые простые числа соединяются с головой в хвост, каждый из них преобразуется в большую эндианскую последовательность. Я понятия не имею, почему он использует 1GIB и немного оперативной памяти, но во время записи для подачи он использует 775mib, как и ожидалось. < /P>
#include
#include
#include
#include
#include
#include

using bools = std::vector;
using bytes = std::vector;
constexpr std::array WHEEL = {
2, 4, 2, 4, 6, 2, 6, 4,
2, 4, 6, 6, 2, 6, 4, 2,
6, 4, 6, 8, 4, 2, 4, 2,
4, 8, 6, 4, 6, 2, 4, 6,
2, 6, 6, 4, 2, 4, 6, 2,
6, 4, 2, 4, 2, 10, 2, 10
};

constexpr std::array FOREWHEEL = { {
{4 , 2 }, {9 , 6 }, {25 , 30 }, {35 , 30 },
{49 , 210}, {77 , 210}, {91 , 210}, {119, 210},
{133, 210}, {161, 210}, {203, 210}, {217, 210},
} };

static bools prime_wheel_sieve(uint64_t limit) {
limit++;
bools is_prime(limit, true);
std::array wheel;
is_prime[0] = is_prime[1] = false;
for (auto& [multiple, step] : FOREWHEEL) {
for (uint64_t i = multiple; i < limit; i += step) {
is_prime = false;
}
}
uint32_t k, max_k;
uint64_t multiple;
k = 11;
max_k = std::sqrt(limit);
uint8_t i, j;
i = j = 0;
while (k 16 & 255));
data.push_back(uint8_t(k >> 8 & 255));
data.push_back(uint8_t(k & 255));
}
k += WHEEL;
i++;
i -= (i == 48) * 48;
}
return data;
}

int main()
{
bytes data = prime_bytes(4294967295);
std::ofstream file("D:\\UInt32_Primes.bin", std::ios::binary);
if (!file.good()) {
std::cerr
Скомпилировано с помощью: < /p>
g++ -std=c++20 -march=native -O3 -flto -funroll-loops -fomit-frame-pointer -fstrict-aliasing -o "D:\CliExec\wheel_sieve_test_gcc.exe" "D:\MyScript\prime_sieve_test.cpp"
< /code>
Теперь теперь я с тех пор сильно оптимизировал этот код, я использовал колесо 5 -го уровня во второй версии, я заставил программу запомнить состояние сита и все простые простые числа, я сделал программу только в случае необходимости, если бы я не запомнил все, что у меня были, и минимализированные вычисления, но я хотел, чтобы все запомнили, что я должен был использовать все платы за все люди, которые приходили на все платы за все люди, которые можно было принять все платы за все люди, которые можно было запомнить, я должен был использовать все, что можно было удержать все пта uint32_t. < /p>
#include
#include
#include
#include
#include

using std::vector;
using std::array;
using bools = vector;

constexpr array WHEEL_2310 = {
4 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 4 , 6 , 6 , 2 , 6 , 4 , 2 , 6 , 4 , 6 , 8 , 4 , 2 , 4 , 2 , 4 ,
14, 4 , 6 , 2 , 10, 2 , 6 , 6 , 4 , 2 , 4 , 6 , 2 , 10, 2 , 4 , 2 , 12, 10, 2 , 4 , 2 , 4 , 6 ,
2 , 6 , 4 , 6 , 6 , 6 , 2 , 6 , 4 , 2 , 6 , 4 , 6 , 8 , 4 , 2 , 4 , 6 , 8 , 6 , 10, 2 , 4 , 6 ,
2 , 6 , 6 , 4 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 6 , 10, 2 , 10, 2 , 4 , 2 , 4 , 6 , 8 , 4 , 2 , 4 ,
12, 2 , 6 , 4 , 2 , 6 , 4 , 6 , 12, 2 , 4 , 2 , 4 , 8 , 6 , 4 , 6 , 2 , 4 , 6 , 2 , 6 , 10, 2 ,
4 , 6 , 2 , 6 , 4 , 2 , 4 , 2 , 10, 2 , 10, 2 , 4 , 6 , 6 , 2 , 6 , 6 , 4 , 6 , 6 , 2 , 6 , 4 ,
2 , 6 , 4 , 6 , 8 , 4 , 2 , 6 , 4 , 8 , 6 , 4 , 6 , 2 , 4 , 6 , 8 , 6 , 4 , 2 , 10, 2 , 6 , 4 ,
2 , 4 , 2 , 10, 2 , 10, 2 , 4 , 2 , 4 , 8 , 6 , 4 , 2 , 4 , 6 , 6 , 2 , 6 , 4 , 8 , 4 , 6 , 8 ,
4 , 2 , 4 , 2 , 4 , 8 , 6 , 4 , 6 , 6 , 6 , 2 , 6 , 6 , 4 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 4 , 2 ,
10, 2 , 10, 2 , 6 , 4 , 6 , 2 , 6 , 4 , 2 , 4 , 6 , 6 , 8 , 4 , 2 , 6 , 10, 8 , 4 , 2 , 4 , 2 ,
4 , 8 , 10, 6 , 2 , 4 , 8 , 6 , 6 , 4 , 2 , 4 , 6 , 2 , 6 , 4 , 6 , 2 , 10, 2 , 10, 2 , 4 , 2 ,
4 , 6 , 2 , 6 , 4 , 2 , 4 , 6 , 6 , 2 , 6 , 6 , 6 , 4 , 6 , 8 , 4 , 2 , 4 , 2 , 4 , 8 , 6 , 4 ,
8 , 4 , 6 , 2 , 6 , 6 , 4 , 2 , 4 , 6 , 8 , 4 , 2 , 4 , 2 , 10, 2 , 10, 2 , 4 , 2 , 4 , 6 , 2 ,
10, 2 , 4 , 6 , 8 , 6 , 4 , 2 , 6 , 4 , 6 , 8 , 4 , 6 , 2 , 4 , 8 , 6 , 4 , 6 , 2 , 4 , 6 , 2 ,
6 , 6 , 4 , 6 , 6 , 2 , 6 , 6 , 4 , 2 , 10, 2 , 10, 2 , 4 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 10, 6 ,
2 , 6 , 4 , 2 , 6 , 4 , 6 , 8 , 4 , 2 , 4 , 2 , 12, 6 , 4 , 6 , 2 , 4 , 6 , 2 , 12, 4 , 2 , 4 ,
8 , 6 , 4 , 2 , 4 , 2 , 10, 2 , 10, 6 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 4 , 6 , 6 , 2 , 6 , 4 , 2 ,
10, 6 , 8 , 6 , 4 , 2 , 4 , 8 , 6 , 4 , 6 , 2 , 4 , 6 , 2 , 6 , 6 , 6 , 4 , 6 , 2 , 6 , 4 , 2 ,
4 , 2 , 10, 12, 2 , 4 , 2 , 10, 2 , 6 , 4 , 2 , 4 , 6 , 6 , 2 , 10, 2 , 6 , 4 , 14, 4 , 2 , 4 ,
2 , 4 , 8 , 6 , 4 , 6 , 2 , 4 , 6 , 2 , 6 , 6 , 4 , 2 , 4 , 6 , 2 , 6 , 4 , 2 , 4 , 12, 2 , 12
};

constexpr array WHEEL_INDICES = {
1, 0, 1, 2, 0, 2, 1, 0, 1, 2, 2, 0, 2, 1, 0, 2, 1, 2, 3, 1, 0, 1, 0, 1, 6, 1, 2, 0, 4, 0, 2, 2,
1, 0, 1, 2, 0, 4, 0, 1, 0, 5, 4, 0, 1, 0, 1, 2, 0, 2, 1, 2, 2, 2, 0, 2, 1, 0, 2, 1, 2, 3, 1, 0,
1, 2, 3, 2, 4, 0, 1, 2, 0, 2, 2, 1, 0, 1, 2, 0, 2, 1, 0, 2, 4, 0, 4, 0, 1, 0, 1, 2, 3, 1, 0, 1,
5, 0, 2, 1, 0, 2, 1, 2, 5, 0, 1, 0, 1, 3, 2, 1, 2, 0, 1, 2, 0, 2, 4, 0, 1, 2, 0, 2, 1, 0, 1, 0,
4, 0, 4, 0, 1, 2, 2, 0, 2, 2, 1, 2, 2, 0, 2, 1, 0, 2, 1, 2, 3, 1, 0, 2, 1, 3, 2, 1, 2, 0, 1, 2,
3, 2, 1, 0, 4, 0, 2, 1, 0, 1, 0, 4, 0, 4, 0, 1, 0, 1, 3, 2, 1, 0, 1, 2, 2, 0, 2, 1, 3, 1, 2, 3,
1, 0, 1, 0, 1, 3, 2, 1, 2, 2, 2, 0, 2, 2, 1, 0, 1, 2, 0, 2, 1, 0, 1, 0, 4, 0, 4, 0, 2, 1, 2, 0,
2, 1, 0, 1, 2, 2, 3, 1, 0, 2, 4, 3, 1, 0, 1, 0, 1, 3, 4, 2, 0, 1, 3, 2, 2, 1, 0, 1, 2, 0, 2, 1,
2, 0, 4, 0, 4, 0, 1, 0, 1, 2, 0, 2, 1, 0, 1, 2, 2, 0, 2, 2, 2, 1, 2, 3, 1, 0, 1, 0, 1, 3, 2, 1,
3, 1, 2, 0, 2, 2, 1, 0, 1, 2, 3, 1, 0, 1, 0, 4, 0, 4, 0, 1, 0, 1, 2, 0, 4, 0, 1, 2, 3, 2, 1, 0,
2, 1, 2, 3, 1, 2, 0, 1, 3, 2, 1, 2, 0, 1, 2, 0, 2, 2, 1, 2, 2, 0, 2, 2, 1, 0, 4, 0, 4, 0, 1, 0,
1, 2, 0, 2, 1, 0, 4, 2, 0, 2, 1, 0, 2, 1, 2, 3, 1, 0, 1, 0, 5, 2, 1, 2, 0, 1, 2, 0, 5, 1, 0, 1,
3, 2, 1, 0, 1, 0, 4, 0, 4, 2, 0, 1, 2, 0, 2, 1, 0, 1, 2, 2, 0, 2, 1, 0, 4, 2, 3, 2, 1, 0, 1, 3,
2, 1, 2, 0, 1, 2, 0, 2, 2, 2, 1, 2, 0, 2, 1, 0, 1, 0, 4, 5, 0, 1, 0, 4, 0, 2, 1, 0, 1, 2, 2, 0,
4, 0, 2, 1, 6, 1, 0, 1, 0, 1, 3, 2, 1, 2, 0, 1, 2, 0, 2, 2, 1, 0, 1, 2, 0, 2, 1, 0, 1, 5, 0, 5
};

constexpr array MODULO_2310 = {
13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 ,
79 , 83 , 89 , 97 , 101 , 103 , 107 , 109 , 113 , 127 , 131 , 137 , 139 , 149 , 151 , 157 ,
163 , 167 , 169 , 173 , 179 , 181 , 191 , 193 , 197 , 199 , 211 , 221 , 223 , 227 , 229 , 233 ,
239 , 241 , 247 , 251 , 257 , 263 , 269 , 271 , 277 , 281 , 283 , 289 , 293 , 299 , 307 , 311 ,
313 , 317 , 323 , 331 , 337 , 347 , 349 , 353 , 359 , 361 , 367 , 373 , 377 , 379 , 383 , 389 ,
391 , 397 , 401 , 403 , 409 , 419 , 421 , 431 , 433 , 437 , 439 , 443 , 449 , 457 , 461 , 463 ,
467 , 479 , 481 , 487 , 491 , 493 , 499 , 503 , 509 , 521 , 523 , 527 , 529 , 533 , 541 , 547 ,
551 , 557 , 559 , 563 , 569 , 571 , 577 , 587 , 589 , 593 , 599 , 601 , 607 , 611 , 613 , 617 ,
619 , 629 , 631 , 641 , 643 , 647 , 653 , 659 , 661 , 667 , 673 , 677 , 683 , 689 , 691 , 697 ,
701 , 703 , 709 , 713 , 719 , 727 , 731 , 733 , 739 , 743 , 751 , 757 , 761 , 767 , 769 , 773 ,
779 , 787 , 793 , 797 , 799 , 809 , 811 , 817 , 821 , 823 , 827 , 829 , 839 , 841 , 851 , 853 ,
857 , 859 , 863 , 871 , 877 , 881 , 883 , 887 , 893 , 899 , 901 , 907 , 911 , 919 , 923 , 929 ,
937 , 941 , 943 , 947 , 949 , 953 , 961 , 967 , 971 , 977 , 983 , 989 , 991 , 997 , 1003, 1007,
1009, 1013, 1019, 1021, 1027, 1031, 1033, 1037, 1039, 1049, 1051, 1061, 1063, 1069, 1073, 1079,
1081, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1121, 1123, 1129, 1139, 1147, 1151, 1153, 1157,
1159, 1163, 1171, 1181, 1187, 1189, 1193, 1201, 1207, 1213, 1217, 1219, 1223, 1229, 1231, 1237,
1241, 1247, 1249, 1259, 1261, 1271, 1273, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
1313, 1319, 1321, 1327, 1333, 1339, 1343, 1349, 1357, 1361, 1363, 1367, 1369, 1373, 1381, 1387,
1391, 1399, 1403, 1409, 1411, 1417, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1457, 1459,
1469, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1501, 1511, 1513, 1517, 1523, 1531, 1537, 1541,
1543, 1549, 1553, 1559, 1567, 1571, 1577, 1579, 1583, 1591, 1597, 1601, 1607, 1609, 1613, 1619,
1621, 1627, 1633, 1637, 1643, 1649, 1651, 1657, 1663, 1667, 1669, 1679, 1681, 1691, 1693, 1697,
1699, 1703, 1709, 1711, 1717, 1721, 1723, 1733, 1739, 1741, 1747, 1751, 1753, 1759, 1763, 1769,
1777, 1781, 1783, 1787, 1789, 1801, 1807, 1811, 1817, 1819, 1823, 1829, 1831, 1843, 1847, 1849,
1853, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1891, 1901, 1907, 1909, 1913, 1919, 1921, 1927,
1931, 1933, 1937, 1943, 1949, 1951, 1957, 1961, 1963, 1973, 1979, 1987, 1993, 1997, 1999, 2003,
2011, 2017, 2021, 2027, 2029, 2033, 2039, 2041, 2047, 2053, 2059, 2063, 2069, 2071, 2077, 2081,
2083, 2087, 2089, 2099, 2111, 2113, 2117, 2119, 2129, 2131, 2137, 2141, 2143, 2147, 2153, 2159,
2161, 2171, 2173, 2179, 2183, 2197, 2201, 2203, 2207, 2209, 2213, 2221, 2227, 2231, 2237, 2239,
2243, 2249, 2251, 2257, 2263, 2267, 2269, 2273, 2279, 2281, 2287, 2291, 2293, 2297, 2309, 1
};

constexpr array FOREWHEEL_2310 = { {
{4 , 2 }, {9 , 6 }, {25 , 30 }, {35 , 30 }, {49 , 210 }, {77 , 210 },
{91 , 210 }, {119 , 210 }, {133 , 210 }, {161 , 210 }, {203 , 210 }, {217 , 210 },
{121 , 2310}, {143 , 2310}, {187 , 2310}, {209 , 2310}, {253 , 2310}, {319 , 2310},
{341 , 2310}, {407 , 2310}, {451 , 2310}, {473 , 2310}, {517 , 2310}, {583 , 2310},
{649 , 2310}, {671 , 2310}, {737 , 2310}, {781 , 2310}, {803 , 2310}, {869 , 2310},
{913 , 2310}, {979 , 2310}, {1067, 2310}, {1111, 2310}, {1133, 2310}, {1177, 2310},
{1199, 2310}, {1243, 2310}, {1331, 2310}, {1397, 2310}, {1441, 2310}, {1507, 2310},
{1529, 2310}, {1573, 2310}, {1639, 2310}, {1661, 2310}, {1727, 2310}, {1793, 2310},
{1837, 2310}, {1859, 2310}, {1903, 2310}, {1969, 2310}, {1991, 2310}, {2057, 2310},
{2101, 2310}, {2123, 2310}, {2167, 2310}, {2189, 2310}, {2299, 2310}, {2321, 2310}
} };

static vector PRIMES = { 2, 3, 5, 7, 11 };
static vector SIEVE = { 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1 };
static vector OFFSETS;
static uint32_t ARC_LENGTH = 11;
static uint32_t PROCESSED = 11;
static uint32_t CANDIDATE = 13;
static uint32_t PRIME = 13;
static uint16_t SPOKE = 0;
static uint16_t SPOKE2 = 0;
static array MULTIPLES = { 0, 0, 0, 0, 0, 0, 0 };
inline static uint64_t next_multiple(uint16_t offset, uint16_t step) {
uint64_t limit;
return ARC_LENGTH

Подробнее здесь: https://stackoverflow.com/questions/796 ... uch-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»