; find the nearest prime
(define (primes n)
(let ((sieve (make-vector n #t)) (ps (list)))
(do ((p 2 (+ p 1))) ((= n p))
(when (vector-ref sieve p)
(set! ps (cons p ps))
(do ((i (* p p) (+ i p))) ((<= n i))
(vector-set! sieve i #f))))
(list->vector (reverse ps))))
(define ps (primes 542))
(define (bsearch x xs)
(let loop ((lo 0) (hi (- (vector-length xs) 1)))
(let ((mid (+ lo (quotient (- hi lo) 2))))
(cond ((< hi lo)
(if (< (- (vector-ref xs hi) x)
(- x (vector-ref xs lo)))
(vector-ref xs lo)
(vector-ref xs hi)))
((< x (vector-ref xs mid)) (loop lo (- mid 1)))
((< (vector-ref xs mid) x) (loop (+ mid 1) hi))
(else (vector-ref xs mid))))))
(define (find-prime x) (bsearch x ps))
(display (find-prime 123.7)) (newline)
(display (find-prime 4)) (newline)
OyBmaW5kIHRoZSBuZWFyZXN0IHByaW1lCgooZGVmaW5lIChwcmltZXMgbikKICAobGV0ICgoc2lldmUgKG1ha2UtdmVjdG9yIG4gI3QpKSAocHMgKGxpc3QpKSkKICAgIChkbyAoKHAgMiAoKyBwIDEpKSkgKCg9IG4gcCkpCiAgICAgICh3aGVuICh2ZWN0b3ItcmVmIHNpZXZlIHApCiAgICAgICAgKHNldCEgcHMgKGNvbnMgcCBwcykpCiAgICAgICAgKGRvICgoaSAoKiBwIHApICgrIGkgcCkpKSAoKDw9IG4gaSkpCiAgICAgICAgICAodmVjdG9yLXNldCEgc2lldmUgaSAjZikpKSkKICAgIChsaXN0LT52ZWN0b3IgKHJldmVyc2UgcHMpKSkpCgooZGVmaW5lIHBzIChwcmltZXMgNTQyKSkKCihkZWZpbmUgKGJzZWFyY2ggeCB4cykKICAobGV0IGxvb3AgKChsbyAwKSAoaGkgKC0gKHZlY3Rvci1sZW5ndGggeHMpIDEpKSkKICAgIChsZXQgKChtaWQgKCsgbG8gKHF1b3RpZW50ICgtIGhpIGxvKSAyKSkpKQogICAgICAoY29uZCAoKDwgaGkgbG8pCiAgICAgICAgICAgICAgKGlmICg8ICgtICh2ZWN0b3ItcmVmIHhzIGhpKSB4KQogICAgICAgICAgICAgICAgICAgICAoLSB4ICh2ZWN0b3ItcmVmIHhzIGxvKSkpCiAgICAgICAgICAgICAgICAgICh2ZWN0b3ItcmVmIHhzIGxvKQogICAgICAgICAgICAgICAgICAodmVjdG9yLXJlZiB4cyBoaSkpKQogICAgICAgICAgICAoKDwgeCAodmVjdG9yLXJlZiB4cyBtaWQpKSAobG9vcCBsbyAoLSBtaWQgMSkpKQogICAgICAgICAgICAoKDwgKHZlY3Rvci1yZWYgeHMgbWlkKSB4KSAobG9vcCAoKyBtaWQgMSkgaGkpKQogICAgICAgICAgICAoZWxzZSAodmVjdG9yLXJlZiB4cyBtaWQpKSkpKSkKCihkZWZpbmUgKGZpbmQtcHJpbWUgeCkgKGJzZWFyY2ggeCBwcykpCgooZGlzcGxheSAoZmluZC1wcmltZSAxMjMuNykpIChuZXdsaW5lKQooZGlzcGxheSAoZmluZC1wcmltZSA0KSkgKG5ld2xpbmUp