The Nth root of a given number is that number raised to the reciprocal of N. Thus:
print $num ** (1/3);
Update: Heh. Looks like I beat the rush. Is this where I delete everything and replace it with "first post!"? :)
| [reply] [Watch: Dir/Any] [d/l] |
All the replies posted so far finds a real root. Is there a method to find complex roots as well? Math::Complex doesn't seem to cut it.
Update: As pointed out below,
c=r^(1/n)*e^(2*pi*i*j/n) (for j=0,1,...,n-1) will do the trick, but I was thinking someone should have written an easy access to the roots, as in:
@roots=complex_roots($real, $n)
to give all the n-th roots of $real. Hmmm.... This shouldn't be too difficult. I'll leave it as exercise to the reader. :) | [reply] [Watch: Dir/Any] [d/l] [select] |
You can use trig and brute force a method -- I'm a little busy to give it a go, but the complex roots lie on a circle in the complex plane of the same radius as the real root. With a cube root, that means you need to find the coords of the points at 120 and 240 degrees (1/3 and 2/3 around the circle) on that circle -- hopefully that's clear. For the nth root you need to look at the (i * 360/n) degree points with i = 0..(n-1). i=0 corresponds to the real root.
Update:
#!/usr/bin/perl -w
use strict;
my $twoPi = 4 * atan2(1, 0);
for (2..5) {
my @roots = nthRoots(8, $_);
print "$_ th roots of 8: $/";
foreach my $root (@roots) {
print "$root->{Real} $root->{Imag}$/";
}
};
sub nthRoots {
my $x = shift;
my $n = shift;
# Should check for integer powers
my @roots;
$roots[0] = {
Real => $x ** (1/$n),
Imag => 0
};
for (1..($n-1)) {
push @roots, {
Real => $roots[0]->{Real} * cos( $_ * $twoPi/$n ),
Imag => $roots[0]->{Real} * sin( $_ * $twoPi/$n )
};
};
return @roots;
}
| [reply] [Watch: Dir/Any] [d/l] |
To find the cube root, raise a number to the 1/3 power.
print 8 ** (1/3); # prints 2
| [reply] [Watch: Dir/Any] [d/l] |
| [reply] [Watch: Dir/Any] [d/l] |
It means this:
8**(1/3) == 81/3 == cube root of 8 == 2 | [reply] [Watch: Dir/Any] |
small math lesson for AM: just incase you didn't realize, taking the nth root of anything is the same as raising that expression/number/etc..etc..etc... to the 1/n power where n is the root you are trying to find.
to find the 5th root of x, you simply do x**(1/5), 218th root x**(1/218), you get the picture. FYI: very much respect for the question, but just not a perl way of doing it.. just a math way. You can write your own sub to do it if you really wanna make it readable for newbies or non-coders.
#!/perl
use strict;
#Take the 3rd root of 8;
my $root = nthRoot(8,3);
print $root;
#Just pull the parameters off the
#@_ array as they are needed
#in the return statement
sub nthRoot
{return (shift)**(1/shift);}
| [reply] [Watch: Dir/Any] [d/l] |
| [reply] [Watch: Dir/Any] |