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