code wiki / (root) / _primes_drag.nx

_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}