<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Stefan&#039;s Blog</title>
	<atom:link href="http://krastanov.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://krastanov.wordpress.com</link>
	<description>Just another WordPress.com site</description>
	<lastBuildDate>Sat, 11 May 2013 14:58:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='krastanov.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Stefan&#039;s Blog</title>
		<link>http://krastanov.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://krastanov.wordpress.com/osd.xml" title="Stefan&#039;s Blog" />
	<atom:link rel='hub' href='http://krastanov.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Sage vs SymPy &#8211; integration</title>
		<link>http://krastanov.wordpress.com/2012/10/25/sage-vs-sympy-integration/</link>
		<comments>http://krastanov.wordpress.com/2012/10/25/sage-vs-sympy-integration/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 23:51:52 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[SymPy]]></category>
		<category><![CDATA[integrals]]></category>
		<category><![CDATA[sage]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://blog.krastanov.org/?p=561</guid>
		<description><![CDATA[During the recent GSoC summit I had the chance to participate in many fascinating discussions. One such occasion was while meeting the Sage representative. A detail he mentioned, was that during his tests SymPy frequently failed to solve integrals that Sage (using Maxima) was able to solve. An explanation, in which I like to believe, [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=561&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>During the recent GSoC summit I had the chance to participate in many fascinating discussions. One such occasion was while meeting the Sage representative.</p>
<p>A detail he mentioned, was that during his tests SymPy frequently failed to solve integrals that Sage (using Maxima) was able to solve. An explanation, in which I like to believe, would be that he was testing an old version of SymPy lacking the new integration routines implemented during the last few GSoC projects. Hence my decision the compare the most recent versions of both projects.</p>
<p>The tested versions are SymPy 0.7.2 and Sage 5.3.</p>
<p>Depending on screen size and wordpress theme the table might be badly formatted so here is a link to the <a href="https://raw.github.com/wiki/sympy/sympy/sympy_sage_integration.html" target="_blank">wiki html page</a> and a <a href="http://krastanov.files.wordpress.com/2012/10/sympy_sage.pdf">pdf</a> version.</p>
<p>It should be noted that Sage is more rigorous about the assumptions on its symbols and so it fails to integrate something like <img src='http://s0.wp.com/latex.php?latex=x%5En&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='x^n' title='x^n' class='latex' /> if <img src='http://s0.wp.com/latex.php?latex=n&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='n' title='n' class='latex' /> is not explicitly different than -1. I personally think that this is a feature and not a bug. Due to this difference however the script used to test Sage differs from the one used for SymPy.</p>
<p>Another minor methodological difference in the tests is the fact that the timeout pattern that I used failed to work for the Sage interpreter. Hence, SymPy integration timeouts at about 120 seconds while Sage integration is manually interrupted when it takes too much time.</p>
<p>Final methodological difference is that I purge the SymPy cache between each integral as otherwise the RAM usage becomes too great.</p>
<p>The results show that SymPy is slightly better in using special functions to solve integrals, but there are also a few integrals that Sage solves while SymPy fails to do so. On few occasions Sage fails disgracefully, meaning  that it returns an error instead of unevaluated integral. When both packages fail to evaluate the integral SymPy is much slower to say so (timeout for SymPy compared to 1 or 2 seconds for Sage to return an unevaluated integral). Finally, on some occasions the results by Sage seem better simplified.</p>
<p>Integrals solved better by SymPy (if you consider special functions &#8220;better&#8221;):</p>
<ul>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1%7D%7Ba+x%5En+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{1}{a x^n + 1}' title='&#92;frac{1}{a x^n + 1}' class='latex' /> with the use of a special function while Sage returns unevaluated integrals</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba+x%5En%7D%7Bb+x%5Em+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{a x^n}{b x^m + 1}' title='&#92;frac{a x^n}{b x^m + 1}' class='latex' /> with the use of a special function while Sage returns unevaluated integrals</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba+x%5En+%2B+1%7D%7Bb+x%5Em+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{a x^n + 1}{b x^m + 1}' title='&#92;frac{a x^n + 1}{b x^m + 1}' class='latex' /> with the use of a special function while Sage returns unevaluated integrals</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba+x%5E5+%2B+x%5E3+%2B+1%7D%7Bb+x%5E5+%2B+x%5E3+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{a x^5 + x^3 + 1}{b x^5 + x^3 + 1}' title='&#92;frac{a x^5 + x^3 + 1}{b x^5 + x^3 + 1}' class='latex' /> with the use of a special function while Sage returns unevaluated integrals</li>
</ul>
<p>Integrals solved better by Sage:</p>
<ul>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba+x%5E2%7D%7Bb+x%5E2+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{a x^2}{b x^2 + 1}' title='&#92;frac{a x^2}{b x^2 + 1}' class='latex' /> solved by both but Sage&#8217;s result is simpler (it uses arctan instead of log)</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1%7D%7B%5Csqrt%7Bx%5E2+%2B+1%7D%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{1}{&#92;sqrt{x^2 + 1}}' title='&#92;frac{1}{&#92;sqrt{x^2 + 1}}' class='latex' /> SymPy fails this simple integral</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Clog%5Cleft%28%5Cfrac%7Ba+x%5E3%7D%7Bb+x%5E3+%2B+1%7D%5Cright%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;log&#92;left(&#92;frac{a x^3}{b x^3 + 1}&#92;right)' title='&#92;log&#92;left(&#92;frac{a x^3}{b x^3 + 1}&#92;right)' class='latex' /> solved by both but Sage&#8217;s result is much simpler</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Clog%5Cleft%28%5Cfrac%7Ba+x%5E2+%2B+1%7D%7Bb+x%5E2+%2B+1%7D%5Cright%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;log&#92;left(&#92;frac{a x^2 + 1}{b x^2 + 1}&#92;right)' title='&#92;log&#92;left(&#92;frac{a x^2 + 1}{b x^2 + 1}&#92;right)' class='latex' /> SymPy fails</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Clog%5Cleft%28%5Cfrac%7Ba+x%5E3+%2B+1%7D%7Bb+x%5E3+%2B+1%7D%5Cright%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;log&#92;left(&#92;frac{a x^3 + 1}{b x^3 + 1}&#92;right)' title='&#92;log&#92;left(&#92;frac{a x^3 + 1}{b x^3 + 1}&#92;right)' class='latex' /> SymPy fails</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1%7D%7B%5Csin+x+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{1}{&#92;sin x + 1}' title='&#92;frac{1}{&#92;sin x + 1}' class='latex' /> SymPy fails</li>
<li><img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba+%5Csin%5E2+x+%2B+1%7D%7Bb+%5Csin%5E2+x+%2B+1%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;frac{a &#92;sin^2 x + 1}{b &#92;sin^2 x + 1}' title='&#92;frac{a &#92;sin^2 x + 1}{b &#92;sin^2 x + 1}' class='latex' /> SymPy fails</li>
</ul>
<p>The code for the SymPy tests:</p>
<pre class="brush: python; title: ; notranslate">
import signal
from time import clock
from sympy import *
from sympy.core.cache import clear_cache

class TimeoutException(Exception):
pass

def timeout_handler(signum, frame):
raise TimeoutException()

a, b, x = symbols('a b x')
n, m = symbols('n m', integer=True)

integrants = [
x,
a*x**n,
a*x**n + 1,
a*x**b + 1,

1/x,
1/(x + 1),
1/(x**2 + 1),
1/(x**3 + 1),
1/(a*x**n),
1/(a*x**n + 1),
1/(a*x**b + 1),

a*x**2/(b*x**2 + 1),
a*x**3/(b*x**3 + 1),
a*x**n/(b*x**m + 1),
(a*x**2 + 1)/(b*x**2 + 1),
(a*x**3 + 1)/(b*x**3 + 1),
(a*x**n + 1)/(b*x**m + 1),
(a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1),

sqrt(1/x),
sqrt(1/(x + 1)),
sqrt(1/(x**2 + 1)),
sqrt(1/(x**3 + 1)),
sqrt(1/(a*x**n)),
sqrt(1/(a*x**n + 1)),
sqrt(1/(a*x**b + 1)),
sqrt(a*x**2/(b*x**2 + 1)),
sqrt(a*x**3/(b*x**3 + 1)),
sqrt(a*x**n/(b*x**m + 1)),
sqrt((a*x**2 + 1)/(b*x**2 + 1)),
sqrt((a*x**3 + 1)/(b*x**3 + 1)),
sqrt((a*x**n + 1)/(b*x**m + 1)),
sqrt((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)),

log(x),
log(1/x),
log(1/(x + 1)),
log(1/(x**2 + 1)),
log(1/(x**3 + 1)),
log(1/(a*x**n)),
log(1/(a*x**n + 1)),
log(1/(a*x**b + 1)),
log(a*x**2/(b*x**2 + 1)),
log(a*x**3/(b*x**3 + 1)),
log(a*x**n/(b*x**m + 1)),
log((a*x**2 + 1)/(b*x**2 + 1)),
log((a*x**3 + 1)/(b*x**3 + 1)),
log((a*x**n + 1)/(b*x**m + 1)),
log((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)),

sin(x),
sin(x)**n*cos(x)**m,
sin(a*x)**n*cos(b*x)**m,
1/sin(x),
1/(sin(x) + 1),
1/(sin(x)**2 + 1),
1/(sin(x)**3 + 1),
1/(a*sin(x)**n),
1/(a*sin(x)**n + 1),
1/(a*sin(x)**b + 1),
a*sin(x)**2/(b*sin(x)**2 + 1),
a*sin(x)**3/(b*sin(x)**3 + 1),
a*sin(x)**n/(b*sin(x)**m + 1),
(a*sin(x)**2 + 1)/(b*sin(x)**2 + 1),
(a*sin(x)**3 + 1)/(b*sin(x)**3 + 1),
(a*sin(x)**n + 1)/(b*sin(x)**m + 1),
(a*sin(x)**5 + sin(x)**3 + 1)/(b*sin(x)**5 + sin(x)**3 + 1),
]

integrated = []
durations = []

f_integrants = open('dump_integrants', 'w')
f_integrated = open('dump_integrated', 'w')
f_durations = open('dump_duration', 'w')

for index, integrant in enumerate(integrants):
clear_cache()
print '====================================='
print index, ' of ', len(integrants)
print '###', integrant
start = clock()
try:
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(120)
integrated.append(integrate(integrant, x))
signal.alarm(0)
except TimeoutException:
integrated.append(TimeoutException)
finally:
signal.signal(signal.SIGALRM, old_handler)
durations.append(clock() - start)
print '###', integrated[-1]
print 'in %f seconds'%durations[-1]

f_integrants.write(str(integrant))
f_integrated.write(str(integrated[-1]))
f_durations.write(str(durations[-1]))
f_integrants.write('\n')
f_integrated.write('\n')
f_durations.write('\n')
</pre>
<p>And for Sage:</p>
<pre class="brush: python; title: ; notranslate">
import signal
from time import clock
from sage.all import *
from sage.symbolic.integration.integral import indefinite_integral

class TimeoutException(Exception):
pass

def timeout_handler(signum, frame):
raise TimeoutException()

a, b, x = var('a b x')
n, m = var('n m')
assume(n, 'integer')
assume(m, 'integer')

assume(n != 1)
assume(n != -1)
assume(n != 2)
assume(n&gt;0)
assume(b != 1)
assume(b != -1)
assume(b&gt;0)
assume(a&gt;0)

integrants = [
x,
a*x**n,
a*x**n + 1,
a*x**b + 1,

1/x,
1/(x + 1),
1/(x**2 + 1),
1/(x**3 + 1),
1/(a*x**n),
1/(a*x**n + 1),
1/(a*x**b + 1),

a*x**2/(b*x**2 + 1),
a*x**3/(b*x**3 + 1),
a*x**n/(b*x**m + 1),
(a*x**2 + 1)/(b*x**2 + 1),
(a*x**3 + 1)/(b*x**3 + 1),
(a*x**n + 1)/(b*x**m + 1),
(a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1),

sqrt(1/x),
sqrt(1/(x + 1)),
sqrt(1/(x**2 + 1)),
sqrt(1/(x**3 + 1)),
sqrt(1/(a*x**n)),
sqrt(1/(a*x**n + 1)),
sqrt(1/(a*x**b + 1)),
sqrt(a*x**2/(b*x**2 + 1)),
sqrt(a*x**3/(b*x**3 + 1)),
sqrt(a*x**n/(b*x**m + 1)),
sqrt((a*x**2 + 1)/(b*x**2 + 1)),
sqrt((a*x**3 + 1)/(b*x**3 + 1)),
sqrt((a*x**n + 1)/(b*x**m + 1)),
sqrt((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)),

log(x),
log(1/x),
log(1/(x + 1)),
log(1/(x**2 + 1)),
log(1/(x**3 + 1)),
log(1/(a*x**n)),
log(1/(a*x**n + 1)),
log(1/(a*x**b + 1)),
log(a*x**2/(b*x**2 + 1)),
log(a*x**3/(b*x**3 + 1)),
log(a*x**n/(b*x**m + 1)),
log((a*x**2 + 1)/(b*x**2 + 1)),
log((a*x**3 + 1)/(b*x**3 + 1)),
log((a*x**n + 1)/(b*x**m + 1)),
log((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)),

sin(x),
sin(x)**n*cos(x)**m,
sin(a*x)**n*cos(b*x)**m,
1/sin(x),
1/(sin(x) + 1),
1/(sin(x)**2 + 1),
1/(sin(x)**3 + 1),
1/(a*sin(x)**n),
1/(a*sin(x)**n + 1),
1/(a*sin(x)**b + 1),
a*sin(x)**2/(b*sin(x)**2 + 1),
a*sin(x)**3/(b*sin(x)**3 + 1),
a*sin(x)**n/(b*sin(x)**m + 1),
(a*sin(x)**2 + 1)/(b*sin(x)**2 + 1),
(a*sin(x)**3 + 1)/(b*sin(x)**3 + 1),
(a*sin(x)**n + 1)/(b*sin(x)**m + 1),
(a*sin(x)**5 + sin(x)**3 + 1)/(b*sin(x)**5 + sin(x)**3 + 1),
]

integrated = []
durations = []

f_integrants = open('dump_integrants', 'w')
f_integrated = open('dump_integrated', 'w')
f_durations = open('dump_duration', 'w')

for index, integrant in enumerate(integrants):
print '====================================='
print index, ' of ', len(integrants)
print '###', integrant
start = clock()
try:
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(120)
integrated.append(indefinite_integral(integrant, x))
signal.alarm(0)
except Exception, e:
integrated.append(e)
finally:
signal.signal(signal.SIGALRM, old_handler)
durations.append(clock() - start)
print '###', integrated[-1]
print 'in %f seconds'%durations[-1]

f_integrants.write(str(integrant))
f_integrated.write(str(integrated[-1]))
f_durations.write(str(durations[-1]))
f_integrants.write('\n')
f_integrated.write('\n')
f_durations.write('\n')
</pre>
<p>Below is the complete table (available as a <a href="https://raw.github.com/wiki/sympy/sympy/sympy_sage_integration.html" target="_blank">wiki html page</a> and a <a href="http://krastanov.files.wordpress.com/2012/10/sympy_sage.pdf">pdf</a>).</p>
<table>
<caption>Sympy vs Sage integration routines</caption>
<tbody>
<tr>
<td style="font-size:10pt;">Legend:</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="background:#FF00FF;font-size:10pt;">Disgraceful failure</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="background:#FF9900;font-size:10pt;">Timeout or manual interupt</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="background:#33CCCC;font-size:10pt;">Return an unevalued integral</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="background:#99CC00;font-size:10pt;">Asking for assumptions</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="background:#00FF00;font-size:10pt;">Solution with fancy special functions</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thin solid #000000;" rowspan="2" colspan="1">Integrant</td>
<td style="font-size:10pt;border-top:thin solid #000000;" rowspan="1" colspan="2">Sympy `integrate`</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;" rowspan="1" colspan="2">Sage `indefinite_integral`</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thin solid #000000;" rowspan="2" colspan="1">Comments</td>
</tr>
<tr>
<td style="font-size:10pt;border-bottom:thick double #000000;">Result</td>
<td style="font-size:10pt;border-bottom:thick double #000000;">cpu time</td>
<td style="font-size:10pt;border-bottom:thick double #000000;border-left:thin solid #000000;">Result</td>
<td style="font-size:10pt;border-bottom:thick double #000000;">cpu time</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thick double #000000;border-left:thin solid #000000;">x</td>
<td style="font-size:10pt;border-left:thick double #000000;">x**2/2</td>
<td style="font-size:10pt;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;">1/2*x^2</td>
<td style="font-size:10pt;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thick double #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**n</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x**(n + 1)/(n + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">a*x^(n + 1)/(n + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether the denominator is zero before solving.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**n + 1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x**(n + 1)/(n + 1) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">a*x^(n + 1)/(n + 1) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether the denominator is zero before solving.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**b + 1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x**(b + 1)/(b + 1) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">a*x^(b + 1)/(b + 1) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether the denominator is zero before solving.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">log(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">log(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">log(x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">log(x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(x**2 + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">atan(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">arctan(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(x**3 + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">log(x + 1)/3 &#8211; log(x**2 &#8211; x + 1)/6 + sqrt(3)*atan(2*sqrt(3)*x/3 &#8211; sqrt(3)/3)/3</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">1/3*sqrt(3)*arctan(1/3*(2*x &#8211; 1)*sqrt(3)) + 1/3*log(x + 1) &#8211; 1/6*log(x^2 &#8211; x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">x**(-n)/a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">x**(-n + 1)/(a*(-n + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">-x^(-n + 1)/((n &#8211; 1)*a)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether the denominator is zero before solving.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(a*x**n + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">x*gamma(1/n)*lerchphi(a*x**n*exp_polar(I*pi), 1, 1/n)/(n**2*gamma(1 + 1/n))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">2</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(1/(x^n*a + 1), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy solves with special functions an integral that Sage cannot solve.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(a*x**b + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">x*gamma(1/b)*lerchphi(a*x**b*exp_polar(I*pi), 1, 1/b)/(b**2*gamma(1 + 1/b))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(1/(x^b*a + 1), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy solves with special functions an integral that Sage cannot solve.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**2/(b*x**2 + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*(sqrt(-1/b**3)*log(-b*sqrt(-1/b**3) + x)/2 &#8211; sqrt(-1/b**3)*log(b*sqrt(-1/b**3) + x)/2 + x/b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">(x/b &#8211; arctan(sqrt(b)*x)/b^(3/2))*a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**3/(b*x**3 + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*(RootSum(_t**3 + 1/(27*b**4), Lambda(_t, _t*log(-3*_t*b + x))) + x/b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-1/6*(2*sqrt(3)*arctan(1/3*(2*b^(2/3)*x &#8211; b^(1/3))*sqrt(3)/b^(1/3))/b^(4/3) &#8211; 6*x/b &#8211; log(b^(2/3)*x^2 &#8211; b^(1/3)*x + 1)/b^(4/3) + 2*log((b^(1/3)*x + 1)/b^(1/3))/b^(4/3))*a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Interesting examples deserving more study as Sympy uses the sum of the roots of a high order polynomial while Sage uses elementary special functions.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*x**n/(b*x**m + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*(n*x*x**n*gamma(n/m + 1/m)*lerchphi(b*x**m*exp_polar(I*pi), 1, n/m + 1/m)/(m**2*gamma(1 + n/m + 1/m)) + x*x**n*gamma(n/m + 1/m)*lerchphi(b*x**m*exp_polar(I*pi), 1, n/m + 1/m)/(m**2*gamma(1 + n/m + 1/m)))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">3</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">(m*integrate(x^n/((m &#8211; n &#8211; 1)*b^2*x^(2*m) + 2*(m &#8211; n &#8211; 1)*x^m*b + m &#8211; n &#8211; 1), x) &#8211; x^(n + 1)/((m &#8211; n &#8211; 1)*x^m*b + m &#8211; n &#8211; 1))*a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy solves with special functions an integral that Sage cannot solve.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*x**2 + 1)/(b*x**2 + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x/b + sqrt((-a**2 + 2*a*b &#8211; b**2)/b**3)*log(-b*sqrt((-a**2 + 2*a*b &#8211; b**2)/b**3)/(a &#8211; b) + x)/2 &#8211; sqrt((-a**2 + 2*a*b &#8211; b**2)/b**3)*log(b*sqrt((-a**2 + 2*a*b &#8211; b**2)/b**3)/(a &#8211; b) + x)/2</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">a*x/b &#8211; (a &#8211; b)*arctan(sqrt(b)*x)/b^(3/2)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage symplifies better (log-to-trig formulas).</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*x**3 + 1)/(b*x**3 + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x/b + RootSum(_t**3 + (a**3 &#8211; 3*a**2*b + 3*a*b**2 &#8211; b**3)/(27*b**4), Lambda(_t, _t*log(-3*_t*b/(a &#8211; b) + x)))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">a*x/b &#8211; 1/3*(a*b &#8211; b^2)*sqrt(3)*arctan(1/3*(2*b^(2/3)*x &#8211; b^(1/3))*sqrt(3)/b^(1/3))/b^(7/3) + 1/6*(a*b^(2/3) &#8211; b^(5/3))*log(b^(2/3)*x^2 &#8211; b^(1/3)*x + 1)/b^2 &#8211; 1/3*(a*b^(2/3) &#8211; b^(5/3))*log((b^(1/3)*x + 1)/b^(1/3))/b^2</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Interesting examples deserving more study as Sympy uses the sum of the roots of a high order polynomial while Sage uses elementary special functions.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*x**n + 1)/(b*x**m + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*(n*x*x**n*gamma(n/m + 1/m)*lerchphi(b*x**m*exp_polar(I*pi), 1, n/m + 1/m)/(m**2*gamma(1 + n/m + 1/m)) + x*x**n*gamma(n/m + 1/m)*lerchphi(b*x**m*exp_polar(I*pi), 1, n/m + 1/m)/(m**2*gamma(1 + n/m + 1/m))) + x*gamma(1/m)*lerchphi(b*x**m*exp_polar(I*pi), 1, 1/m)/(m**2*gamma(1 + 1/m))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">5</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">a*m*integrate(x^n/((m &#8211; n &#8211; 1)*b^2*x^(2*m) + 2*(m &#8211; n &#8211; 1)*x^m*b + m &#8211; n &#8211; 1), x) &#8211; a*x^(n + 1)/((m &#8211; n &#8211; 1)*x^m*b + m &#8211; n &#8211; 1) + integrate(1/(x^m*b + 1), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy solves with special functions an integral that Sage cannot solve.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)</td>
<td style="background:#00FF00;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">a*x/b + RootSum(_t**5 + _t**3*(500*a**2*b**3 + 27*a**2 &#8211; 1000*a*b**4 &#8211; 54*a*b + 500*b**5 + 27*b**2)/(3125*b**6 + 108*b**3) + _t**2*(27*a**3 &#8211; 81*a**2*b + 81*a*b**2 &#8211; 27*b**3)/(3125*b**6 + 108*b**3) + _t*(9*a**4 &#8211; 36*a**3*b + 54*a**2*b**2 &#8211; 36*a*b**3 + 9*b**4)/(3125*b**6 + 108*b**3) + (a**5 &#8211; 5*a**4*b + 10*a**3*b**2 &#8211; 10*a**2*b**3 + 5*a*b**4 &#8211; b**5)/(3125*b**6 + 108*b**3), Lambda(_t, _t*log(x + (3662109375*_t**4*b**12 + 3986718750*_t**4*b**9 + 242757000*_t**4*b**6 + 3779136*_t**4*b**3 &#8211; 1054687500*_t**3*a*b**9 &#8211; 72900000*_t**3*a*b**6 &#8211; 1259712*_t**3*a*b**3 + 1054687500*_t**3*b**10 + 72900000*_t**3*b**7 + 1259712*_t**3*b**4 + 410156250*_t**2*a**2*b**9 + 655340625*_t**2*a**2*b**6 + 51267654*_t**2*a**2*b**3 + 944784*_t**2*a**2 &#8211; 820312500*_t**2*a*b**10 &#8211; 1310681250*_t**2*a*b**7 &#8211; 102535308*_t**2*a*b**4 &#8211; 1889568*_t**2*a*b + 410156250*_t**2*b**11 + 655340625*_t**2*b**8 + 51267654*_t**2*b**5 + 944784*_t**2*b**2 &#8211; 48828125*_t*a**3*b**9 &#8211; 186046875*_t*a**3*b**6 + 16774290*_t*a**3*b**3 + 629856*_t*a**3 + 146484375*_t*a**2*b**10 + 558140625*_t*a**2*b**7 &#8211; 50322870*_t*a**2*b**4 &#8211; 1889568*_t*a**2*b &#8211; 146484375*_t*a*b**11 &#8211; 558140625*_t*a*b**8 + 50322870*_t*a*b**5 + 1889568*_t*a*b**2 + 48828125*_t*b**12 + 186046875*_t*b**9 &#8211; 16774290*_t*b**6 &#8211; 629856*_t*b**3 &#8211; 2812500*a**4*b**6 + 3596400*a**4*b**3 + 104976*a**4 + 11250000*a**3*b**7 &#8211; 14385600*a**3*b**4 &#8211; 419904*a**3*b &#8211; 16875000*a**2*b**8 + 21578400*a**2*b**5 + 629856*a**2*b**2 + 11250000*a*b**9 &#8211; 14385600*a*b**6 &#8211; 419904*a*b**3 &#8211; 2812500*b**10 + 3596400*b**7 + 104976*b**4)/(9765625*a**4*b**8 + 26493750*a**4*b**5 + 746496*a**4*b**2 &#8211; 39062500*a**3*b**9 &#8211; 105975000*a**3*b**6 &#8211; 2985984*a**3*b**3 + 58593750*a**2*b**10 + 158962500*a**2*b**7 + 4478976*a**2*b**4 &#8211; 39062500*a*b**11 &#8211; 105975000*a*b**8 &#8211; 2985984*a*b**5 + 9765625*b**12 + 26493750*b**9 + 746496*b**6))))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">106</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">-(a &#8211; b)*integrate((x^3 + 1)/(b*x^5 + x^3 + 1), x)/b + a*x/b</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy solves with special functions an integral that Sage cannot solve.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">2*x*sqrt(1/x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">2*x*sqrt(1/x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/(x + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">2*x*sqrt(1/(x + 1)) + 2*sqrt(1/(x + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">2/sqrt(1/(x + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/(x**2 + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sqrt(1/(x**2 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">arcsinh(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sympy cannot solve this simple integral while Sage can.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/(x**3 + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sqrt(1/(x**3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">3</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt(1/(x^3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(x**(-n)/a)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-2*x*sqrt(1/a)*sqrt(x**(-n))/(n &#8211; 2)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">-2*x*sqrt(x^(-n)/a)/(n-2)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether the denominator is zero before solving.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/(a*x**n + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sqrt(1/(a*x**n + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">29</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt(1/(x^n*a + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(1/(a*x**b + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sqrt(1/(a*x**b + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">35</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt(1/(x^b*a + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(a*x**2/(b*x**2 + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">sqrt(a)*x*sqrt(x**2)*sqrt(1/(b*x**2 + 1)) + sqrt(a)*sqrt(x**2)*sqrt(1/(b*x**2 + 1))/(b*x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">2</td>
<td style="font-size:10pt;border-top:thin solid #000000;">(sqrt(a)*b*x^2 + sqrt(a))/(sqrt(b*x^2 + 1)*b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(a*x**3/(b*x**3 + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sqrt(a*x**3/(b*x**3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">7</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt(a*x^3/(b*x^3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt(a*x**n/(b*x**m + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">115</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt(x^n*a/(x^m*b + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt((a*x**2 + 1)/(b*x**2 + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">110</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt((a*x^2 + 1)/(b*x^2 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt((a*x**3 + 1)/(b*x**3 + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">109</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt((a*x^3 + 1)/(b*x^3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt((a*x**n + 1)/(b*x**m + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">114</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt((x^n*a + 1)/(x^m*b + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sqrt((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">104</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">integrate(sqrt((a*x^5 + x^3 + 1)/(b*x^5 + x^3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">x*log(x) &#8211; x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">x*log(x) &#8211; x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-x*log(x) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-x*log(x) + x</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/(x + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-x*log(x + 1) + x &#8211; log(x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-(x + 1)*log(x + 1) + x + 1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/(x**2 + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-x*log(x**2 + 1) + 2*x &#8211; 2*I*log(x + I) + I*log(x**2 + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">2</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-x*log(x^2 + 1) + 2*x &#8211; 2*arctan(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/(x**3 + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-x*log(x**3 + 1) + 3*x &#8211; 3*log(x + 1)/2 + sqrt(3)*I*log(x + 1)/2 + log(x**3 + 1)/2 &#8211; sqrt(3)*I*log(x**3 + 1)/2 + sqrt(3)*I*log(x &#8211; 1/2 &#8211; sqrt(3)*I/2)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">6</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-x*log(x^3 + 1) &#8211; sqrt(3)*arctan(1/3*(2*x &#8211; 1)*sqrt(3)) + 3*x &#8211; log(x + 1) + 1/2*log(x^2 &#8211; x + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(x**(-n)/a)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-n*x*log(x) + n*x &#8211; x*log(a)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">n*x + x*log(x^(-n)/a)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/(a*x**n + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(log(1/(a*x**n + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">68</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">n*x &#8211; n*integrate(1/(a*e^(n*log(x)) + 1), x) &#8211; x*log(x^n*a + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(1/(a*x**b + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">91</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">b*x &#8211; b*integrate(1/(a*e^(b*log(x)) + 1), x) &#8211; x*log(a*e^(b*log(x)) + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">2</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(a*x**2/(b*x**2 + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">x*log(a) + 2*x*log(x) &#8211; x*log(b*x**2 + 1) + 2*I*log(x &#8211; I*sqrt(1/b))/(b*sqrt(1/b)) &#8211; I*log(b*x**2 + 1)/(b*sqrt(1/b))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">10</td>
<td style="font-size:10pt;border-top:thin solid #000000;">x*log(a*x^2/(b*x^2 + 1)) &#8211; 2*arctan(sqrt(b)*x)/sqrt(b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(a*x**3/(b*x**3 + 1))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-216*b**4*x**6*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 216*(-1)**(2/3)*b**4*x**6*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 72*(-1)**(1/6)*sqrt(3)*b**4*x**6*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 72*sqrt(3)*I*b**4*x**6*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 588*b**2*x**5*(1/b)**(2/3)*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 1764*b**2*x**5*(1/b)**(2/3)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 588*b**2*x**5*(1/b)**(2/3)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 630*b**2*x**5*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 420*(-1)**(5/6)*sqrt(3)*b**2*x**5*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 210*sqrt(3)*I*b**2*x**5*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 981*b**2*x**3*(1/b)**(4/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 981*(-1)**(2/3)*b**2*x**3*(1/b)**(4/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 327*(-1)**(1/6)*sqrt(3)*b**2*x**3*(1/b)**(4/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 327*sqrt(3)*I*b**2*x**3*(1/b)**(4/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 135*b**2*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 135*(-1)**(2/3)*b**2*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 45*(-1)**(1/6)*sqrt(3)*b**2*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 45*sqrt(3)*I*b**2*(1/b)**(7/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 147*(-1)**(2/3)*b*x**4*log(a)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 49*(-1)**(1/6)*sqrt(3)*b*x**4*log(a)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 49*(-1)**(5/6)*sqrt(3)*b*x**4*log(a)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 147*(-1)**(1/3)*b*x**4*log(a)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 882*(-1)**(2/3)*b*x**4*log(a)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(1/6)*sqrt(3)*b*x**4*log(a)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(5/6)*sqrt(3)*b*x**4*log(a)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(1/3)*b*x**4*log(a)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(1/3)*b*x**4*log(a)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 98*(-1)**(5/6)*sqrt(3)*b*x**4*log(a)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 98*(-1)**(1/6)*sqrt(3)*b*x**4*log(a)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(2/3)*b*x**4*log(a)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 588*(-1)**(2/3)*b*x**4*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 1323*(-1)**(2/3)*b*x**4*log(x)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 441*(-1)**(1/6)*sqrt(3)*b*x**4*log(x)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 441*(-1)**(5/6)*sqrt(3)*b*x**4*log(x)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 1323*(-1)**(1/3)*b*x**4*log(x)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 882*(-1)**(1/3)*b*x**4*log(x)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(5/6)*sqrt(3)*b*x**4*log(x)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(1/6)*sqrt(3)*b*x**4*log(x)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(2/3)*b*x**4*log(x)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 882*(-1)**(1/3)*b*x**4*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(5/6)*sqrt(3)*b*x**4*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(1/6)*sqrt(3)*b*x**4*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(2/3)*b*x**4*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(5/6)*sqrt(3)*b*x**4*log(x &#8211; (-1)**(1/3)*(1/b)**(1/3))/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(1/3)*b*x**4*log(x &#8211; (-1)**(1/3)*(1/b)**(1/3))/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 147*(-1)**(2/3)*b*x**4*log(b*x**3 + 1)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 49*(-1)**(1/6)*sqrt(3)*b*x**4*log(b*x**3 + 1)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 49*(-1)**(5/6)*sqrt(3)*b*x**4*log(b*x**3 + 1)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 147*(-1)**(1/3)*b*x**4*log(b*x**3 + 1)**2/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 588*(-1)**(2/3)*b*x**4*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(1/6)*sqrt(3)*b*x**4*log(x &#8211; (-1)**(1/3)*sqrt(3)*I*(1/b)**(1/3)/2 + (-1)**(1/3)*(1/b)**(1/3)/2)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(2/3)*b*x**4*log(x &#8211; (-1)**(1/3)*sqrt(3)*I*(1/b)**(1/3)/2 + (-1)**(1/3)*(1/b)**(1/3)/2)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(2/3)*b*x**4/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 98*(-1)**(1/6)*sqrt(3)*b*x**4/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 98*(-1)**(5/6)*sqrt(3)*b*x**4/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(1/3)*b*x**4/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 588*b*x**2*(1/b)**(2/3)*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 1764*b*x**2*(1/b)**(2/3)*log(x)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 588*b*x**2*(1/b)**(2/3)*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 945*b*x**2*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 630*(-1)**(5/6)*sqrt(3)*b*x**2*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 315*sqrt(3)*I*b*x**2*(1/b)**(2/3)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 98*(-1)**(1/6)*sqrt(3)*x*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 98*(-1)**(5/6)*sqrt(3)*x*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(2/3)*x*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(1/3)*x*log(a)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 294*(-1)**(5/6)*sqrt(3)*x*log(x &#8211; (-1)**(1/3)*(1/b)**(1/3))/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(1/3)*x*log(x &#8211; (-1)**(1/3)*(1/b)**(1/3))/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(1/3)*x*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(2/3)*x*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 98*(-1)**(5/6)*sqrt(3)*x*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 98*(-1)**(1/6)*sqrt(3)*x*log(b*x**3 + 1)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) &#8211; 294*(-1)**(1/6)*sqrt(3)*x*log(x &#8211; (-1)**(1/3)*sqrt(3)*I*(1/b)**(1/3)/2 + (-1)**(1/3)*(1/b)**(1/3)/2)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3)) + 882*(-1)**(2/3)*x*log(x &#8211; (-1)**(1/3)*sqrt(3)*I*(1/b)**(1/3)/2 + (-1)**(1/3)*(1/b)**(1/3)/2)/(588*b**2*x**4*(1/b)**(2/3) + 588*b*x*(1/b)**(2/3))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">26</td>
<td style="font-size:10pt;border-top:thin solid #000000;">x*log(a*x^3/(b*x^3 + 1)) &#8211; 1/2*(2*sqrt(3)*a*arctan(1/3*(2*b^(2/3)*x &#8211; b^(1/3))*sqrt(3)/b^(1/3))/b^(1/3) &#8211; a*log(b^(2/3)*x^2 &#8211; b^(1/3)*x + 1)/b^(1/3) + 2*a*log((b^(1/3)*x + 1)/b^(1/3))/b^(1/3))/a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage simplifies better.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log(a*x**n/(b*x**m + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">96</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">(m &#8211; n + log(a))*x &#8211; m*integrate(1/(b*e^(m*log(x)) + 1), x) &#8211; x*log(x^m*b + 1) + x*log(x^n)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">2</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log((a*x**2 + 1)/(b*x**2 + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(log((a*x**2 + 1)/(b*x**2 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">72</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">x*log((a*x^2 + 1)/(b*x^2 + 1)) + 2*arctan(sqrt(a)*x)/sqrt(a) &#8211; 2*arctan(sqrt(b)*x)/sqrt(b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether `a` and `b` are positive and then returns an answer. Sympy fails irrespective of the assumptions.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log((a*x**3 + 1)/(b*x**3 + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">89</td>
<td style="background:#99CC00;font-size:10pt;border-top:thin solid #000000;">x*log((a*x^3 + 1)/(b*x^3 + 1)) + sqrt(3)*arctan(1/3*(2*a^(2/3)*x &#8211; a^(1/3))*sqrt(3)/a^(1/3))/a^(1/3) &#8211; sqrt(3)*arctan(1/3*(2*b^(2/3)*x &#8211; b^(1/3))*sqrt(3)/b^(1/3))/b^(1/3) &#8211; 1/2*log(a^(2/3)*x^2 &#8211; a^(1/3)*x + 1)/a^(1/3) + log((a^(1/3)*x + 1)/a^(1/3))/a^(1/3) + 1/2*log(b^(2/3)*x^2 &#8211; b^(1/3)*x + 1)/b^(1/3) &#8211; log((b^(1/3)*x + 1)/b^(1/3))/b^(1/3)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage asks whether `a` and `b` are positive and then returns an answer. Sympy fails irrespective of the assumptions.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log((a*x**n + 1)/(b*x**m + 1))</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">89</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">(m &#8211; n)*x &#8211; m*integrate(1/(b*e^(m*log(x)) + 1), x) + n*integrate(1/(x^n*a + 1), x) &#8211; x*log(x^m*b + 1) + x*log(x^n*a + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">4</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">log((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1))</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(log((a*x**5 + x**3 + 1)/(b*x**5 + x**3 + 1)), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">42</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;">-x*log(b*x^5 + x^3 + 1) + x*log(a*x^5 + x^3 + 1) &#8211; integrate((2*x^3 + 5)/(b*x^5 + x^3 + 1), x) + integrate((2*x^3 + 5)/(a*x^5 + x^3 + 1), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">When both Sage and Sympy fail, Sage is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sin(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-cos(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-cos(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sin(x)**n*cos(x)**m</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">102</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">No result</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">110</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sin(a*x)**n*cos(b*x)**m</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">81</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">No result</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">112</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/sin(x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">log(cos(x) &#8211; 1)/2 &#8211; log(cos(x) + 1)/2</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;">1/2*log(cos(x) &#8211; 1) &#8211; 1/2*log(cos(x) + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(sin(x) + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">-2/(tan(x/2) + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;">-2/(sin(x)/(cos(x) + 1) + 1)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(sin(x)**2 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">96</td>
<td style="font-size:10pt;border-top:thin solid #000000;">1/2*sqrt(2)*arctan(sqrt(2)*tan(x))</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage simply beats Sympy.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(sin(x)**3 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">87</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">Maxima: `quotient&#8217; by `zero&#8217;</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">78</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">sin(x)**(-n)/a</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(sin(x)**(-n)/a, x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">36</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">No result</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">227</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(a*sin(x)**n + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">98</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">Maxima: expt: undefined: 0 to a negative exponent.</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">1/(a*sin(x)**b + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">83</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">No result</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">140</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*sin(x)**2/(b*sin(x)**2 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">93</td>
<td style="font-size:10pt;border-top:thin solid #000000;">(x/b &#8211; arctan(sqrt(b + 1)*tan(x))/(sqrt(b + 1)*b))*a</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage simply beats Sympy.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*sin(x)**3/(b*sin(x)**3 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">82</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">No result</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">568</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">a*sin(x)**n/(b*sin(x)**m + 1)</td>
<td style="background:#33CCCC;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Integral(a*sin(x)**n/(b*sin(x)**m + 1), x)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">24</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;">Manual Interupt</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1527</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Both Sage and Sympy fail, however Sympy is quicker.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*sin(x)**2 + 1)/(b*sin(x)**2 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">98</td>
<td style="font-size:10pt;border-top:thin solid #000000;">a*x/b &#8211; (a &#8211; b)*arctan(sqrt(b + 1)*tan(x))/(sqrt(b + 1)*b)</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">0</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Sage simply beats Sympy.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*sin(x)**3 + 1)/(b*sin(x)**3 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">96</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;">Manual Interupt</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">203</td>
<td style="border-top:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;">(a*sin(x)**n + 1)/(b*sin(x)**m + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">83</td>
<td style="background:#FF00FF;font-size:10pt;border-top:thin solid #000000;">Maxima: expt: undefined: 0 to a negative exponent.</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">1</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-right:thin solid #000000;">Disgraceful failure by Sage.</td>
</tr>
<tr>
<td style="font-size:10pt;border-top:thin solid #000000;border-bottom:thin solid #000000;border-left:thin solid #000000;">(a*sin(x)**5 + sin(x)**3 + 1)/(b*sin(x)**5 + sin(x)**3 + 1)</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-bottom:thin solid #000000;border-left:thick double #000000;">Timeout</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-bottom:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">89</td>
<td style="background:#FF6600;font-size:10pt;border-top:thin solid #000000;border-bottom:thin solid #000000;">Manual Interupt</td>
<td style="font-size:10pt;border-top:thin solid #000000;border-bottom:thin solid #000000;border-left:thin solid #000000;border-right:thick double #000000;">142</td>
<td style="border-top:thin solid #000000;border-bottom:thin solid #000000;border-right:thin solid #000000;"></td>
</tr>
</tbody>
</table>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=561&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/10/25/sage-vs-sympy-integration/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Graph of the Relations between Objects in the diffgeom Module</title>
		<link>http://krastanov.wordpress.com/2012/08/08/graph-of-the-relations-between-objects-in-the-diffgeom-module/</link>
		<comments>http://krastanov.wordpress.com/2012/08/08/graph-of-the-relations-between-objects-in-the-diffgeom-module/#comments</comments>
		<pubDate>Wed, 08 Aug 2012 11:21:46 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[covariant derivative]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=555</guid>
		<description><![CDATA[This graph, besides showing naively in a rather simplistic way the structure of the theory of differential geometry (and most of what I have implemented in the diffgeom module), brings attention to the one non-trivial part of the module on which I have spent most of my time lately. Namely, implementing covariant derivatives. All directional [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=555&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://krastanov.files.wordpress.com/2012/08/painful_christoffel_symbols.png"><img class="aligncenter size-full wp-image-556" title="painful_christoffel_symbols" src="http://krastanov.files.wordpress.com/2012/08/painful_christoffel_symbols.png?w=600&#038;h=450" alt="" width="600" height="450" /></a></p>
<p>This graph, besides showing naively in a rather simplistic way the structure of the theory of differential geometry (and most of what I have implemented in the diffgeom module), brings attention to the one non-trivial part of the module on which I have spent most of my time lately. Namely, implementing covariant derivatives.</p>
<p>All directional derivatives are defined as a limiting procedure on a transport operator. Besides the Lie derivatives which use a certain transport operator that is easy to express in a coordinate free way, all other derivatives, called covariant derivatives have to be expressed using something called Christoffel symbols. And these are the ugly coordinate-dependent sources of pain, as the module structure becomes very cumbersome when such dependence must be accounted for. Thankfully, I think I have found a nice way to implement them in a new CovariantDerivativeOperator class on its own, that will contain all the logic in the same way in which the Base*Field classes do it. This will also require rewrite of the LieDerivative into a LieDerivativeOperator class.</p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=555&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/08/08/graph-of-the-relations-between-objects-in-the-diffgeom-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>

		<media:content url="http://krastanov.files.wordpress.com/2012/08/painful_christoffel_symbols.png" medium="image">
			<media:title type="html">painful_christoffel_symbols</media:title>
		</media:content>
	</item>
		<item>
		<title>The diffgeom Module &#8211; Status Report</title>
		<link>http://krastanov.wordpress.com/2012/08/02/the-diffgeom-module-status-report/</link>
		<comments>http://krastanov.wordpress.com/2012/08/02/the-diffgeom-module-status-report/#comments</comments>
		<pubDate>Wed, 01 Aug 2012 22:59:47 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=551</guid>
		<description><![CDATA[I have written already a few posts about the theory behind the module, the structure of the module, etc. However, besides some rare examples, I have not described in much details how the work progresses. So here is a short summary (check the git log for more details): The basics about coordinate systems and fields [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=551&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I have written already a few posts about the theory behind the module, the structure of the module, etc. However, besides some rare examples, I have not described in much details how the work progresses. So here is a short summary (check the git log for more details):</p>
<ul>
<li>The basics about coordinate systems and fields are already in. There are numerous issues with all the simplify-like algorithms inside SymPy, however they are slowly ironed out.</li>
<li>Some simplistic methods for work with integral curves are implemented.</li>
<li>The basics of tensor/wedge products are in. Many simplification routines can be added. Contraction between tensor products and vectors is possible (special case of &#8220;lowering of an index&#8221;).</li>
<li>Over-a-map, pushforwards and pullbacks are not implemented yet.</li>
<li>Instead of them I have focused my work on derivatives and curvature tensors. For the moment work on these can be done in a limited coordinate-dependent way. A longer post explaining the theory is coming and with it an implementation slightly less dependent on coordinates (working with Christoffel symbols is a pain).</li>
<li>Hodge star operator &#8211; still not implemented.</li>
</ul>
<p>An example that I want to implement is a theorem that in irrotational cosmology isotropy implies homogeneity. Doing this will be the first non-trivial example in this module.</p>
<p>A serendipitous detour from the project was my work on the differential equations solver. Aaron had implemented a very thorough solver for single equations. I had tried to extend it in a few simple ways in order to work with systems of ODEs and initial conditions. However this led me to Jordan forms of matrices, generalized eigenvectors and a bunch of interesting details on which I work in my free time (especially this week).</p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=551&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/08/02/the-diffgeom-module-status-report/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Адреси на Народните Представители &#8211; юли 2012</title>
		<link>http://krastanov.wordpress.com/2012/07/22/%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b8-%d0%bd%d0%b0-%d0%bd%d0%b0%d1%80%d0%be%d0%b4%d0%bd%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d0%b8-%d1%8e%d0%bb/</link>
		<comments>http://krastanov.wordpress.com/2012/07/22/%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b8-%d0%bd%d0%b0-%d0%bd%d0%b0%d1%80%d0%be%d0%b4%d0%bd%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d0%b8-%d1%8e%d0%bb/#comments</comments>
		<pubDate>Sun, 22 Jul 2012 17:02:38 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[blah blah]]></category>
		<category><![CDATA[адреси за контакт]]></category>
		<category><![CDATA[демокрация]]></category>
		<category><![CDATA[народни представители]]></category>
		<category><![CDATA[народно събрание]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=535</guid>
		<description><![CDATA[[Добавка: 30 октомври] Обновен списък и много друга информация можете да намерите на http://www.parlamentaren-kontrol.com/mails.html &#160; За всяка демокрация е важно гражданите лесно да могат да се свържат с избранниците си. Ние трябва да влияем на народните представители не само когато ги избираме. През целият им мандат трябва да посочваме остро когато сме разочаровани от глупави [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=535&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>[Добавка: 30 октомври] Обновен списък и много друга информация можете да намерите на <a title="Парламентарен Контрол" href="http://www.parlamentaren-kontrol.com/mails.html">http://www.parlamentaren-kontrol.com/mails.html</a></p>
<p>&nbsp;</p>
<p>За всяка демокрация е важно гражданите лесно да могат да се свържат с избранниците си. Ние трябва да влияем на народните представители не само когато ги избираме. През целият им мандат трябва да посочваме остро когато сме разочаровани от глупави действия. Също така е важно да посочваме на работливите и примерни депутати, че оценяваме когато се опълчват на глупави решения.</p>
<p>За жалост <a href="http://parliament.bg/" target="_blank">сайтът на парламента</a> не дава списък с адресите на депутатите. Всеки адрес трябва отделно да се прочита от различна страница. Тук давам списък с всички тези адреси събрани чрез скрипт, който ще споделя по-долу.</p>
<p>Ако се питате за каква добра кауза може да ползвате този списък днес, знайте че ще е полезно да изразите острото си несъгласие с идиотския начин, по който <a href="http://www.cross.bg/1314411" target="_blank">ГЕРБ погребва математическите гимназии</a> в момента.</p>
<p>ГЕРБ 39.70%</p>
<blockquote><p>peter.petrov@parliament.bg, yordan.andonov@parliament.bg, valentin.mikev@parliament.bg, v.mikev@abv.bg, vladimir.toshev@parliament.bg, vtoshev@gmail.com, hristo.hristov@parliament.bg, daniela.petrova@parliament.bg, hristina.yancheva@parliament.bg, krasimir.tsipov@parliament.bg, plamen.roussev@parliament.bg, stefan.gospodinov@parliament.bg, teodora.georgieva@parliament.bg, stefan.dedev@parliament.bg, antoniy.yordanov@parliament.bg, dimitar.lazarov@parliament.bg, georgi.plachkov@parliament.bg, katya.koleva@parliament.bg, nedyalko.slavov@parliament.bg, daniel.georgiev@parliament.bg, cem_dimitrova@abv.bg, ivelin.nikolov@parliament.bg, iliya.pashev@parliament.bg, emil.dimitrov@parliament.bg, nikolay.petkov@parliament.bg, evgeni.stoev@parliament.bg, svetomir.mihaylov@parliament.bg, stanka.shaylekova@parliament.bg, ralitsa.todorova@parliament.bg, stefani.mihaylova@parliament.bg, vesselin.davidov@parliament.bg, katya.chalakova@parliament.bg, r.stoilov@parliament.bg, velichka.shopova@parliament.bg, dimitar.atanasov@parliament.bg, boris.grozdanov@parliament.bg, vladislav.dimitrov@parliament.bg, galina.mileva@parliament.bg, s.tanchev@parliament.bg, p.daskalov@parliament.bg, dimitar.avramov@parliament.bg, monika.panayotova@parliament.bg, diana.yordanova@parliament.bg, angel.daskalov@parliament.bg, zoya.georgieva@parliament.bg, dzhema.grozdanova@parliament.bg, emanouela.spassova@parliament.bg, lyubomila.stanislavova@nt52.parliament.bg, fani.hristova@parliament.bg, aleksandar.nenkov@parliament.bg, todor.dimitrov@parliament.bg, ivaylo.toshev@parliament.bg, ivan.valkov@parliament.bg, emil.radev@parliament.bg, krasimir.velchev@parliament.bg, z.todorov@parliament.bg, vyara.petrova@parliament.bg, dimitar.boychev@parliament.bg, dobroslav.dimitrov@parliament.bg, ivan.petrov@parliament.bg, plamen.nunev@parliament.bg, s.dukova@parliament.bg, anastas.anastasov@parliament.bg, tsveta.karayancheva@parliament.bg, cveta_@abv.bg, dimitar.glavchev@parliament.bg, svetlana.angelova@parliament.bg, tsvetan.sichanov@parliament.bg, menda.stoyanova@parliament.bg, LachezarBogomilov@parliament.bg, r.danev@parliament.bg, kiril.kalfin@parliament.bg, nikolay.rashev@parliament.bg, stanislav.ivanov@parliament.bg, petko.petkov@parliament.bg, v.angelov@parliament.bg, vanya.doneva@parliament.bg, kostadin.yazov@parliament.bg, stoyan.gyuzelev@parliament.bg, fidosova@gbg.bg, georgi.andonov@parliament.bg, ivan.kolev@parliament.bg, krasimir.petrov@parliament.bg, genoveva.aleksieva@parliament.bg, svetoslav.nedelchev@parliament.bg, emil.karanikolov@parliament.bg, asparuh.stamenov@parliament.bg, tsvetomir.mihov@parliament.bg, nikolay.kostadinov@parliament.bg, pavel.dimitrov@parliament.bg, lili.boyanova@parliament.bg, ginche.karaminova@parliament.bg, miroslav.petkov@parliament.bg, ioana.kirova@parliament.bg, ivan.bozhilov@parliament.bg, silviya.hubenova@parliament.bg, svetoslav.tonchev@parliament.bg, Predsedatel@parliament.bg, l.tatarski@parliament.bg, yanko.ivanov@parliament.bg, galina.bankovska@parliament.bg, daniela.mitkova@parliament.bg, yuliana.koleva@parliament.bg, emil.gushterov@parliament.bg, anatoliy.yordanov@parliament.bg, ivan.ivanov@parliament.bg, krasimira.simeonova@parliament.bg, daniela.daritkova@parliament.bg, mitko.zahov@parliament.bg, dian.chervenkondev@parliament.bg, i.sokolova@parliament.bg, liliya.hristova@parliament.bg, plamen.tachev@parliament.bg, neli.kalneva@parliament.bg, neli_iva@abv.bg, aleksandar.stoykov@parliament.bg, a.krustev@parliament.bg, desislava.taneva@parliament.bg</p></blockquote>
<p>&#8220;Коалиция за България&#8221; 17.70%</p>
<blockquote><p>asen.gagauzov@parliament.bg, spas.panchev@parliament.bg, rumen.petkov@parliament.bg, dragomir.stoynev@parliament.bg, e.maslarova@parliament.bg, Takorov@parliament.bg, m.hristova@parliament.bg, boyko.velikov@parliament.bg, kiril.dobrev@parliament.bg, i.nikolov@parliament.bg, a.radoslavov@parliament.bg, dimitar.gorov@parliament.bg, dimcho.mihalevski@parliament.bg, ganastasov@parliament.bg, dimitar.dabov@parliament.bg, kornesov@parliament.bg, rumen.ovcharov@parliament.bg, G.Pirinski@parliament.bg, stanishev@parliament.bg, petar.mutafchiev@parliament.bg, anaydenov@parliament.bg, , atanas.merdjanov@parliament.bg, evgeniy.zhelev@parliament.bg, georgi.petarneychev@parliament.bg, a.pantev@parliament.bg, z.georgiev@parliament.bg, P.Oresharski@parliament.bg, anton.kutev@parliament.bg, korneliya.ninova@parliament.bg, pkouroumbashev@parliament.bg, P.Atanasov@parliament.bg, p.dimitrov@parliament.bg, valentina.bogdanova@parliament.bg, yanaki.stoilov@parliament.bg, gbojinov@parliament.bg, mmikov@nt52.parliament.bg, Prof.St.Danailov@parliament.bg</p></blockquote>
<p>ДПС &#8220;Движение за права и свободи&#8221; 14.50%</p>
<blockquote><p>korman@parliament.bg, r.atalay@parliament.bg, n.sahlim@parliament.bg, elin.andreev@parliament.bg, gyunay.sefer@parliament.bg, H.Hadjihasan@parliament.bg, jordan.tsonev@parliament.bg, G.Serbest@parliament.bg, lyutvi.mestan@parliament.bg, n.ali@parliament.bg,nedzhmi.ali@parliament.bg, remzi.osman@parliament.bg, yanko.yankov@parliament.bg, ahmed.dogan@parliament.bg, emil.ivanov@parliament.bg, musa.palev@parliament.bg, arif.agush@parliament.bg, kamen.kostadinov@parliament.bg, h.bisserov@parliament.bg, ademov@parliament.bg, U.Tasim@parliament.bg, t.naimov@parliament.bg, belgin@parliament.bg, kasim.dal@parliament.bg, i.mihailova@parliament.bg, mithat.metin@parliament.bg, hamid.hamid@parliament.bg, DMustafa@parliament.bg, delyan.peevski@parliament.bg, emel.etem@parliament.bg, younal.loutfi@parliament.bg, djevdet.chakarov@parliament.bg, erdoan.ahmedov@parliament.bg, a.imamov@parliament.bg, Kardjaliev@parliament.bg, p.raeva@parliament.bg, tab61@parliament.bg</p></blockquote>
<p>Партия &#8220;Атака&#8221; 9.36%</p>
<blockquote><p>lyubomir.vladimirov@parliament.bg, kamen.petkov@parliament.bg, pavel.shopov@parliament.bg, ognyan.peychev@parliament.bg, stanislav.stanilov@parliament.bg, pehlivanov@parliament.bg, ognian.tetimov@parliament.bg, dgajeva@abv.bg,denitsa.gadjeva@parliament.bg, kalina.krumova@parliament.bg, stoyan.ivanov@parliament.bg, stoichkov@parliament.bg, volen.siderov@parliament.bg, ventsislav.lakov@parliament.bg,  vencilakov@abv.bg, tsveta.georgieva@parliament.bg, dimitar.karbov@parliament.bg, b.stoyanov@parliament.bg, valentin.ivanov@parliament.bg, D.Chukolov@parliament.bg, yavor.notev@parliament.bg, kiril.gumnerov@parliament.bg</p></blockquote>
<p>&#8220;Синята коалиция&#8221; 6.76%</p>
<blockquote><p>e.michaylova@parliament.bg, jordan.bakalow@parliament.bg, l.toshev@parliament.bg, kdimitrov@parliament.bg, veselin.metodiev@parliament.bg, tsvetan.kostov@parliament.bg, dimitrovmartin@parliament.bg, dimo.gyaurov@parliament.bg, ivan.n.ivanov@parliament.bg, m.mihaylov@parliament.bg, Agov@parliament.bg, lyubomir.ivanov@parliament.bg, ivan.kostov@parliament.bg, dsb@nt14.parliament.bg</p></blockquote>
<p>&#8220;Ред, законност и справедливост&#8221; 4.13%</p>
<blockquote><p>e.vasilev@parliament.bg, m.tagarinski@parliament.bg, b.petrova@parliament.bg, t.velikov@parliament.bg, georgi.terziyski@parliament.bg, k.petrova@parliament.bg, d.matov@parliament.bg, d.kolev@parliament.bg, yanev@parliament.bg, y.yanev@parliament.bg</p></blockquote>
<h4>За обновяване на адресите</h4>
<p>Прост и чуплив скрипт за събиране на адресите:</p>
<p>Първо събери идентификационните номера на депутатите (във файла indices)</p>
<pre class="brush: plain; title: ; notranslate">curl http://www.parliament.bg/bg/MP | grep &quot;&gt;Информация&quot; | sort | cut -d'&quot;' -f6 | cut -d'/' -f4 | sort -n &gt; indices</pre>
<p>След това свали адресите им</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
import urllib
import xmltodict
import xml
import re

indices = open('indices').readlines()
dicts = []
force_file = open('force', 'w')
mail_file = open('mail', 'w')

for i in indices:
    xml_str = urllib.urlopen('http://www.parliament.bg/export.php/bg/xml/MP/'+i)
    try:
        r = xmltodict.parse(xml_str)
        force = r['schema']['Profile']['PoliticalForce']['@value']
        mail = r['schema']['Profile']['E-mail']['@value']
        force_file.write(force.encode('UTF-8'))
        force_file.write('\n')
        force_file.flush()
        mail_file.write(mail.encode('UTF-8'))
        mail_file.write('\n')
        mail_file.flush()
    except xml.parsers.expat.ExpatError:
        pass

force_file.close()
mail_file.close()
force_file = open('force', 'r')
mail_file = open('mail', 'r')

forces_list = force_file.readlines()
forces_set = set(forces_list)
mails_list = mail_file.readlines()
mails_dict = dict(zip(mails_list, forces_list))

c = 0
for f in forces_set:
    mails = [k for k, v in mails_dict.items() if v==f]
    string = ', '.join(m.strip() for m in mails)
    string = re.sub(';', ', ', string)
    string = re.sub(':', ', ', string)
    dump = open('dump%d'%c, 'w')
    dump.write(f)
    dump.write('\n')
    dump.write(string)
    dump.close()
    c += 1
</pre>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=535&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/22/%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b8-%d0%bd%d0%b0-%d0%bd%d0%b0%d1%80%d0%be%d0%b4%d0%bd%d0%b8%d1%82%d0%b5-%d0%bf%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d0%b5%d0%bb%d0%b8-%d1%8e%d0%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Form Fields and Vector Fields do not form a Vector Space</title>
		<link>http://krastanov.wordpress.com/2012/07/22/form-fields-and-vector-fields-do-not-form-a-vector-space/</link>
		<comments>http://krastanov.wordpress.com/2012/07/22/form-fields-and-vector-fields-do-not-form-a-vector-space/#comments</comments>
		<pubDate>Sun, 22 Jul 2012 15:11:31 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=464</guid>
		<description><![CDATA[Form fields or vector fields over a manifold (as opposed to forms and vectors) do not form a vector space. They form a module. The difference is that the scalars of a vector space form an algebraic field while the scalars of a module form a ring. For us humans (as opposed to &#8220;those higher [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=464&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Tautological_one-form" target="_blank">Form fields</a> or <a href="http://en.wikipedia.org/wiki/Tangent_bundle#Canonical_vector_field_on_tangent_bundle" target="_blank">vector fields</a> over a <a href="http://en.wikipedia.org/wiki/Manifold" target="_blank">manifold</a> (as opposed to forms and vectors) do not form a <a href="http://en.wikipedia.org/wiki/Vector_space" target="_blank">vector space</a>. They form a <a href="http://en.wikipedia.org/wiki/Module_%28mathematics%29" target="_blank">module</a>.</p>
<p>The difference is that the scalars of a vector space form an algebraic <a href="http://en.wikipedia.org/wiki/Field_%28mathematics%29" target="_blank">field</a> while the scalars of a module form a <a href="http://en.wikipedia.org/wiki/Ring_%28mathematics%29" target="_blank">ring</a>. For us humans (as opposed to &#8220;those higher beings that I do not understand (a.k.a. mathematicians)&#8221;) this means that the scalars in the vector field can divide each other while the scalars in the spaces spanned by fields (i.e. a module) can not.</p>
<p>And just so we all can become even more confused: This has nothing to do with the fact that the &#8220;components&#8221; of each form field or vector field in certain basis are functions, i.e. themselves elements of a vector space with infinite number of dimensions.</p>
<p>The first way to see this module-not-a-vector-space characteristic is by showing directly that the scalars that form the &#8220;coordinate components&#8221; of a vector field can not always be divided, even if they are <strong>not</strong> identically zero. Take, for instance the, manifold <img src='http://s0.wp.com/latex.php?latex=%5Cmathbb%7BR%7D%5E2&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;mathbb{R}^2' title='&#92;mathbb{R}^2' class='latex' /> with the polar coordinate system and look at the vector <img src='http://s0.wp.com/latex.php?latex=%5Cbegin%7Bbmatrix%7D+r+%5C%5C+r%5Ccos%28%5Ctheta%29+%5Cend%7Bbmatrix%7D&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;begin{bmatrix} r &#92;&#92; r&#92;cos(&#92;theta) &#92;end{bmatrix}' title='&#92;begin{bmatrix} r &#92;&#92; r&#92;cos(&#92;theta) &#92;end{bmatrix}' class='latex' />. The &#8220;scalars&#8221; are <img src='http://s0.wp.com/latex.php?latex=r&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='r' title='r' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=r%5Ccos%28%5Ctheta%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='r&#92;cos(&#92;theta)' title='r&#92;cos(&#92;theta)' class='latex' />. Obviously we can not divide the former by the latter because it will be undefined at <img src='http://s0.wp.com/latex.php?latex=%5Ctheta%3D%5Cfrac%7B%5Cpi%7D%7B2%7D%2Bn%5Cpi&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;theta=&#92;frac{&#92;pi}{2}+n&#92;pi' title='&#92;theta=&#92;frac{&#92;pi}{2}+n&#92;pi' class='latex' />.</p>
<p>Another, more amusing way to show that the space spanned by these fields is not a vector space is to explicitly show that a property expected from vector spaces is not fulfilled. Namely, that in <img src='http://s0.wp.com/latex.php?latex=n&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='n' title='n' class='latex' /> dimensions an <img src='http://s0.wp.com/latex.php?latex=n&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='n' title='n' class='latex' />-uple of linearly independent elements forms a basis. However, in the case of fields over a manifold we can easily have a number of fields that are linearly independent over the manifold as a whole, and are at the same time linearly dependent (or simply equal to zero) on a subdomain. Hence, we have an <img src='http://s0.wp.com/latex.php?latex=n&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='n' title='n' class='latex' />-uple of linearly independent fields that can not be linearly combined to represent another arbitrary field.</p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=464&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/22/form-fields-and-vector-fields-do-not-form-a-vector-space/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Objects Implemented in the diffgeom Module</title>
		<link>http://krastanov.wordpress.com/2012/07/22/objects-implemented-in-the-diffgeom-module/</link>
		<comments>http://krastanov.wordpress.com/2012/07/22/objects-implemented-in-the-diffgeom-module/#comments</comments>
		<pubDate>Sun, 22 Jul 2012 15:05:08 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=475</guid>
		<description><![CDATA[This post provides a summary of all mathematical types of expression implemented in the diffgeom module. I have chosen not to mention any python classes or other implementation details at all. This table shows how an object expected by the user to be of certain mathematical type operates on another object. If the expectations of [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=475&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This post provides a summary of all mathematical types of expression implemented in the diffgeom module. I have chosen not to mention any python classes or other implementation details at all. This table shows how an object expected by the user to be of certain mathematical type operates on another object. If the expectations of a user familiar with differential geometry do not meet the actual implementation, this is a bug in the implementation.</p>
<table summary="" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th rowspan="2" colspan="2"></th>
<th colspan="5">The Argument</th>
</tr>
<tr>
<td>point</td>
<td>scalar field</td>
<td>vector field</td>
<td>1-form field</td>
<td>higher form field</td>
</tr>
<tr>
<th rowspan="10">The Operator</th>
<td>scalar field</td>
<td>scalar</td>
<td>NA</td>
<td>NA</td>
<td>NA</td>
<td>NA</td>
</tr>
<tr>
<td>vector field</td>
<td>NA</td>
<td>scalar field</td>
<td>NA</td>
<td>NA</td>
<td>NA</td>
</tr>
<tr>
<td>1-form field (linear combination of differentials of scalar fields)</td>
<td>NA</td>
<td>NA</td>
<td>scalar field</td>
<td>NA</td>
<td>NA</td>
</tr>
<tr>
<td>higher form field (linear combination of tensor products of lower form fields)</td>
<td>NA</td>
<td>NA</td>
<td>it takes a tuple of vector fields and returns a scalar field</td>
<td>NA</td>
<td>NA</td>
</tr>
<tr>
<td>commutator of vector fields</td>
<td colspan="5">Behaves as a regular vector field.</td>
</tr>
<tr>
<td>Lie derivative (the argument is &#8220;called&#8221; on construction time)</td>
<td>NA</td>
<td colspan="4">You specify the object to be derived on creation. The Lie derivative of any object is an object of the same type.</td>
</tr>
</tbody>
</table>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=475&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/22/objects-implemented-in-the-diffgeom-module/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>The Schwarzschild Solution</title>
		<link>http://krastanov.wordpress.com/2012/07/22/the-schwarzschild-solution/</link>
		<comments>http://krastanov.wordpress.com/2012/07/22/the-schwarzschild-solution/#comments</comments>
		<pubDate>Sun, 22 Jul 2012 13:36:44 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[general relativity]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[Schwarzschild]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=524</guid>
		<description><![CDATA[An &#8220;easy&#8221; solution to the Einstein equation (in free space) is the spherically symmetric Schwarzschild solution. The pdf bellow shows how one can use the diffgeom module in order to get the equations describing this solution. One starts with the most general spherically symmetrical metric and by using Einstein equation deduces the equations that must [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=524&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>An &#8220;easy&#8221; solution to the Einstein equation (in free space) is the spherically symmetric Schwarzschild solution. The pdf bellow shows how one can use the diffgeom module in order to get the equations describing this solution.</p>
<p>One starts with the most general spherically symmetrical metric and by using Einstein equation <img src='http://s0.wp.com/latex.php?latex=R_%7B%5Cmu+%5Cnu%7D%3D0&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='R_{&#92;mu &#92;nu}=0' title='R_{&#92;mu &#92;nu}=0' class='latex' /> deduces the equations that must be fulfilled by the components of the metric (in the chosen basis).</p>
<p><a href="http://krastanov.files.wordpress.com/2012/07/schwarzschild.pdf">schwarzschild.pdf</a></p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=524&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/22/the-schwarzschild-solution/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Tensor vs Tensor Field, Basis vs Coordinate System</title>
		<link>http://krastanov.wordpress.com/2012/07/09/tensor-vs-tensor-field-basis-vs-coordinate-system/</link>
		<comments>http://krastanov.wordpress.com/2012/07/09/tensor-vs-tensor-field-basis-vs-coordinate-system/#comments</comments>
		<pubDate>Sun, 08 Jul 2012 22:50:51 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[математика]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=447</guid>
		<description><![CDATA[In most of my posts that discuss the SymPy diffgeom module I do not try to make a distinction between a tensor and a tensor field, as it is usually obvious from the context. However, it would be nice to spell it out at least once. I have two favorite ways to define a tensor/tensor [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=447&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In most of my posts that discuss the SymPy diffgeom module I do not try to make a distinction between a tensor and a tensor field, as it is usually obvious from the context. However, it would be nice to spell it out at least once.</p>
<p>I have two favorite ways to define a tensor/tensor field: either as an object with a representation (in the form of a multidimensional array) that transforms in a precise way when one switches from one basis to another, or instead as (sum of) tensor products of some vectors and 1-forms (i.e. an element of some tensor product of the vector space and its dual).</p>
<h3>In Terms of Transformation Rules</h3>
<p>With regard to the first definition, Wikipedia has this to say:</p>
<blockquote><p>A tensor of type (n, m−n) is an assignment of a multidimensional array <img src='http://s0.wp.com/latex.php?latex=T%5E%7Bi_1%5Cdots+i_n%7D_%7Bi_%7Bn%2B1%7D%5Cdots+i_m%7D%5B%5Cmathbf%7Bf%7D%5D+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='T^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}[&#92;mathbf{f}] ' title='T^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}[&#92;mathbf{f}] ' class='latex' /> to each basis <img src='http://s0.wp.com/latex.php?latex=f+%3D+%28e_1%2C...%2Ce_N%29+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='f = (e_1,...,e_N) ' title='f = (e_1,...,e_N) ' class='latex' /> such that, if we apply the change of basis <img src='http://s0.wp.com/latex.php?latex=%5Cmathbf%7Bf%7D%5Cmapsto+%5Cmathbf%7Bf%7D%5Ccdot+R+%3D+%5Cleft%28+R_1%5Ei+%5Cmathbf%7Be%7D_i%2C+%5Cdots%2C+R_N%5Ei%5Cmathbf%7Be%7D_i%5Cright%29+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;mathbf{f}&#92;mapsto &#92;mathbf{f}&#92;cdot R = &#92;left( R_1^i &#92;mathbf{e}_i, &#92;dots, R_N^i&#92;mathbf{e}_i&#92;right) ' title='&#92;mathbf{f}&#92;mapsto &#92;mathbf{f}&#92;cdot R = &#92;left( R_1^i &#92;mathbf{e}_i, &#92;dots, R_N^i&#92;mathbf{e}_i&#92;right) ' class='latex' /> then the multidimensional array obeys the transformation law <img src='http://s0.wp.com/latex.php?latex=T%5E%7Bi_1%5Cdots+i_n%7D_%7Bi_%7Bn%2B1%7D%5Cdots+i_m%7D%5B%5Cmathbf%7Bf%7D%5Ccdot+R%5D+%3D+%28R%5E%7B-1%7D%29%5E%7Bi_1%7D_%7Bj_1%7D%5Ccdots%28R%5E%7B-1%7D%29%5E%7Bi_n%7D_%7Bj_n%7D+R%5E%7Bj_%7Bn%2B1%7D%7D_%7Bi_%7Bn%2B1%7D%7D%5Ccdots+R%5E%7Bj_%7Bm%7D%7D_%7Bi_%7Bm%7D%7DT%5E%7Bj_1%2C%5Cldots%2Cj_n%7D_%7Bj_%7Bn%2B1%7D%2C%5Cldots%2Cj_m%7D%5B%5Cmathbf%7Bf%7D%5D+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='T^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}[&#92;mathbf{f}&#92;cdot R] = (R^{-1})^{i_1}_{j_1}&#92;cdots(R^{-1})^{i_n}_{j_n} R^{j_{n+1}}_{i_{n+1}}&#92;cdots R^{j_{m}}_{i_{m}}T^{j_1,&#92;ldots,j_n}_{j_{n+1},&#92;ldots,j_m}[&#92;mathbf{f}] ' title='T^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}[&#92;mathbf{f}&#92;cdot R] = (R^{-1})^{i_1}_{j_1}&#92;cdots(R^{-1})^{i_n}_{j_n} R^{j_{n+1}}_{i_{n+1}}&#92;cdots R^{j_{m}}_{i_{m}}T^{j_1,&#92;ldots,j_n}_{j_{n+1},&#92;ldots,j_m}[&#92;mathbf{f}] ' class='latex' />.</p></blockquote>
<p>A tensor field then is a way to map a tensor to each point of a manifold (the tensor is wrt the tangent space at that point).</p>
<p>When we switch from tensors to tensor fields a new object becomes important: the coordinate system. Before proceeding, one must know what a manifold and a tangent space mean. Then we can illuminate the relation between what one calls a &#8220;basis&#8221; when speaking about tensors and the &#8220;coordinate system&#8221; in the context of tensor fields. Firstly, a coordinate system gives a way to continuously map a tuple of numbers to a point on the manifold. This continuous map is what physicist love to work with (Cartesian or polar coordinates for instance). The nice thing is that each coordinate system brings with itself a canonical basis for each point of the manifold.</p>
<p>What can be confusing, is that the basis can change from point to point. For example, one can take the <img src='http://s0.wp.com/latex.php?latex=R%5E2&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='R^2' title='R^2' class='latex' /> manifold that has <img src='http://s0.wp.com/latex.php?latex=R%5E2&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='R^2' title='R^2' class='latex' /> as its tangent space. Take for instance two points <img src='http://s0.wp.com/latex.php?latex=%28x%3D1%2C+y%3D0%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='(x=1, y=0)' title='(x=1, y=0)' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=%28x%3D0%2C+y%3D1%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='(x=0, y=1)' title='(x=0, y=1)' class='latex' />. The basis vectors in the Cartesian coordinate system are the same for both points: <img src='http://s0.wp.com/latex.php?latex=%28e_x%2C+e_y%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='(e_x, e_y)' title='(e_x, e_y)' class='latex' />. However in the polar coordinate system the basis vectors for the first point are <img src='http://s0.wp.com/latex.php?latex=%28e_x%2C+e_y%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='(e_x, e_y)' title='(e_x, e_y)' class='latex' /> and <img src='http://s0.wp.com/latex.php?latex=%28e_y%2C+-e_x%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='(e_y, -e_x)' title='(e_y, -e_x)' class='latex' /> for the second point.</p>
<p>Anyway, the only thing that changes in the definition, is that the change-of-basis matrix mentioned above now depends on the coordinate systems.</p>
<blockquote><p><img src='http://s0.wp.com/latex.php?latex=%5Chat%7BT%7D%5E%7Bi_1%5Cdots+i_n%7D_%7Bi_%7Bn%2B1%7D%5Cdots+i_m%7D%28%5Cbar%7Bx%7D_1%2C%5Cldots%2C%5Cbar%7Bx%7D_k%29+%3D++%5Cfrac%7B%5Cpartial+%5Cbar%7Bx%7D%5E%7Bi_1%7D%7D%7B%5Cpartial+x%5E%7Bj_1%7D%7D++%5Ccdots++%5Cfrac%7B%5Cpartial+%5Cbar%7Bx%7D%5E%7Bi_n%7D%7D%7B%5Cpartial+x%5E%7Bj_n%7D%7D++%5Cfrac%7B%5Cpartial+x%5E%7Bj_%7Bn%2B1%7D%7D%7D%7B%5Cpartial+%5Cbar%7Bx%7D%5E%7Bi_%7Bn%2B1%7D%7D%7D++%5Ccdots++%5Cfrac%7B%5Cpartial+x%5E%7Bj_m%7D%7D%7B%5Cpartial+%5Cbar%7Bx%7D%5E%7Bi_m%7D%7D++T%5E%7Bj_1%5Cdots+j_n%7D_%7Bj_%7Bn%2B1%7D%5Cdots+j_m%7D%28x_1%2C%5Cldots%2Cx_k%29+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;hat{T}^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}(&#92;bar{x}_1,&#92;ldots,&#92;bar{x}_k) =  &#92;frac{&#92;partial &#92;bar{x}^{i_1}}{&#92;partial x^{j_1}}  &#92;cdots  &#92;frac{&#92;partial &#92;bar{x}^{i_n}}{&#92;partial x^{j_n}}  &#92;frac{&#92;partial x^{j_{n+1}}}{&#92;partial &#92;bar{x}^{i_{n+1}}}  &#92;cdots  &#92;frac{&#92;partial x^{j_m}}{&#92;partial &#92;bar{x}^{i_m}}  T^{j_1&#92;dots j_n}_{j_{n+1}&#92;dots j_m}(x_1,&#92;ldots,x_k) ' title='&#92;hat{T}^{i_1&#92;dots i_n}_{i_{n+1}&#92;dots i_m}(&#92;bar{x}_1,&#92;ldots,&#92;bar{x}_k) =  &#92;frac{&#92;partial &#92;bar{x}^{i_1}}{&#92;partial x^{j_1}}  &#92;cdots  &#92;frac{&#92;partial &#92;bar{x}^{i_n}}{&#92;partial x^{j_n}}  &#92;frac{&#92;partial x^{j_{n+1}}}{&#92;partial &#92;bar{x}^{i_{n+1}}}  &#92;cdots  &#92;frac{&#92;partial x^{j_m}}{&#92;partial &#92;bar{x}^{i_m}}  T^{j_1&#92;dots j_n}_{j_{n+1}&#92;dots j_m}(x_1,&#92;ldots,x_k) ' class='latex' /></p></blockquote>
<h3>In Terms of Tensor Products</h3>
<p>I prefer this definition, as it relies on the geometrical meaning of vectors and forms. According to Wikipedia, one can express it as:</p>
<blockquote><p>A type (n, m) tensor T is defined as a map <img src='http://s0.wp.com/latex.php?latex=T%3A+%5Cunderbrace%7B+V%5E%2A+%5Ctimes%5Cdots%5Ctimes+V%5E%2A%7D_%7Bn+%5Ctext%7B+copies%7D%7D+%5Ctimes+%5Cunderbrace%7B+V+%5Ctimes%5Cdots%5Ctimes+V%7D_%7Bm+%5Ctext%7B+copies%7D%7D+%5Crightarrow+%5Cmathbf%7BR%7D+&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='T: &#92;underbrace{ V^* &#92;times&#92;dots&#92;times V^*}_{n &#92;text{ copies}} &#92;times &#92;underbrace{ V &#92;times&#92;dots&#92;times V}_{m &#92;text{ copies}} &#92;rightarrow &#92;mathbf{R} ' title='T: &#92;underbrace{ V^* &#92;times&#92;dots&#92;times V^*}_{n &#92;text{ copies}} &#92;times &#92;underbrace{ V &#92;times&#92;dots&#92;times V}_{m &#92;text{ copies}} &#92;rightarrow &#92;mathbf{R} ' class='latex' />, where V is a vector space and V* is the corresponding dual space of covectors, which is linear in each of its arguments.</p></blockquote>
<p>One can again try to translate this to the case of tensor fields. The straightforward way is just to say that this map is parametrized, thus it depends on which point on the manifold it is evaluated.</p>
<p>However, a more &#8220;geometrical&#8221; approach would be to keep the part about &#8220;a tensor field is the sum of tensor products of vector fields and 1-form fields&#8221; but define vector fields and 1-form fields &#8220;geometrically&#8221;. Vector fields become differential operators over the manifold instead of maps to elements of the tangent space and 1-forms are defined in terms of differentials instead of duals of vectors.</p>
<h3>The Magic</h3>
<p>The magic is that this parametrization in terms of tuples of real numbers (a coordinate system) brings automatically a canonical basis and and the transformation matrix for change of basis. Hence defining a coordinate system provides a basis for free. Otherwise the generalization of the first definition would have been clumsier.</p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=447&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/09/tensor-vs-tensor-field-basis-vs-coordinate-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
		<item>
		<title>Visiting CERN for the Big Announcement</title>
		<link>http://krastanov.wordpress.com/2012/07/04/visiting-cern-for-the-big-announcement/</link>
		<comments>http://krastanov.wordpress.com/2012/07/04/visiting-cern-for-the-big-announcement/#comments</comments>
		<pubDate>Wed, 04 Jul 2012 15:28:33 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[blah blah]]></category>
		<category><![CDATA[Physics]]></category>
		<category><![CDATA[CERN]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[higgs]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=441</guid>
		<description><![CDATA[This morning I woke up rather early in order to go to the CERN campus to see the announcement of the new particle for myself. First of all: Hell, yeah! When Joe Incandela, the spokeperson for CMS, showed this plot everybody remained silent. He actually forgot to continue his speech for a few moments, sooo [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=441&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This morning I woke up rather early in order to go to the CERN campus to see the announcement of the new particle for myself. First of all:</p>
<p>Hell, yeah!</p>
<div class="wp-caption aligncenter" style="width: 522px"><a href="https://cdsweb.cern.ch/record/1459463/files-static/Fig3-MassFactSoBWeightedMass-subformat-icon-640.gif"><img title="Higgs-like particle" src="https://cdsweb.cern.ch/record/1459463/files-static/Fig3-MassFactSoBWeightedMass-subformat-icon-640.gif" alt="Higgs-like particle" width="512" height="494" /></a><p class="wp-caption-text">Higgs-like particle</p></div>
<p>When Joe Incandela, the spokeperson for CMS, showed this plot everybody remained silent. He actually forgot to continue his speech for a few moments, sooo happy about being able to show such an insanely cool graph.</p>
<p>Obviously this is a great scientific discovery. Anyhow, it was not a surprise for most physicists, hence I will leave the discussion of the physics out of the way and focus on today&#8217;s event itself. (Just to be clear, this is indeed a new particle, however it is not know for sure whether it is the SM Higgs (<a href="http://www.quantumdiaries.org/2012/07/03/what-to-look-for-the-higgs-to-gamma-gamma-branching-ratio/" target="_blank">I will be so happy if it is not</a> (yes, click this link)))</p>
<p>Getting back to the event itself, the atmosphere was indeed great. The conference hall was too small for all the public to fit in, thus, in order to ensure that everybody is happy, CERN had the talks streamed to all meeting rooms on the campus. Regardless, there was a number of enthusiasts that slept in front of the doors to guarantee themselves a place in the main hall. Good for them as it seems that by already 5:30 am there were more than 150 people waiting in front of the hall (the seminar started at 9 o&#8217;clock).</p>
<p>After the presentations, the scientists that predicted the particle some 50 years ago were given the opportunity to say a few words. Gerald Guralnik&#8217;s comment was very appropriate:</p>
<blockquote><p>It is wonderful to be at a physics event where there is applause like there is at at football game.</p></blockquote>
<p>Peter Higgs had tears in his eyes when he said:</p>
<blockquote><p>It is an incredible thing that it has happened in my lifetime.</p></blockquote>
<p>In the spirit of these words, we should not forget all the people that were not as lucky and were not able to see the product of their work.</p>
<p>The CERN Director General Rolf Heuer closed the talks by saying:</p>
<blockquote><p>As a laymen I would now say I think we have it. Do you agree?</p></blockquote>
<p>And was greeted by ovations from the hall (and all the meeting rooms on campus). This person moderated the talks extremely well.  Indeed, it was a pleasure to watch him and the two collaborations&#8217; spokepeople answering the journalists&#8217; questions during the press conference that followed.</p>
<p>Lastly, a few places to check for more information (there is a number of articles on each blog, so check the prev/next buttons):</p>
<ul>
<li><a href="http://blogs.discovermagazine.com/cosmicvariance/2012/07/03/live-blogging-the-higgs-seminar/" target="_blank">Cosmic Variance</a></li>
<li><a href="http://www.quantumdiaries.org/2012/07/04/cern-july-4-seminar/" target="_blank">Quantum Diaries</a></li>
<li><a href="http://www.science20.com/quantum_diaries_survivor/rolf_heuer_i_think_we_have_it-91755" target="_blank">Quantum Diaries Survivor</a></li>
<li><a href="http://backreaction.blogspot.ch/2012/07/hello-higgs-what-now.html" target="_blank">Backreaction</a></li>
</ul>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=441&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/07/04/visiting-cern-for-the-big-announcement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>

		<media:content url="https://cdsweb.cern.ch/record/1459463/files-static/Fig3-MassFactSoBWeightedMass-subformat-icon-640.gif" medium="image">
			<media:title type="html">Higgs-like particle</media:title>
		</media:content>
	</item>
		<item>
		<title>Part 1: What is a Tensor and How is it Implemented in the diffgeom SymPy module?</title>
		<link>http://krastanov.wordpress.com/2012/06/30/part-1-what-is-a-tensor-and-how-is-it-implemented-in-the-diffgeom-sympy-module/</link>
		<comments>http://krastanov.wordpress.com/2012/06/30/part-1-what-is-a-tensor-and-how-is-it-implemented-in-the-diffgeom-sympy-module/#comments</comments>
		<pubDate>Fri, 29 Jun 2012 22:36:38 +0000</pubDate>
		<dc:creator>Stefan Krastanov</dc:creator>
				<category><![CDATA[GSoC - diffgeom]]></category>
		<category><![CDATA[differential geometry]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[symbolic algebra]]></category>
		<category><![CDATA[sympy]]></category>

		<guid isPermaLink="false">http://krastanov.wordpress.com/?p=409</guid>
		<description><![CDATA[The Math The notion of &#8220;a tensor&#8221; is commonly defined in two different ways. The first definition goes roughly like this (&#8220;roughly&#8221; means &#8220;do not tell this to your math teacher&#8221;): A tensor is a geometrical object that can be represented in some coordinate system as an n-dimensional array (it is not the array itself). [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=409&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h2>The Math</h2>
<p>The notion of &#8220;a tensor&#8221; is commonly defined in two different ways. The first definition goes roughly like this (&#8220;roughly&#8221; means &#8220;do not tell this to your math teacher&#8221;):</p>
<blockquote><p>A tensor is a geometrical object that can be represented in some coordinate system as an n-dimensional array (it is not the array itself). The quantities in that array depend on the coordinate system in which the representation is done, however there is a precise rule on how these quantities change if we switch to another coordinate system. It is this rule that defines what a tensor (and in particular a vector or a 1-form) is.</p></blockquote>
<p>The other definition, less used by physicists and more used by mathematicians is (again roughly) the following:</p>
<blockquote><p>A tensor is the sum of tensor products of forms and vectors. Forms and vectors are themselves given nice geometrical definitions.</p></blockquote>
<p>It is this second definition that is used in the diffgeom SymPy module. Naturally, we need to define &#8220;tensor product&#8221;, &#8220;vector&#8221; and &#8220;form&#8221; in order to use this definition. Indeed, the structure of the module follows closely these mathematical definitions.</p>
<p>Disclaimer: I have used and will use the words tensor and tensor field interchangeably. In order for this post to make any sense to you, ensure that you understand the difference and are able to find out the exact meaning from the context. The same goes also for vector / vector field and form / form field.</p>
<h2>The Implementation</h2>
<p>To create the mathematical structure of differential geometry or its implementation in a CAS like SymPy we need to build up the ladder of object definitions. Each new and more interesting notion will depend on the definition of the previous. Hence we start with the boilerplate object &#8220;Manifold&#8221; and on it we define a &#8220;Patch&#8221; (the diffgeom module implements all this boilerplate for commonly used manifold, however in order to explain how it works, we will redo everything from scratch):</p>
<pre class="brush: python; title: ; notranslate">
m = Manifold('my_manifold', 2) # A 2D manifold called 'my_manifold'
p = Patch('my_patch', m) # A patch called 'my_patch'
 </pre>
<p>The first object that does something marginally interesting is the &#8220;Coordinate System&#8221;. Its role is to permit the parametrization of points on the patch by a tuple of numbers:</p>
<pre class="brush: python; title: ; notranslate">
cs_r = CoordSystem('R', p) # A coordinate system called 'R' (for rectangular)
point = cs_r.point([1,1]) # A point with coordinates (1, 1)
</pre>
<p>If you have two or more coordinate systems you can tell the computer how to transform a tuple of numbers from one system to another:</p>
<pre class="brush: python; title: ; notranslate">
cs_p = CoordSystem('P', p)
cs_r.connect_to(cs_p, [x, y], [sqrt(x**2+y**2), atan2(y,x)])
cs_p.connect_to(cs_r, [r, t], [r*cos(t), r*sin(t)], inverse=False)
# Now the point instances know how to transform their coordinate tuples:
point.coords(cs_p)
# output:
#⎡  ___⎤
#⎢╲╱ 2 ⎥
#⎢     ⎥
#⎢  π  ⎥
#⎢  ─  ⎥
#⎣  4  ⎦
</pre>
<p>However, differential geometry is not about calculating coordinates of points in different systems. It is about working with fields. Thus, we will focus on a single coordinate system from now on, and to be explicit about its complete independence of whether we want rectangular or other coordinates, we will just call it &#8216;c&#8217; and leave it unconnected to other coordinate systems.</p>
<pre class="brush: python; title: ; notranslate">
c = CoordSystem('c', p)
</pre>
<h3>Scalar Field</h3>
<p>We continue to build up our ladder of definitions in order to obtain a more interesting and useful theory/implementation. The next step is the &#8220;scalar field&#8221;. A scalar field is a mapping from the manifold (the set of points) to the real numbers (yes, just reals (maybe complex), the rest brings unnecessary complexity). Each coordinate system brings with itself the basic scalar fields (i.e. coordinate functions), that correspond to the mappings from a point to an element of its coordinate tuple. These basic scalar fields are implemented internally as BaseScalarField instances (this is however invisible to the user).</p>
<pre class="brush: python; title: ; notranslate">
 c.coord_functions()
# output: [c₀, c₁]
point = c.point([a, b])
c.coord_function(0)(point)
# output: a
</pre>
<p>You can build more complicated fields by using the base scalar fields. This does not produce an instance of some new ScalarField class. The BaseScalarField instances just become a part of the expression tree of an ordinary Expr instance (the base for building expressions in SymPy).</p>
<pre class="brush: python; title: ; notranslate">
c0, c1 = c.coord_functions()
field = f(c0, 3*c1)/sin(c0)*c1**2
f
# output:
#               -1       2
#f(c₀, 3⋅c₁)⋅sin  (c₀)⋅c₁
field(point)
# output:
# 2
#b ⋅f(a, 3⋅b)
#────────────
#   sin(a)
</pre>
<h3>Vector Field</h3>
<p>Then comes the vector field which is defined as an element of the set of differential operators over the scalar fields. All elements of this set can be build up as linear combinations of base vector fields. The base vector fields correspond to the partial derivatives with respect to the base scalar fields. They are implemented in the BaseVectorField class, which also is invisible to the user.</p>
<pre class="brush: python; title: ; notranslate">
c.base_vectors()
# output: [∂_c_0, ∂_c_1]
e_c0, e_c1 = c.base_vectors()
e_c0(c0)
# output: 1
e_c0(c1)
# output: 0
</pre>
<p>One can also use more complicated fields (again, no need for new VectorField class, just being part of the expression tree of Expr):</p>
<pre class="brush: python; title: ; notranslate">
v_field = c1*e_c0 + f(c0)*e_c1
v_field
# output: f(c₀)⋅∂_c_1 + c₁⋅∂_c_0
s_field = g(c0, c1)
v_field(s_field)
# output:
#      ⎛ d            ⎞│           ⎛ d            ⎞│
#f(c₀)⋅⎜───(g(c₀, ξ₂))⎟│      + c₁⋅⎜───(g(ξ₁, c₁))⎟│
#      ⎝dξ₂           ⎠│ξ₂=c₁      ⎝dξ₁           ⎠│ξ₁=c₀
v_field(s_field)(point)
# output:
#  ⎛ d           ⎞│            ⎛ d           ⎞│
#b⋅⎜───(g(ξ₁, b))⎟│     + f(a)⋅⎜───(g(a, ξ₂))⎟│
#  ⎝dξ₁          ⎠│ξ₁=a        ⎝dξ₂          ⎠│ξ₂=b
</pre>
<h3>1-Form Field and Differential</h3>
<p>The final ingredient needed for the basis of differential geometry is the 1-form field. A 1-form field is a linear mapping from the set of vector fields to the set of reals. The interesting thing is that all 1-forms can be build-up from linear combinations of the differentials of the base scalar fields.</p>
<p>There is the need to define what a differential is. The differential <img src='http://s0.wp.com/latex.php?latex=df&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='df' title='df' class='latex' /> of the scalar field <img src='http://s0.wp.com/latex.php?latex=f&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='f' title='f' class='latex' /> is the 1-form field which has the following property: for every vector field <img src='http://s0.wp.com/latex.php?latex=v&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='v' title='v' class='latex' /> one has <img src='http://s0.wp.com/latex.php?latex=df%28v%29+%3D+v%28f%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='df(v) = v(f)' title='df(v) = v(f)' class='latex' />.</p>
<p>In the diffgeom module the differential is implemented as the Differential class. The differentials of the base scalar fields are accessible with the base_oneforms() method, however one can construct the differential of whatever scalar field they wish. There is, as always, no dedicated OneFormField class. Everything is build up with Expr instances.</p>
<pre class="brush: python; title: ; notranslate">
c.base_oneforms()
# output: [ⅆ c₀, ⅆ c₁]
dc0, dc1 = c.base_oneforms()
dc0(e_c0), dc1(e_c0)
# output: (1, 0)
</pre>
<p>And building up more complicated expressions:</p>
<pre class="brush: python; title: ; notranslate">
f_field = g(c0)*dc1 + 2*dc0
f_field(v_field)
# output: g(c₀)⋅f(c₀) + 2⋅c₁
</pre>
<h3>The Rest</h3>
<p>Now that we have the basic building blocks in order to construct higher order tensors we use tensor and wedge products. More about them in part 2.</p>
<h2>What if I Need to Work with a Number of Different Coordinate Systems</h2>
<p>The only difference is that the chain rule of differentiation will be necessary. One can express the same statement in a more implementation independent way as &#8220;The rule for transformation of coordinates will need to be applied&#8221;. Anyhow, it works:</p>
<p>Examples from the already implemented <img src='http://s0.wp.com/latex.php?latex=R%5E2&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='R^2' title='R^2' class='latex' /> module.</p>
<h3>Points Defined in one Coordinate System and Evaluated in Another</h3>
<pre class="brush: python; title: ; notranslate">
point_r = R2_r.point([x0, y0])
point_p = R2_p.point([r0, theta0])
R2.x(point_r)
# output: x₀
R2.x(point_p)
# output: r₀⋅cos(θ₀)
trigsimp((R2.x**2 + R2.y**2 + g(R2.theta))(point_p))
# output:
#  2
#r₀  + g(θ₀)
</pre>
<h3>Vector Fields Operating on Scalar Fields</h3>
<pre class="brush: python; title: ; notranslate">
R2.e_x(R2.theta)
# output:
#            -1
#   ⎛ 2    2⎞
#-y⋅⎝x  + y ⎠
R2.e_theta(R2.y)
# output: cos(θ)⋅r
</pre>
<h3>1-Form Fields Operating on Vector Fields</h3>
<pre class="brush: python; title: ; notranslate">
R2.dr(R2.e_x)
# output:
#         -1/2
#⎛ 2    2⎞
#⎝x  + y ⎠    ⋅x
</pre>
<h2>What if I Need an Unspecified Arbitrary Coordinate System</h2>
<p>If it is just one coordinate system, nothing; all the examples in the first part were for a completely arbitrary system. If you want two systems with an arbitrary transformation rules between them, just use an arbitrary function when you connect them:</p>
<pre class="brush: python; title: ; notranslate">
m = Manifold('my_manifold', 2)
p = Patch('my_patch', m)
cs_a = CoordSystem('a', p)
cs_b = CoordSystem('b', p)
cs_a.connect_to(cs_b, [x, y], [f(x,y), g(x,y)], inverse=False)
cs_a.base_vector(1)(cs_b.coord_function(0))
# output:
#⎛ d            ⎞│
#⎜───(f(a₀, ξ₁))⎟│
#⎝dξ₁           ⎠│ξ₁=a₁
</pre>
<h2>How Does This Relate to the Scheme Code by <a href="http://groups.csail.mit.edu/mac/users/gjs/" target="_blank">Gerald Jay Sussman</a> and <a href="http://groups.csail.mit.edu/mac/users/wisdom/" target="_blank">Jack Wisdom</a></h2>
<p>The diffgeom module is based in its entirety on the work of <a href="http://groups.csail.mit.edu/mac/users/gjs/" target="_blank">Gerald Jay Sussman</a> and <a href="http://groups.csail.mit.edu/mac/users/wisdom/" target="_blank">Jack Wisdom</a> on <a href="http://dspace.mit.edu/handle/1721.1/30520" target="_blank">“Functional Differential Geometry”</a>. The only substantial difference (in what is already implemented) is how the diffgeom module treats operations on fields. Both the diffgeom module and the original Scheme code behave like this:</p>
<pre class="brush: plain; title: ; notranslate">
scalar_field(point) ---&gt; an expression representing a real number
</pre>
<p>However, the original scheme implementation and the SymPy module behave differently in these cases:</p>
<pre class="brush: plain; title: ; notranslate">
 vector_field(scalar_field)
form_field(vector_field)
 </pre>
<p>As far as I know, the original Scheme code produces an opaque object. It indeed represents a scalar field, however <img src='http://s0.wp.com/latex.php?latex=%5Cpartial_x%28x%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;partial_x(x)' title='&#92;partial_x(x)' class='latex' /> will not produce directly <img src='http://s0.wp.com/latex.php?latex=1&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='1' title='1' class='latex' />. Instead it produces an object that returns 1 when evaluated at a point. The diffgeom module does this evaluation at the time at which one calls <img src='http://s0.wp.com/latex.php?latex=%5Cpartial_x%28x%29&amp;bg=f3f3f3&amp;fg=888888&amp;s=0' alt='&#92;partial_x(x)' title='&#92;partial_x(x)' class='latex' /> without the need to evaluate at a point, thus the result is explicit and not encapsulated in an opaque object.</p>
<br />  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=krastanov.wordpress.com&#038;blog=15251174&#038;post=409&#038;subd=krastanov&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://krastanov.wordpress.com/2012/06/30/part-1-what-is-a-tensor-and-how-is-it-implemented-in-the-diffgeom-sympy-module/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<georss:point>0.000000 0.000000</georss:point>
		<geo:lat>0.000000</geo:lat>
		<geo:long>0.000000</geo:long>
		<media:content url="http://0.gravatar.com/avatar/f078285bfd9090340d445e4fd69ec97f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">stefankr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
