Reformat the Basic.rewrite docstring

Better indentation and additional explanatory doctests.
solve euler ordinary differential eqs in ode.py

* solve nth order linear homogeneous euler ODEs
* added hints, classifying code, and solving code
* added test function with a few examples
added trailing newline to test_ode.py
removed cruft print statement
rewrite of euler ode tests

* now use constant_renumber to avoid machine-specific fails
* fixed white-space issue (I hope)
Added new test for euler ode solver

* discovered a bug with the classifier
* added an example to test for this
mprovements to euler equation solver

* broader pattern matching rules
* add tests to verify broader pattern matching
* update hints test for new hint, under better matchings
fix quality and ode constant numbering bug
fix quality and ode constant numbering bug

- added test for real root in euler ode solver
- revert some tests in test_dsolve_options()
improvements to code quality, with better sympy use
first draft 1dSHO
merge euler_odes branch with latest version of master
completed documentation, corrected inline example
Added functionality to Q.real and Q.imaginary and fixed issue:2324

>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**2),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**3),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**2),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**y),Q.imaginary(x)&Q.imaginary(y))
True
>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(3))
False
>>> ask(Q.imaginary(x**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary((x*2)**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(x**y),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(I**y),True and Q.imaginary(y))
False

probably a fix to the issue:2324
Added functionality to Q.real and Q.imaginary and fixed issue:2324

>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**2),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**3),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**2),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**y),Q.imaginary(x)&Q.imaginary(y))
True
>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(3))
False
>>> ask(Q.imaginary(x**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary((x*2)**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(x**y),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(I**y),True and Q.imaginary(y))
False

probably a fix to the issue:2324
Added comparions to tuples

>>> Tuple(1,3)>=Tuple(-10,30)
True
>>> Tuple(1,3)<=Tuple(-10,30)
False
>>>
Added functionality to Q.real and Q.imaginary and fixed issue:2324

>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**2),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**3),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**2),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**y),Q.imaginary(x)&Q.imaginary(y))
True
>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(3))
False
>>> ask(Q.imaginary(x**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary((x*2)**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(x**y),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(I**y),True and Q.imaginary(y))
False

probably a fix to the issue:2324
Added functionality to Q.real and Q.imaginary and fixed issue:2324

>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**2),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**3),Q.imaginary(x)&Q.real(2))
True
>>> ask(Q.imaginary(x**2),Q.imaginary(x)&Q.real(2))
False
>>> ask(Q.real(x**y),Q.imaginary(x)&Q.imaginary(y))
True
>>> ask(Q.real(x**3),Q.imaginary(x)&Q.real(3))
False
>>> ask(Q.imaginary(x**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary((x*2)**(3*y)),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(x**y),Q.imaginary(x)&Q.imaginary(y))
False
>>> ask(Q.imaginary(I**y),True and Q.imaginary(y))
False

probably a fix to the issue:2324
updated
Updated tests