[Odin] Gen all primes and check if target number present[Odin] Gen all primes and check if target number present

🧮

Primes

Week 8, 2026

package main import "core:fmt" import "core:time" main :: proc () { MAX_X :: 10_000 primes := gen_primes(limit=MAX_X*MAX_X) minus_one_count := 0 add_one_count := 0 prev_primed_x := 0 for x in 1..=MAX_X { for s in ([2] struct { shift: int, counter: ^int } { { shift=-1, counter=&minus_one_count }, { shift=+1, counter=&add_one_count }, }) { if x*x+s.shift in primes { fmt.printfln("%i^2 %c 1 = %i", x, s.shift>0?'+':'-', x*x + s.shift) fmt.printfln("Difference: %i", x - prev_primed_x) prev_primed_x = x s.counter^ += 1 } } } fmt.println("--- Counts ---") fmt.printfln("MinusOneCount: %i", minus_one_count) fmt.printfln("AddOneCount: %i", add_one_count) } @require_results gen_primes :: proc (limit: int, allocator := context.allocator) -> map [int] struct {} { fmt.printfln("Generating primes, limit=%i...", limit) start := time.tick_now() defer fmt.printfln("...done in %v", time.tick_since(start)) Number_State :: enum u8 { undefined, prime, not_prime } numbers := make([] Number_State, limit+1, allocator=context.temp_allocator) for n in 2..=limit { if numbers[n] == .undefined { numbers[n] = .prime for k:=n+n; k<=limit; k+=n { if numbers[k] == .undefined { numbers[k] = .not_prime } } } } primes := make(map [int] struct {}, allocator) for n in 2..=limit { if numbers[n] == .prime { primes[n] = {} } } return primes }