Это битовая маска - один бит для каждого из 8 значений из 30, которые могут быть простыми, поэтому 8 бит на 30 чисел. Таким образом, для суммирования всех простых чисел до 10 ^ 6 необходимо 8 * 10 ^ 6/30 = 2666667 бит = 33334 байта.
Чтобы объяснить, почему это хороший путь, вам нужно взглянуть на очевидные альтернативы.
Более наивным способом было бы просто использовать битовую маску. Вам нужен миллион бит, 125000 байт.
Вы также можете хранить значения простых чисел. До 1000000 значения умещаются в 20 битов, а число простых чисел составляет 78498, что дает разочаровывающие 1569960 бит (196245 байт).
Еще один способ - хотя и менее полезный для поиска простых чисел - это сохранить различия между каждым простым и следующим. Менее миллиона это соответствует 6 битам (если вы помните, что в этой точке все нечетные простые числа, поэтому вам нужно хранить только четные различия и, следовательно, отбрасывать младший бит), для 470998 бит == 58874 байта , (Вы можете сбрить еще один бит, посчитав, сколько слотов мод-30 вам пришлось прыгнуть.)
Теперь, нет ничего особенно особенного в 30, кроме 30 = 2 * 3 * 5, так что этот поиск на самом деле проведет вас через представление битовой маски шаблона Sieve of Eratosthanes сразу после того, как вы начали. Вместо этого вы можете использовать 2 * 3 * 5 * 7 = 210, и тогда вам нужно будет рассмотреть + - 1, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, для 48 значений. Если бы вы делали это с 7 блоками по 30, вам понадобилось бы 7 * 8 = 56 бит, так что это небольшое улучшение, но тьфу ... вряд ли стоило хлопот.
Так что это один из лучших приемов компактного хранения достаточно малых простых чисел.
(PS Интересно отметить, что если бы простые числа появлялись случайным образом (но то же самое число появлялось до 1000000, как на самом деле появляются), то объем информации, хранимой в простоте числа между 1 и 10 ^ 6, составлял бы ~ 0.397 бит на Таким образом, при наивных теоретико-информационных допущениях вы могли бы подумать, что лучшее, что вы могли бы сделать для хранения первого миллиона простых чисел, это использовать 1000000 * 0,397 бит или 49609 байт.)