Accueil     À propos     Téléchargement     Ressources     Contactez-nous

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
nth_root of num?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
 Date: 1998-11-26 (18:32) From: Claude Marche Subject: Re: nth_root of num?
```>>>>> "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))
;;

```