Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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...

share|improve this question
    
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. –  belisarius Mar 29 '13 at 6:00
    
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. –  whuber Mar 29 '13 at 22:49

2 Answers 2

up vote 2 down vote accepted

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.

share|improve this answer
    
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! –  Aeryk Mar 31 '13 at 18:46
    
Your welcome. I forgot that the syntax for -> in ´Cases´ is rather rigid. Nesting ´/.´ and ´->´ will work in replacements though. –  Eduardo Serna Apr 1 '13 at 19:45

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}}
*)
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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