From a45621a8de9d0e1ab54347b5086067cc2f27b77e Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 21 Feb 2017 15:50:14 +0000 Subject: [PATCH] Extend exact-integer-sqrt to support bignums --- scheme/base.sld | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scheme/base.sld b/scheme/base.sld index 0241a612..fbb56403 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -1070,13 +1070,22 @@ (define-c bignum? "(void *data, int argc, closure _, object k, object obj)" " return_closcall1(data, k, Cyc_is_bignum(obj)); ") + (define-c bignum-sqrt + "(void *data, int argc, closure _, object k, object obj)" + " alloc_bignum(data, bn); + if (MP_OKAY != mp_sqrt(&(bignum_value(obj)), &bignum_value(bn))) { + Cyc_rt_raise2(data, \"Error computing sqrt\", obj); + } + return_closcall1(data, k, bn); ") ;; from mosh (define (exact-integer-sqrt k) (unless (and (exact? k) (integer? k) (not (negative? k))) (error "exact non-negative integer required" k)) - (let* ((s (exact (truncate (sqrt k)))) + (let* ((s (if (bignum? k) + (bignum-sqrt k) + (exact (truncate (sqrt k))))) (r (- k (* s s)))) (values s r))) (define-c sqrt