5
$\begingroup$

I'm solving a Diophantine equation inside of a function using Reduce but I'm having trouble extracting the necessary parts of the answer.

For example, if my input equation is linear, I get an output from Reduce like:

C[1] ∈ Integers && x == 8 + 49 C[1] && k == 1 + 5 C[1]

if the equation is a quadratic, though, I get:

(C[1] ∈ Integers && x == 20 - 49 C[1] && 
   k == 41 - 200 C[1] + 245 C[1]^2) || (C[1] ∈ Integers && 
   x == 29 - 49 C[1] && k == 86 - 290 C[1] + 245 C[1]^2)

if the equation is cubic, I get:

C[1] ∈ 
  Integers && (x == 2 + 49 C[1] || x == 11 + 49 C[1] || 
   x == 36 + 49 C[1]) && k == 1/49 (9 + 5 x^3)

How do I identify and/or extract, say, the resulting condition on x? I originally used Part when I just had the linear case. So for example I would do something like:

Ans=Reduce[SomeEquality[x,k],{x,k},Integers];
X=x/.ToRules[Ans[[2]]/.{C[1]->0}]

But the outputs in the quadratic and cubic cases are in wildly different places...

$\endgroup$
  • $\begingroup$ The conditions you're getting at depend not only on x, but on the existence of another constants C[i], which must be integers in your examples. You can't get rid of them if you want the full result set. There isn't "a condition on x" to extract. Sorry. $\endgroup$ – Dr. belisarius Mar 29 '13 at 6:00
  • $\begingroup$ It's hard to tell what you want in general, Aeryk, but for these particular cases would it be the output of Last@Reap[(output of Reduce)/. {Equal[x, y_] :> Sow[y]}]? This gives a list of all the "somethings" where the form x==(something) appears in the solution. $\endgroup$ – whuber Mar 29 '13 at 22:49
2
$\begingroup$

Cannot test this in Mathematica right now, but pattern matching should work to get the bits that appear next to x. So for instance you could use

Cases[Ans,(x == z_)->(z/.C[1]->0),Infinity] 

That will capture all the terms where x appears on the left of == and will give return what on the right side of that equality with C[1] replaced by 0.

$\endgroup$
  • $\begingroup$ Close, but to get to set C[1] to 0, it needs to be this way: Cases[ans, (x == z_) -> (z), Infinity] /. C[1] -> 0 And that's just what I needed. Thanks! $\endgroup$ – Aeryk Mar 31 '13 at 18:46
  • $\begingroup$ Your welcome. I forgot that the syntax for -> in ´Cases´ is rather rigid. Nesting ´/.´ and ´->´ will work in replacements though. $\endgroup$ – Eduardo Serna Apr 1 '13 at 19:45
0
$\begingroup$

It's a bit difficult to answer here because you cannot simply throw the condition of Element[C[1], Integers] away. At least you have to remember this and when your goal is to transform this result into a set of rules, then just throw the Element parts away and apply ToRules

(C[1] \[Element] Integers && x == 20 - 49 C[1] && k == 41 - 200 C[1] + 245 C[1]^2) || 
(C[1] \[Element] Integers && x == 29 - 49 C[1] && k == 86 - 290 C[1] + 245 C[1]^2) 
    /. HoldPattern[Element[__]] :> Sequence[]

{ToRules[%]}

(*
{{x -> 20 - 49 C[1], k -> 41 - 200 C[1] + 245 C[1]^2}, 
 {x -> 29 - 49 C[1], k -> 86 - 290 C[1] + 245 C[1]^2}}
*)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.