_primes_drag.nx source
↩ module page · 61 lines · 1640 B
1// _primes_drag.nx -- multi-pass sieve for drag-race timing.
2// Runs N passes internally; harness divides wall-clock by N to get
3// per-pass cost, then computes passes/sec for the 5-second window.
4
5import "syscalls.nx"
6
7const SIEVE_SIZE: i64 = 1000000
8const N_PASSES: i64 = 100 // run 100 passes per ELF invocation
9
10func one_pass(buf: *u8, half: i64) -> i64 {
11 var i: i64 = 0
12 while i < half {
13 buf[i] = 0 as u8
14 i = i + 1
15 }
16 var factor: i64 = 3
17 while factor * factor <= SIEVE_SIZE {
18 let factor_idx: i64 = (factor - 3) / 2
19 var fi: i64 = factor_idx
20 var done: i64 = 0
21 while done == 0 {
22 if fi >= half { done = 1 }
23 if done == 0 {
24 if buf[fi] == (0 as u8) { done = 1 }
25 if done == 0 { fi = fi + 1 }
26 }
27 }
28 if fi >= half { return -1 }
29 let cur_num: i64 = 2 * fi + 3
30 var mult: i64 = cur_num * cur_num
31 while mult <= SIEVE_SIZE {
32 let idx: i64 = (mult - 3) / 2
33 buf[idx] = 1 as u8
34 mult = mult + 2 * cur_num
35 }
36 factor = cur_num + 2
37 }
38 var count: i64 = 1
39 var k: i64 = 0
40 while k < half {
41 if buf[k] == (0 as u8) {
42 let n: i64 = 2 * k + 3
43 if n <= SIEVE_SIZE { count = count + 1 }
44 }
45 k = k + 1
46 }
47 return count
48}
49
50func main() -> i64 {
51 let half: i64 = SIEVE_SIZE / 2
52 let buf: *u8 = sys_mmap(half)
53 var p: i64 = 0
54 var c: i64 = 0
55 while p < N_PASSES {
56 c = one_pass(buf, half)
57 p = p + 1
58 }
59 if c != 78498 { return 2 }
60 return 0
61}