Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Converting a Number into a Radical

by slinky773 (Sexton)
on Dec 18, 2013 at 03:32 UTC ( #1067582=perlquestion: print w/ replies, xml ) 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?

Comment on Converting a Number into a Radical
Replies are listed 'Best First'.
Re: Converting a Number into a Radical
by syphilis (Canon) 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))

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1067582]
Approved by ww
Front-paged by davido
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2015-07-08 03:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (94 votes), past polls