Talk:Nth root

From Rosetta Code
Revision as of 14:17, 29 November 2011 by rosettacode>Spekkio

Comparison to Non-integer Exponentiation

Okay, I get that this task calls for implementing a particular algorithm (convergence by successive approximation). However, it seems like it would be appropriate to describe (in comments perhaps) whether the language supports a more direct method of computing an nth root (such as raising a number to a fractional power: x ** (1/n) for the nth root of x).

For those languages which support it (non-integer exponentiation; or via any library function) I'd also recommend that the task specify that the code should compare the results of this algorithm versus the one obtained in the language's most natural native method. JimD 22:03, 3 August 2009 (UTC)

Exponentiation operators should be discussed in Math constants and functions. Comparisons could be added optionally. --Mwn3d 22:14, 3 August 2009 (UTC)
Math constants and functions does not ask for an Nth root function, though that is related to exponentation. --Rdm 15:16, 18 May 2010 (UTC)

C edit

I see the recent edits on C example as having multiple problems: 1) math function pow() was specifically avoided because it makes no sense to do nth root if we could just pow() it; 2) prec parameter is of wrong type; 3) when comparing for convergence, at least take the absolute value; and the comparison should be made against a relative value; 4) requiring 4 parameters is counterintuive. I'll let it stand for now in case the new editor will come and fix it, or it will be reverted. --Ledrug 22:40, 4 September 2011 (UTC)

Maclaurin Series

Nth root can be calculated using the maclaurin series of exp and ln like this






since n is always an integer >= 0, a simple pow function can be used for the calculations.

example: <lang lisp>(defun powint (a b)

 (if (= b 0)
     1
   (* a (powint a (- b 1)))))</lang>


Ofcourse it's not possible to calculate up to an infinity, but the value can be calculated til it is good enough.

Using a library that implements a type that includes nominator and a denominator (like GMP's mpt_q), it is possible to calculate

the Nth root using only integers.

Maybe not the best solution but it could be something like this <lang lisp>(defun factorial (n)

 (if (= n 0)
     1
   (* n (factorial (- n 1)))))

(defun powint (a b)

 (if (= b 0)
     1
   (* a (powint a (- b 1)))))

(defun logS(x n) (if (= n 0) (* 2 x) (+ (* 2 (/ (powint x (+ (* 2 n) 1)) (+ (* 2 n) 1))) (logS x (- n 1)) ) ))

(defun loge(x n) (logS (/ (- x 1) (+ 1 x)) n))

(defun expon(x n) (if (= n 0) 1 (+ (/ (powint x n) (factorial n)) (expon x (- n 1)))))

(defun pown(x a n) (expon (* a (loge x n)) n))</lang>


example output:

[3]> (pown 2 1/3 3)
45765070755968273/36327499129868625
[4]> (* (pown 2 1/3 20) 1.0)
1.2599211

--Spekkio 12:05, 29 November 2011 (UTC)