Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
решетом Эратосфена вычисляют диапазоны простых чисел или просто проверяют отдельные числа на простоту. Но когда нужна их полная последовательность, то думать необходимо в примерно таком ключе как описано выше.
Но решето все равно перебирает все числа, пытаясь делить на них тестируемое число.
«для каждого очередного… помечает кратные ему» это как минимум вложенный цикл, это не похоже на O(1)
fn main() {
println!("{}", Primes::Init.find(|&p| p > 1_500_000).unwrap());
}
enum Primes {
Init,
Collect(Vec<u64>),
}
impl Iterator for Primes {
type Item = u64;
fn next(&mut self) -> Option<u64> {
match self {
Init => {
*self = Collect(Vec::new());
Some(2)
}
Collect(primes) => match primes.last() {
None => {
primes.push(3);
Some(3)
}
Some(max_prime) => {
let mut next_possible_prime = max_prime + 2;
loop {
for prime in primes.iter() {
let quad_prime = prime * prime;
if quad_prime > next_possible_prime {
primes.push(next_possible_prime);
return Some(next_possible_prime);
}
if quad_prime == next_possible_prime || next_possible_prime % prime == 0
{
break;
}
}
next_possible_prime += 2;
}
}
},
}
}
}
Раз вам важны цифры, то вот сравнение с решетом Эратосфена:
BenchmarkDotNet=v0.12.0, OS=Windows 7 SP1 (6.1.7601.0)
Intel Core i5-3550 CPU 3.30GHz (Ivy Bridge), 1 CPU, 4 logical and 4 physical cores
Frequency=3215400 Hz, Resolution=311.0033 ns, Timer=TSC
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X86 LegacyJIT
DefaultJob : .NET Framework 4.7.2 (4.7.3468.0), X86 LegacyJIT
| Method | Bound | Mean | Error | StdDev |
|------------ |-------- |---------------:|--------------:|--------------:|
| Eratosphene | 1000 | 5.934 us | 0.0155 us | 0.0130 us |
| Alez13 | 1000 | 298.417 us | 5.7851 us | 5.4114 us |
| Eratosphene | 10000 | 75.459 us | 0.3982 us | 0.3530 us |
| Alez13 | 10000 | 4,209.570 us | 69.5983 us | 61.6971 us |
| Eratosphene | 100000 | 839.022 us | 9.7805 us | 9.1487 us |
| Alez13 | 100000 | 65,320.950 us | 1,276.4281 us | 1,910.4974 us |
| Eratosphene | 1000000 | 8,885.445 us | 66.3289 us | 62.0441 us |
| Alez13 | 1000000 | 910,547.832 us | 6,954.9097 us | 6,165.3463 us |
Просто о простых числах (быстрый инкрементный метод вычисления простых чисел)