Писать надо на с++
Требуется небольшое изменение в модуле z64. Изменение делать в программе, которую я прислал.
Изменения нужно делать с комментарием. И сделать отчет.
В решете Эратосфена хранится список простых чисел.
Простейший варинант: для каждого целого числа n признак: простое или
нет. Таким образом, можно в один байт упаковать сведения о 8
натуральных числах, например:
240 241 242 243 244 245 246 247
- + - - -
Такой способ хранения явно избыточен: четные числа никогда не будут
простыми (2 будем обрабатывать отдельно). Поэтому у решете будем
хранить только признаки нечетных чисел:
241 243 245 247 249 251 253 255
+ - - + -
Таким образом, один байт будет хранить информацию о простоте 16 чисел:
от 16*k до 16*k+15, в примере выше от 240 до 255. Именно такой вариант
сейчас реализован в модуле z64.
Например, для хранения решета вполоть до 1 млрд., требуется
1000000000/16 ~62М байт памяти.
Но такой способ хранения опять не самый экономный. Например, не
обязательно хранить сведения о простоте чисел кратных 3 или 5
они всегда составный.
Новый способ хранения предлагается такой. Насмотрим числовой интервал
длины 30, от 30*k до 30k+29.
Числа вида 30*k, 30*k+2, 30*k+4, ... 30*k+28 всегда делятся на 2.
Числа вида 30*k+3, 30*k+6, ... 30*k+27 всегда делятся на 3.
Числа вида 30*k+5, 30*k+10, ... 30*k+25 всегда делятся на 5.
Числа, которые могут быть как простыми, так и составными это
30*k+ 1, 30*k+ 7, 30*k+11, 30*k+13,
30*k+17, 30*k+19, 30*k+23, 30*k+29
то есть только 8 штук. Признаки их простоты и будем хранить в одном
байте, например
241 247 251 253 257 259 263 269
+ + + + +
Таким образом, один байт будет хранить информацию о простоте 30 чисел:
от 30*k до 30*k+29, в примере выше от 240 до 269. Именно такой вариант
и надо реализовать.
То есть надо изменить функцию z64::Efill.
Опубликован 15.04.2015 в 15:02
Заказ находится в архиве