RosettaCodeData/Task/Extensible-prime-generator/Dart/extensible-prime-generator.dart
2023-07-01 13:44:08 -04:00

50 lines
1.6 KiB
Dart

Iterable<int> primesMap() {
Iterable<int> oddprms() sync* {
yield(3); yield(5); // need at least 2 for initialization
final Map<int, int> bpmap = {9: 6};
final Iterator<int> bps = oddprms().iterator;
bps.moveNext(); bps.moveNext(); // skip past 3 to 5
int bp = bps.current;
int n = bp;
int q = bp * bp;
while (true) {
n += 2;
while (n >= q || bpmap.containsKey(n)) {
if (n >= q) {
final int inc = bp << 1;
bpmap[bp * bp + inc] = inc;
bps.moveNext(); bp = bps.current; q = bp * bp;
} else {
final int inc = bpmap.remove(n);
int next = n + inc;
while (bpmap.containsKey(next)) {
next += inc;
}
bpmap[next] = inc;
}
n += 2;
}
yield(n);
}
}
return [2].followedBy(oddprms());
}
void main() {
print("The first 20 primes:");
String str = "( ";
primesMap().take(20).forEach((p)=>str += "$p "); print(str + ")");
print("Primes between 100 and 150:");
str = "( ";
primesMap().skipWhile((p)=>p<100).takeWhile((p)=>p<150)
.forEach((p)=>str += "$p "); print(str + ")");
print("Number of primes between 7700 and 8000: ${
primesMap().skipWhile((p)=>p<7700).takeWhile((p)=>p<8000).length
}");
print("The 10,000th prime: ${
primesMap().skip(9999).first
}");
final start = DateTime.now().millisecondsSinceEpoch;
final answer = primesMap().takeWhile((p)=>p<2000000).reduce((a,p)=>a+p);
final elapsed = DateTime.now().millisecondsSinceEpoch - start;
}