Re: nth_root of num?

From: Claude Marche (Claude.Marche@lri.fr)
Date: Thu Nov 26 1998 - 17:23:49 MET


From: Claude Marche <Claude.Marche@lri.fr>
Date: Thu, 26 Nov 1998 17:23:49 +0100 (MET)
To: N Hur <mapnh@maths.bath.ac.uk>
Subject: Re: nth_root of num?
In-Reply-To: <Pine.SOL.4.05.9811251343120.18289-100000@odin.maths.bath.ac.uk>

>>>>> "Namhyun Hur" == N Hur <mapnh@maths.bath.ac.uk> writes:

    Namhyun Hur> Hi,

    Namhyun Hur> I am wondering if anyone has a function "nth_root"
    Namhyun Hur> for big_int in camllight. As far as I know only
    Namhyun Hur> "sqrt_big_int" is provided in the num library. Could
    Namhyun Hur> anyone send me the code if it is possible?

    Namhyun Hur> Regards,

    Namhyun Hur> Namhyun Hur.

I have written one, here is the code. It works with a personal version
of power, where the second argument is an int, not a num.

There is one function that rounds the result to the floor, one to the
ceiling. Of course, it is working only on big_ints, not ratios.

Hope this helps, (Any comments welcome)

-- 
| Claude Marché           | mailto:Claude.Marche@lri.fr |
| LRI - Bât. 490          | http://www.lri.fr/~marche/  |
| Université de Paris-Sud | phoneto: +33 1 69 15 64 85  |
| F-91405 ORSAY Cedex     | faxto: +33 1 69 15 65 86    |

open Num;;

let num_one = Int 1;;

let rec power_num x = function 0 -> num_one | 1 -> x | n -> let y = square_num (power_num x (n/2)) in if (n mod 2)=0 then y else mult_num y x ;;

let root_floor n x =

if le_num x num_one then x else let predn = pred n in let numpredn = Int predn and numn = Int n in let rec approx y = let ypnm1 = (power_num y predn) in let new_y = quo_num (add_num (mult_num numpredn (mult_num y ypnm1)) x) (mult_num numn ypnm1) in if ge_num new_y y then y else approx new_y in approx x ;;

let root_ceil n x = succ_num (root_floor n (pred_num x)) ;;



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:17 MET