laziness, impatience, and hubris PerlMonks

### Converting a Number into a Radical

 on Dec 18, 2013 at 03:32 UTC Need Help??
slinky773 has asked for the wisdom of the Perl Monks concerning the following question:

On the TI-Nspire calculator, every division answer given, unless irrational, is given in exact form, either as an integer or as a fraction. I can do this in Perl with the fraction module. Every square root answer given is also given in exact form, either as an integer or as a radical. I do not know how to do this in perl. How do you convert a number to a radical?

Replies are listed 'Best First'.
Re: Converting a Number into a Radical
by syphilis (Chancellor) on Dec 18, 2013 at 05:50 UTC
I gather we're concerned only with square roots of integers and that, for example, if the answer is sqrt(18), you want to see it presented as 3 x sqrt(2) instead of simply sqrt(18).
To achieve this you'll first want to factorise the integer - you could use something like Math::Factor::XS or Math::Prime::Util.

To stick with the above example, 18 factorises to the primes 2,3,3 - multiply those primes together and you end up with 18.
Notice that the "3" occurs twice - hence you can write the solution as 3 * sqrt(2).
For sqrt(1050) - the prime factors are 2,3,5,5,7, with the "5" occurring twice, and the solution is therefore:
5 * sqrt(2 * 3 * 7) = 5 * sqrt(42)
That's essentially how it's done - I don't know if there's a module that does it all for you, or whether you'll have to program a good portion of it yourself. (Perhaps Math::NumSeq might also have something to offer.)

Cheers,
Rob
Thanks, Rob. That actually really helps.

I could not resist to write it out:

use strict; use warnings; use Math::Factor::XS 'prime_factors'; my \$n = shift; ( \$n and \$n > 0 and \$n == int \$n ) or die "Need positive integer as in +put!\n"; my %p; \$p{\$_}++ for prime_factors( \$n ); my \$radical = 1; \$radical *= \$_ for grep { \$p{\$_}%2 } keys %p; print "sqrt( \$n ) = ", sqrt( \$n/\$radical ), " * sqrt( \$radical )\n";

What I was missing is a product function, like sum from List::Util. There is one in the replacement List::Util that comes with Scalar::Util but that means overwriting the standard module which makes me feel uncomfortable.

Awesome, syphilis - I wish it were possible to vote it up by more than than one.

A user level that continues to overstate my experience :-))
Re: Converting a Number into a Radical
by Anonymous Monk on Dec 18, 2013 at 04:49 UTC

I don't know of a Perl solution, but SymPy (see www.sympy.org) can do this kind of thing.

>>> sqrt(49) 7 >>> sqrt(27) 3*sqrt(3) >>> simplify(sqrt(4+sqrt(448))) 2*sqrt(1 + 2*sqrt(7))

Create A New User
Node Status?
node history
Node Type: perlquestion [id://1067582]
Approved by ww
Front-paged by davido
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2017-08-20 23:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (317 votes). Check out past polls.

Notices?