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

Diophantine Equation Solver

by japhy (Canon)
on Apr 11, 2000 at 16:25 UTC ( #7301=perlcraft: print w/replies, xml ) Need Help??

   1: # working on making it allow negative numbers via some
   2: # crazy form of look-behind and look-ahead
   3: 
   4: # NOTE: just because you CAN use a regex to do this
   5: # doesn't mean you should!
   6: 
   7: use Carp;
   8: 
   9: if (%results = solve_dio('5x + 7y + 4z = 50')) {
  10:   print map "$_ => $results{$_}\n", keys %results;
  11: }
  12: 
  13: if (solve_dio(x => 3, y => 2, z => 5, 102)) {
  14:   print "solution found!\n";
  15: }
  16: 
  17: 
  18: # solve_dio('3x + 2y + 5z = 102');
  19: # solve_dio(x => 3, y => 2, z => 5, 102);
  20: 
  21: sub solve_dio {
  22:   my ($sum,%args,$regex,@values);
  23: 
  24:   if (@_ > 1) {
  25:     $sum = pop;
  26:     %args = @_;
  27:   }
  28:   elsif (@_ == 1) {
  29:     ($sum,%args) = parseEQN(shift);
  30:   }
  31:   else {
  32:     croak << "USAGE";
  33: not enough args to solve_dio()
  34:   solve_dio(EQN)
  35:   solve_dio(VAR => COEFF, [VAR => COEFF, ] SUM)
  36: USAGE
  37:   }
  38: 
  39:   $regex = join " ", map "((?:@{[ 0 x $args{$_} ]})+)", keys %args;
  40: 
  41:   if (@values = (0 x $sum) =~ /^ $regex $/x) {
  42:     return 1 if !wantarray;
  43:     for (@values) {
  44:       my ($var) = each %args;
  45:       $args{$var} = length() / $args{$var};
  46:     }
  47:     return %args;
  48:   }
  49: }
  50: 
  51: sub parseEQN {
  52:   (my $EQN = shift) =~ tr/A-Za-z0-9 //cd;
  53:   my (@parts,$sum,%args);
  54: 
  55:   @parts = split ' ', $EQN;
  56:   $sum = pop @parts;
  57:   %args = map reverse(/(\d+)([a-z])/), @parts;
  58: 
  59:   return ($sum, %args);
  60: }

Replies are listed 'Best First'.
RE: Diophantine Equation Solver
by kryten (Scribe) on Apr 11, 2000 at 18:39 UTC
    For all, like me, wondering what a Diophantine equation actually is:

    Diophantine equation
    (from: britannica.com who seem to hand out far too many cookies.)
    [An] equation involving only addition, multiplication, or taking power +s in which all the constants are natural numbers or their negatives and the only solutions of interest +are natural numbers or their negatives. Named in honour of the 3rd-century Greek mathematician Diop +hantus of Alexandria, these equations were not systematically solved until the 7th century b +y the Hindus.
    Maybe a maths type person can elaborate.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlcraft [id://7301]
Approved by root
help
Chatterbox?
[1nickt]: How old are your sprogs marto?
[marto]: 4, if they're good they#ll make it to 5 :P
[1nickt]: Mpph didn;t have twins bu I remember thinking that the "terrible twos" was a misnomer as age 4 seemed to be much more difficult.
LanX 4 kids and wanting to upgrade to 5? wow! ! !
[1nickt]: My lads are 15 and 31 now and both drive me just as crazy as when little, just less frequently.

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (9)
As of 2017-11-18 18:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:













    Results (277 votes). Check out past polls.

    Notices?