<?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"
	>

<channel>
	<title>Michi's blog</title>
	<atom:link href="http://blog.mikael.johanssons.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mikael.johanssons.org</link>
	<description>Because my LiveJournal is too silly</description>
	<pubDate>Thu, 19 Jun 2008 07:53:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>A vision for collaborative mathematics platforms</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/06/a-vision-for-collaborative-mathematics-platforms/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/06/a-vision-for-collaborative-mathematics-platforms/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 07:53:57 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Communicating science]]></category>

		<category><![CDATA[LaTeX]]></category>

		<category><![CDATA[Web 2.0 for Mathematics]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=173</guid>
		<description><![CDATA[Based on the extensive discussion at the Secret Blogging Seminar on tools for long-distance collaborations, Scott Morrison writes an introduction to source control with subversion for research collaborators. 
In this post, Scott also offers, quite magnanimously, to setup and host subversion repositories for any mathematician who happens to want to start collaborating using subversion.
Which, to [...]]]></description>
			<content:encoded><![CDATA[<p>Based on the <a href="http://sbseminar.wordpress.com/2008/06/16/request-long-distance-collaboration/#comments">extensive discussion</a> at the Secret Blogging Seminar on <a href="http://sbseminar.wordpress.com/2008/06/16/request-long-distance-collaboration/">tools for long-distance collaborations</a>, Scott Morrison writes an <a href="http://sbseminar.wordpress.com/2008/06/18/subverting-the-system/">introduction to source control with subversion for research collaborators</a>. </p>
<p>In this post, Scott also offers, quite magnanimously, to setup and host subversion repositories for any mathematician who happens to want to start collaborating using subversion.</p>
<p>Which, to my mind, immediately prompts the question: why stop there? I&#8217;ve had ideas about setting up a free and easy to use platform for modern communication in the mathematical community before; but they were along the lines of duplicating <a href="http://wordpress.com">wordpress.com</a>&#8217;s efforts; which isn&#8217;t really something that pays off on your efforts. Reading this, though, raised a new idea.</p>
<p>Why not setup a server - preferably with a university data center as backing - which dispenses free platforms with the following contents:</p>
<ul>
<li>Source control. Preferably option on subversion, git, mercurial - or some such selection of modern and wide-spread systems.</li>
<li>Wiki, Blog, Ticket system - a wordpress installation, with LaTeX, and a Trac installation connected to the source control system in use would do quite well.</li>
<li>Heavy access control: one of the worries I hear pronounced often is that running a blog with your mathematical ideas display the ideas to the world before you get to publish them, thus risking you getting scooped on your research. This worry would be, to some extent, ameliorated by serving things optionally over https, by having a decent and robust access control system, and by having draconian privacy statements for the site administration.</li>
<li>LaTeX compile farm - why not set this thing up so that it can build your papers for you? That way we really end up building the mathematician&#8217;s <a href="http://sourceforge.net">sourceforge</a>!</li>
</ul>
<p>So, I guess this post is a call for volunteer implementers. I&#8217;ll launch the ideas in the fora I have access to - I&#8217;m headed for a faculty retreat tomorrow discussing a research project which seems to include Web2.0 for research communication as a topic, and will see if I can propose the ideas there; and it&#8217;s just the thing to discuss with the workgroup <em>Information und Kommunikation</em> of the DMV too. But just because I&#8217;m looking for people who want to run this in no way implies anyone reading this shouldn&#8217;t.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/06/a-vision-for-collaborative-mathematics-platforms/feed/</wfw:commentRss>
		</item>
		<item>
		<title>FRA-Lagen och falska positiver</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/06/fra-lagen-och-falska-positiver/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/06/fra-lagen-och-falska-positiver/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 08:56:34 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Politics]]></category>

		<category><![CDATA[Privacy]]></category>

		<category><![CDATA[Svenska]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=172</guid>
		<description><![CDATA[Jag har varit en god medborgare. Jag har börjat emaila politiker. Anledningen är gårdagens debatt och dagens återremittering av FRA-Lagen.
Kärnan i mitt email, efter en personaliserad inledning där jag återknyter till vardera riksdagsledamots insats i debatten, är följande argumentation.

Tanken med signalspaningen är att analysera trafikmönster, läsa innehåll,
och hitta allmänna mönster. Dock är inga av dessa [...]]]></description>
			<content:encoded><![CDATA[<p>Jag har varit en god medborgare. Jag har börjat emaila politiker. Anledningen är gårdagens debatt och dagens återremittering av FRA-Lagen.</p>
<p>Kärnan i mitt email, efter en personaliserad inledning där jag återknyter till vardera riksdagsledamots insats i debatten, är följande argumentation.</p>
<blockquote><p>
Tanken med signalspaningen är att analysera trafikmönster, läsa innehåll,<br />
och hitta allmänna mönster. Dock är inga av dessa metoder 100%<br />
tillförlitliga, och det man vill hitta är väldigt ovanliga företeelser.        </p>
<p>Problemen härvid är framför allt:<br />
1) mönster är väldigt lätta att dölja. Det finns många och relativt<br />
   välkända metoder att bygga upp sina kommunikationer så att trafikanalys<br />
   blir i det närmaste värdelöst: man kan se till att alltid skicka massa<br />
   data åt alla möjliga håll, och därvid skicka mycket skräpdata, så att<br />
   när det väl skickas värdefull data så är det ingen skillnad i<br />
   trafikflödet.<br />
2) kryptering är lätt att använda. Det finns många mjukvarupaket för att<br />
   kryptera all möjlig elektronisk kommunikation. Vi använder det för<br />
   bankärenden, för företagsintern kommunikation, och det är lätt att<br />
   använda för privata ändamål. Därigenom kan den som vill gömma sig<br />
   väldigt lätt göra all sin kommunikation oläsbar.<br />
3) imperfekta metoder kommer dränka övervakaren i falska anklagelser.<br />
   Den internationellt kände säkerhetsexperten Bruce Schneier har<br />
   diskuterat det här fenomenet utförligt i sitt nyhetsbrev. En av de<br />
   bästa genomgångarna jag känner till finns här:<br />
   http://www.schneier.com/blog/archives/2006/03/data_mining_for.html          </p>
<p>   Kontentan av den artikeln är att även en väldigt låg förekomst av<br />
   falska positiver ger ohyggligt många falsklarm om datamängden är stor,<br />
   och mängden sanna positiver väldigt liten. Just terrorismbekämpning är<br />
   Schneier&#8217;s kardinalexempel: och han argumenterar med trovärdiga<br />
   uppskattningar att även en absurt låg sannolikhet för falsklarm -<br />
   0.00001% - kommer generera många tusen falsklarm per dag med ett<br />
   automatiserat kommunikationsövervakningssystem.                             </p>
<p>Med andra ord, inte bara är FRA-lagen ett ohyggligt djupt intrång i den<br />
personliga integriteten och friheten. Det finns heller ingen möjlighet för<br />
de angivna ändamålen att någonsin faktiskt infrias.                            </p>
<p>MvH,<br />
Mikael Vejdemo Johansson<br />
Matematiker
</p></blockquote>
<p>Jag räknar visserligen inte med att det hjälper, men det är ingen ursäkt för att inte försöka.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/06/fra-lagen-och-falska-positiver/feed/</wfw:commentRss>
		</item>
		<item>
		<title>On purity and essence of mathematics</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/06/on-purity-and-essence-of-mathematics/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/06/on-purity-and-essence-of-mathematics/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 11:06:54 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Blogs]]></category>

		<category><![CDATA[Mathematics]]></category>

		<category><![CDATA[Metablogging]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=171</guid>
		<description><![CDATA[I seem, lately, to be so densely planned that all I can do for my blog is to react on blog posts from Ben Webster at the Secret Blogging Seminar.
He has, recently, written a post inspired by the xkcd comic on purity in the sciences. The comic is funny, and rings true, but Ben brings [...]]]></description>
			<content:encoded><![CDATA[<p>I seem, lately, to be so densely planned that all I can do for my blog is to react on blog posts from Ben Webster at the <a href="http://sbseminar.wordpress.com">Secret Blogging Seminar</a>.</p>
<p>He has, recently, written <a href="http://sbseminar.wordpress.com/2008/06/14/what-is-purity/">a post</a> inspired by the <a href="http://xkcd.com">xkcd</a> comic on <a href="http://xkcd.com/435/">purity in the sciences</a>. The comic is funny, and rings true, but Ben brings up a severe criticism of the premises of the comic that rings back to my own years as a hotheaded undergraduate.</p>
<p>You should read all of Ben&#8217;s post, but if you don&#8217;t, you should at least read the following:</p>
<blockquote><p>
And I think one of the key points here is this: mathematics is not science. Mathematics is often lumped in with science, and is often used by scientists. Mathematicians often know more science than normal people, and certainly scientists know more mathematics. But mathematics and science are fundamentally different activities, as different as making a gun and fighting in a battle. I mean, no one would claim there are no links between those occupations, or that gun-makers don’t pay a lot of attention to how guns are used, but not even a child would mistake one for the other. Putting mathematics on a continuum of purity with sciences is like putting it on a continuum with disciplines of art ordered by “highbrow-ness” (actually, I would argue that the latter captures the nature of mathematics better).
</p></blockquote>
<p>The critique here is pretty close to my own age-old hobby horse: the epistemology of mathematics is fundamentally different from the epistemology of the sciences. I used to use this as an argument for transferring the Department of Mathematics at Stockholm University from the Faculty of Sciences to the Faculty of Humanities. Nobody really took me serious back then. However, the basic ideas underlying it all reoccurs: both in Ben&#8217;s post, and in <a href="http://pozorvlak.livejournal.com">Pozorvlak&#8217;s</a> excellent shot at <a href="http://pozorvlak.livejournal.com/107454.html">classifying academic disciplines by their epistemology</a>. Pozorvlak expands on his treatment of it all, but if we restrict it to the case Ben discusses, his point is basically this:<br />
Mathematics deals with statements that can be proven.<br />
Science deals with statements that cannot be proven, but can be falsified.</p>
<p>These two types of statements lead pretty immediately to different ideas of what <i>truth</i> is - and what knowledge is and all sorts of deep philosophical (as in cannot be proven, cannot be falsified, cannot even find circumstantial evidence for) questions dealing with the meta-level of academic research.</p>
<p>Nowadays, my University has the Mathematics department placed in the Faculty for Mathematics and Computer Science - and I have much less objections to this state of affairs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/06/on-purity-and-essence-of-mathematics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AMS and mathjobs.org are made of awesome</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/06/ams-and-mathjobsorg-are-made-of-awesome/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/06/ams-and-mathjobsorg-are-made-of-awesome/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 10:36:41 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Blogs]]></category>

		<category><![CDATA[Metablogging]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=170</guid>
		<description><![CDATA[I like the Mathjobs website that AMS are running. It&#8217;s a good source for math jobs, and seems to have just the right selection for me to get interesting stuff out of reading it.
Now, in a post just a day or two ago, Ben Webster of the Secret Blogging Seminar called for RSS feeds for [...]]]></description>
			<content:encoded><![CDATA[<p>I like the <a href=http://mathjobs.org>Mathjobs</a> website that AMS are running. It&#8217;s a good source for math jobs, and seems to have just the right selection for me to get interesting stuff out of reading it.</p>
<p>Now, in a post just a day or two ago, Ben Webster of the Secret Blogging Seminar <a href="http://sbseminar.wordpress.com/2008/06/09/an-open-letter-to-mathjobsorg/">called for RSS feeds for the Mathjobs listings.</a></p>
<p>Imagine my surprise - and probably that of most the readers of the Secret Blogging seminar - to see, the day after posting, the following reply from Diane Boumenot at the AMS:</p>
<blockquote><p>
    Hello all. First of all let me say, thank you for the kind words. Also, if you want to send suggestions to Mathjobs.Org, that can be easily done through the web site. However, thanks to Google Alerts and a willing programmer, your request has been received and acted on. As of this morning you can get an RSS feed through the View Jobs page of the Mathjobs website.</p>
<p>    Thanks for the suggestion. Thoughts/ideas are always welcome. I will pass the one about Current Publications along to the publications division.<br />
    –Diane Boumenot<br />
    Manager, Membership &#038; Programs, AMS
</p></blockquote>
<p>Dear Diane. Dear AMS. You&#8217;re doing a good job already. This amount of community awareness and swift responses is heartwarming, impressive and thouroughly amazing. Much love!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/06/ams-and-mathjobsorg-are-made-of-awesome/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Restarting high school topology</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/05/restarting-high-school-topology/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/05/restarting-high-school-topology/#comments</comments>
		<pubDate>Wed, 21 May 2008 16:41:56 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[10th grade topology]]></category>

		<category><![CDATA[Knot theory]]></category>

		<category><![CDATA[Topology]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=169</guid>
		<description><![CDATA[My two high-school kids came by today. We&#8217;ve been trying to get a new teaching session together since early February, but they had a hell of a time all through February, and all our appointments ended up canceled with little or no notice; and then I spent March and April on tour.
We pressed on with [...]]]></description>
			<content:encoded><![CDATA[<p>My two high-school kids came by today. We&#8217;ve been trying to get a new teaching session together since early February, but they had a hell of a time all through February, and all our appointments ended up canceled with little or no notice; and then I spent March and April on tour.</p>
<p>We pressed on with knot theory. Today, we discussed knot sums, prime knots, knot tabulation, behavior of the one invariant (n-colorability) we know so far under knot sums, Dowker codes, and we got started on Conway codes for knots. Next week, I plan for us to finish up talking about the Conway knot notation, get the connection between rational knots and continued fractions down pat, and start looking into new invariants.</p>
<p>Anyone have a favorite invariant that you&#8217;d like me to talk about? I&#8217;m hoping (in my wildest most bizarre dreams) to get around to the Alexander polynomial and possibly even talk about Khovanov homology, but that depends a LOT on whether they&#8217;re prepared to continue through their summer holidays or not - and even then I doubt we&#8217;ll make it up to Khovanov.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/05/restarting-high-school-topology/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Parallel and cluster computing with MPI4Py</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/05/parallell-and-cluster-mpi4py/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/05/parallell-and-cluster-mpi4py/#comments</comments>
		<pubDate>Sun, 18 May 2008 10:46:20 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Mathematics]]></category>

		<category><![CDATA[Parallel]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/?p=168</guid>
		<description><![CDATA[First off, I&#8217;d ask your pardon for the lull in postings - this spring has been insane. It has been very much fun - traveling the world, talking about my research and meeting people I only knew electronically - and also very intense.
To break the lull, I thought I&#8217;d try to pick up what I [...]]]></description>
			<content:encoded><![CDATA[<p>First off, I&#8217;d ask your pardon for the lull in postings - this spring has been insane. It has been very much fun - traveling the world, talking about my research and meeting people I only knew electronically - and also very intense.</p>
<p>To break the lull, I thought I&#8217;d try to pick up what I did last summer: parallel computing on clusters. It&#8217;s been a bit of <a href="http://vnoel.wordpress.com/2008/05/03/bye-matlab-hello-python-thanks-sage/">blog chatter</a> about <a href="http://www.sagemath.org">SAGE</a> and how SAGE suddenly has transformed from a Really Good Idea to something that starts to corner out most other systems in usability and flexibility. </p>
<p>Matlab? SciPy bundled with SAGE and the Python integration seems to be at least as good, if not better.<br />
Maple? Mathematica? Maxima? Singular? GAP? SAGE interfaces with all those that it doesn&#8217;t emulate.</p>
<p>And also, it allows you to install and interface with almost anything that has a Python module written. Specifically, a SAGE installation comes complete with OpenMPI and MPI4Py, allowing for multi-processor parallelity - either on an SMP machine, or on a cluster that runs some sort of MPI system. So, using the Python and <a href="http://mpi4py.scipy.org/">MPI4Py</a> that arrives with SAGE, it should be possible to start experimenting with parallel programming; and the rest of the SAGE integration should make it easy to start playing with, say, parallel algorithms for commutative or homological algebra.</p>
<p>But as a first step, I thought I&#8217;d do a &#8220;Hello world&#8221; for mathematics. Computing the <a href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot fractal</a>.</p>
<p>Now, a Mandelbrot fractal is reasonably easy to compute: we step through all pixels in our image, and we repeat the transformation <img src='/latexrender/pictures/a4f8194ac63d0fe70e3f3ef3d83e37a7.png' title='z_{n+1} = z_n^2+c' alt='z_{n+1} = z_n^2+c' align='middle' /> for c the complex plane point corresponding to the pixel, and <img src='/latexrender/pictures/788c918479548ce20fcd4df8f0be5e51.png' title='z_0=0' alt='z_0=0' align='middle' />. We see whether this iteration diverges within a limited amount of steps.</p>
<p>I&#8217;m going to, for benchmarking reasons, fix some parameters. I&#8217;ll have a 600&#215;600 picture, spanning the area [-2.5,1.5]x[-2.0,2.0] of <img src='/latexrender/pictures/6a187591d2e75f61bc4068b4527c69ba.png' title='\mathbb R^2 = \mathbb C' alt='\mathbb R^2 = \mathbb C' align='middle' />. I&#8217;ll allow 80 iterations, and after that, I want to see whether the square of the magnitude is larger than 4.0.</p>
<p>At the core of the iteration lies the function</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">def</span> step<span class="br0">&#40;</span>z,c<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> z**<span class="nu0">2</span>+c<br />
&nbsp;</div>
<p>and for a specific point <img src='/latexrender/pictures/12fab91887b10b4ccc945c3f03390f91.png' title='c=x+yi' alt='c=x+yi' align='middle' />, we can compute the number of iterations needed with the function</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">def</span> point<span class="br0">&#40;</span>c,n,d2<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; zo = <span class="nu0">0.0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zn = zo<br />
&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">abs</span><span class="br0">&#40;</span>zn<span class="br0">&#41;</span>**<span class="nu0">2</span> &lt; d2 <span class="kw1">and</span> i&lt;n:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zn = step<span class="br0">&#40;</span>zo,c<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zo = zn<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = i<span class="nu0">+1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> i<br />
&nbsp;</div>
<p>Repeating this for each point in the span we look at, modified for the granularity our pixels force, and choosing a color for each iteration number, we&#8217;ll get the familiar Mandelbrot fractal. I choose to assign colors using the hue in the <a href="http://en.wikipedia.org/wiki/HSL_and_HSV">HSV color space</a>. This gives us rich, nice colors with a continuous and neat progression through them. So, given the number of iterations at a point, and the maximal number of iterations allowed, we compute the corresponding color by</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">def</span> colnorm<span class="br0">&#40;</span><span class="br0">&#40;</span>r,g,b<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">255</span>*r<span class="br0">&#41;</span><span class="nu0">-1</span>,<span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">255</span>*g<span class="br0">&#41;</span><span class="nu0">-1</span>,<span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">255</span>*b<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> col<span class="br0">&#40;</span>n,<span class="kw2">max</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> n == <span class="kw2">max</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> colnorm<span class="br0">&#40;</span><span class="kw3">colorsys</span>.<span class="me1">hsv_to_rgb</span><span class="br0">&#40;</span><span class="nu0">1.0</span>-<span class="kw2">float</span><span class="br0">&#40;</span>n<span class="br0">&#41;</span>/<span class="kw2">max</span>,<span class="nu0">1.0</span>,<span class="nu0">1.0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>the function <code lang="python">colnorm</code> is in there to convert RGB triples with values in [0,1] to RGB triples with values in [0,255].</p>
<p>And from here it&#8217;s just a matter of interfacing with the right kind of image writing library - I chose the <a href="http://pythonware.com/products/pil/">PIL library</a> - and then go through all pixels, computing the color implied at each pixel, and placing it in the image.</p>
<p>Run like this, the benchmark fractal takes some 12 seconds on our workgroup&#8217;s workhorse, and 8 seconds on a single node of the Jena Beowulf cluster. </p>
<p>The resulting fractal is<br />
<img src="http://blog.mikael.johanssons.org/wp-content/mandel.png" alt="Mandelbrot fractal" /></p>
<p>As for parallelization, the Mandelbrot fractal is a typical example of what&#8217;s called an embarrassingly parallel problem: each pixel in an image is completely independent from all other pixels, and so we could just let one single processor loose on each pixel, and get things done a lot faster than if we&#8217;d work through the pixels one after the other.</p>
<p>So, to parallelize it, we&#8217;ll need some way of distributing the work among the processors, and some way of gathering the pieces up once we&#8217;re done. In <a href="http://mpi4py.scipy.org/">MPI4Py</a>, initialization and finalization of the MPI library is taken care of under the hood, in the import of the library and in the closing of the program.</p>
<p>My first idea was to use the builtin Scatter and Gather functions. The idea was something like the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp;comm = MPI.<span class="me1">COMM_WORLD</span><br />
&nbsp; &nbsp;rowids = <span class="kw2">range</span><span class="br0">&#40;</span>h<span class="br0">&#41;</span><br />
&nbsp; &nbsp;ids = comm.<span class="me1">Scatter</span><span class="br0">&#40;</span>rowids<span class="br0">&#41;</span><br />
&nbsp; &nbsp;pixs = compute_mandel<span class="br0">&#40;</span>ids<span class="br0">&#41;</span><br />
&nbsp; &nbsp;pixels = comm.<span class="me1">Gather</span><span class="br0">&#40;</span>pixs<span class="br0">&#41;</span><br />
&nbsp; &nbsp;img = generate_image<span class="br0">&#40;</span>pixels<span class="br0">&#41;</span><br />
&nbsp; &nbsp;img.<span class="me1">save</span><span class="br0">&#40;</span><span class="st0">&quot;filename.png&quot;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>but this fails already at the Scatter line. The thing is that you can&#8217;t just hand Scatter a list of things you want distributed, you&#8217;ll need to feed comm.Scatter with a list of lists, one for each recipient. This particular property of comm.Scatter is not actually described anywhere I could find on the web - the documentation for MPI4Py is minuscule at best, and this is specific to the Python interface setup, so the MPI standard documentation doesn&#8217;t give it away either.</p>
<p>The next problem that appears is that if we just divide the rows of the picture evenly - first processor gets rows 1,2,3,&#8230;,n; second gets n+1,&#8230;,2n and so on - then some processor will get the bulk of the actual Mandelbrot set - which is by definition the pixels that take the most iterations to compute - so the speedup by pouring more processing power on the problem won&#8217;t be as impressive as it could be. The processors that take care of regions outside the set will finish quickly and then just idle, and the processors that take care of most of the set will churn through as if they had computed the set alone.</p>
<p>There are very many ways to deal with this issue. The approach I&#8217;m taking is to use an interlacing pattern to distribute the rows. With n processors, each processor computes every n rows of the picture, thus getting easy and difficult rows reasonably evenly distributed. Also, with this easy a distribution scheme, there&#8217;s no reason to compute the rows centrally and distributing them with the MPI communication scheme.</p>
<p>Hence, the complete program ends up with the following source code:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">from</span> mpi4py <span class="kw1">import</span> MPI<br />
<span class="kw1">import</span> Image<br />
<span class="kw1">import</span> <span class="kw3">colorsys</span><br />
<span class="kw1">from</span> <span class="kw3">math</span> <span class="kw1">import</span> ceil</p>
<p>w = <span class="nu0">600</span><br />
h = <span class="nu0">600</span><br />
its = <span class="nu0">80</span><br />
d2 = <span class="nu0">4.0</span></p>
<p>xmax = <span class="nu0">1.5</span><br />
xmin = <span class="nu0">-2.5</span><br />
ymax = <span class="nu0">2.0</span><br />
ymin = <span class="nu0">-2.0</span></p>
<p><span class="kw1">def</span> step<span class="br0">&#40;</span>z,c<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> z**<span class="nu0">2</span>+c</p>
<p><span class="kw1">def</span> point<span class="br0">&#40;</span>c,n,d2<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; zo = <span class="nu0">0.0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zn = zo<br />
&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">abs</span><span class="br0">&#40;</span>zn<span class="br0">&#41;</span>**<span class="nu0">2</span> &lt; d2 <span class="kw1">and</span> i&lt;n:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zn = step<span class="br0">&#40;</span>zo,c<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zo = zn<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = i<span class="nu0">+1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> i</p>
<p><span class="kw1">def</span> colnorm<span class="br0">&#40;</span><span class="br0">&#40;</span>r,g,b<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">256</span>*r<span class="br0">&#41;</span><span class="nu0">-1</span>,<span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">256</span>*g<span class="br0">&#41;</span><span class="nu0">-1</span>,<span class="kw2">int</span><span class="br0">&#40;</span><span class="nu0">256</span>*b<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> col<span class="br0">&#40;</span>n,<span class="kw2">max</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> n == <span class="kw2">max</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> colnorm<span class="br0">&#40;</span><span class="kw3">colorsys</span>.<span class="me1">hsv_to_rgb</span><span class="br0">&#40;</span><span class="nu0">1.0</span>-<span class="kw2">float</span><span class="br0">&#40;</span>n<span class="br0">&#41;</span>/<span class="kw2">max</span>,<span class="nu0">1.0</span>,<span class="nu0">1.0</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> row<span class="br0">&#40;</span>n,xmin,xmax,ymin,ymax<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; row = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>w<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p = <span class="kw2">complex</span><span class="br0">&#40;</span><span class="br0">&#40;</span>xmin+x*<span class="br0">&#40;</span>xmax-xmin<span class="br0">&#41;</span>/w<span class="br0">&#41;</span>,<span class="br0">&#40;</span>ymin+n*<span class="br0">&#40;</span>ymax-ymin<span class="br0">&#41;</span>/h<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; row.<span class="me1">append</span><span class="br0">&#40;</span>point<span class="br0">&#40;</span>p,its,d2<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> row</p>
<p><span class="kw1">def</span> <span class="kw3">__main__</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; comm = MPI.<span class="me1">COMM_WORLD</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; rows = <span class="br0">&#91;</span> MPI.<span class="me1">rank</span> + MPI.<span class="me1">size*i</span> <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="kw2">int</span><span class="br0">&#40;</span><span class="kw2">float</span><span class="br0">&#40;</span>h<span class="br0">&#41;</span>/MPI.<span class="me1">size</span><span class="br0">&#41;</span><span class="nu0">+1</span><span class="br0">&#41;</span> <span class="kw1">if</span> MPI.<span class="me1">rank</span> + MPI.<span class="me1">size*i</span> &lt; h <span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pixels = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> y <span class="kw1">in</span> rows:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pixels.<span class="me1">append</span><span class="br0">&#40;</span>row<span class="br0">&#40;</span>y,xmin,xmax,ymin,ymax<span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; mandel = comm.<span class="me1">Gather</span><span class="br0">&#40;</span>pixels<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> MPI.<span class="me1">rank</span> == <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img = Image.<span class="kw3">new</span><span class="br0">&#40;</span><span class="st0">&quot;RGB&quot;</span>,<span class="br0">&#40;</span>w,h<span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rows = <span class="br0">&#91;</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>mandel<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>mandel<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = mandel<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rows.<span class="me1">append</span><span class="br0">&#40;</span><span class="br0">&#91;</span>col<span class="br0">&#40;</span>p,its<span class="br0">&#41;</span> <span class="kw1">for</span> p <span class="kw1">in</span> r<span class="br0">&#93;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>w<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> y <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span>h<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = rows<span class="br0">&#91;</span>y<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c = r<span class="br0">&#91;</span>x<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img.<span class="me1">putpixel</span><span class="br0">&#40;</span><span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>,c<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img.<span class="me1">save</span><span class="br0">&#40;</span><span class="st0">&quot;/home/mik/public_html/mandel.png&quot;</span><span class="br0">&#41;</span></p>
<p><span class="kw3">__main__</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>We can run this program on a single-processor machine by issuing</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="re1">$SAGE_ROOT</span>/<span class="kw3">local</span>/bin/mpirun -np <span class="nu0">1</span> <span class="re1">$SAGE_ROOT</span>/<span class="kw3">local</span>/bin/python mandel.py<br />
&nbsp;</div>
<p>and on a multiprocessor machine by replacing <code>-np 1</code> with the number of processors we&#8217;d want to utilize.</p>
<p>On the quad kernel workhorse my workgroup uses, which currently has two processors fully utilized by group cohomology computations, I get the following results (approximates):</p>
<table>
<tr>
<th># proc</th>
<th>mean walltime</th>
<th>std.dev</th>
</tr>
<tr>
<td>1</td>
<td>12s</td>
<td>0.7</td>
</tr>
<tr>
<td>2</td>
<td>9s</td>
<td>0.7</td>
</tr>
<tr>
<td>3</td>
<td>11s</td>
<td>2</td>
</tr>
</table>
<p>So - once I used up the free processors, the wall time shoots up, and the spread shoots up. So working on a utilized SMP machine might not be the way to go.</p>
<p>But I do have access to the Jena Beowulf cluster, since the lecture course I audited on cluster computing. And I&#8217;m getting much better results there. Over there, I run jobs by writing a job script</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="re3">#$ -j y</span><br />
<span class="re3">#$-l <span class="re2">hostshare=</span><span class="nu0">1.0</span></span><br />
<span class="re3">#$-q fast.q</span></p>
<p>mpiexec python mandel.py<br />
&nbsp;</div>
<p>and submit it to the job scheduler, to work on - say - 3 processors with </p>
<div class="dean_ch" style="white-space: wrap;">
qsub -pe lam7 <span class="nu0">3</span> mandel.job<br />
&nbsp;</div>
<p>I added commands to time the computation part - stripping out the book-keeping and image writing once the fractal is computed, and thus can get timings for the parallel computation.</p>
<p>As a result, I get the following:</p>
<table>
<tr>
<th># proc</th>
<th>mean walltime</th>
<th>std.dev</th>
</tr>
<tr>
<td>1</td>
<td>8.33</td>
<td>-</td>
</tr>
<tr>
<td>2</td>
<td>4.34</td>
<td>0.020</td>
</tr>
<tr>
<td>3</td>
<td>2.96</td>
<td>0.033</td>
</tr>
<tr>
<td>4</td>
<td>2.32</td>
<td>0.031</td>
</tr>
<tr>
<td>5</td>
<td>2.00</td>
<td>0.060</td>
</tr>
<tr>
<td>6</td>
<td>1.54</td>
<td>0.019</td>
</tr>
<tr>
<td>7</td>
<td>1.29</td>
<td>0.040</td>
</tr>
<tr>
<td>8</td>
<td>1.22</td>
<td>0.028</td>
</tr>
<tr>
<td>9</td>
<td>1.04</td>
<td>0.017</td>
</tr>
<tr>
<td>10</td>
<td>1.00</td>
<td>0.030</td>
</tr>
</table>
<p><img src="http://chart.apis.google.com/chart?chs=250x100&amp;cht=lc&amp;chd=t:83.3,43.3,29.5,23.2,20.0,15.4,12.9,12.2,10.4,10.0"><br />
Walltimes</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/05/parallell-and-cluster-mpi4py/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tour dates</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/03/tour-dates/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/03/tour-dates/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 21:57:16 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[A-infinity]]></category>

		<category><![CDATA[Conferencing]]></category>

		<category><![CDATA[Mathematics]]></category>

		<category><![CDATA[PhD]]></category>

		<category><![CDATA[Topology]]></category>

		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/03/tour-dates/</guid>
		<description><![CDATA[Edited to add Galway
I&#8217;ll be doing a &#8220;US tour&#8221; in March / April. For the people who might be interested - here are my whereabouts, and my speaking engagements.
I&#8217;m booked at several different seminars to do the following:
Title: On the computation of A-infinity algebras and Ext-algebras
Abstract:

For a ring R, the Ext algebra  carries rich [...]]]></description>
			<content:encoded><![CDATA[<p><i>Edited to add Galway</i></p>
<p>I&#8217;ll be doing a &#8220;US tour&#8221; in March / April. For the people who might be interested - here are my whereabouts, and my speaking engagements.</p>
<p>I&#8217;m booked at several different seminars to do the following:</p>
<p>Title: On the computation of A-infinity algebras and Ext-algebras<br />
Abstract:<br />
<blockquote>
For a ring R, the Ext algebra <img src='/latexrender/pictures/5563a453aab59e4a7cef44b395808da0.png' title='Ext_R^*(k,k)' alt='Ext_R^*(k,k)' align='middle' /> carries rich information about the ring and its module category. The algebra <img src='/latexrender/pictures/5563a453aab59e4a7cef44b395808da0.png' title='Ext_R^*(k,k)' alt='Ext_R^*(k,k)' align='middle' /> is a finitely presented k-algebra for most nice enough rings. Computation of this ring is done by constructing a projective resolution P of k and either constructing the complex <img src='/latexrender/pictures/5c02ff5cd87ca10e31810820b3b789db.png' title='Hom(P_n,k)' alt='Hom(P_n,k)' align='middle' /> or equivalently constructing the complex <img src='/latexrender/pictures/9e644a85168706f366d14b30e4c6b300.png' title='Hom(P,P)' alt='Hom(P,P)' align='middle' />. By diligent choice of computational route, the computation can be framed as essentially computing the homology of the differential graded algebra <img src='/latexrender/pictures/9e644a85168706f366d14b30e4c6b300.png' title='Hom(P,P)' alt='Hom(P,P)' align='middle' />.</p>
<p>Being the homology of a dg-algebra, <img src='/latexrender/pictures/5563a453aab59e4a7cef44b395808da0.png' title='Ext_R^*(k,k)' alt='Ext_R^*(k,k)' align='middle' /> has an induced A-infinity structure. This structure, has been shown by Keller and by Lu-Palmieri-Wu-Zhang, can be used to reconstruct R from<br />
<img src='/latexrender/pictures/dd7346064e7679a9d8f04a44107c6431.png' title='Ext_R^{\leq 2}(k,k)' alt='Ext_R^{\leq 2}(k,k)' align='middle' />.</p>
<p>In this talk, we shall discuss the computation of <img src='/latexrender/pictures/5563a453aab59e4a7cef44b395808da0.png' title='Ext_R^*(k,k)' alt='Ext_R^*(k,k)' align='middle' /> and methods for computing an A-infinity structure on the Ext algebra. Examples will be drawn from group cohomology, where the computation of the Ext algebra has conditions from Benson and Carlson for recognizing whether a partial computation has the entire structure.                                          </p></blockquote>
<p>Talk dates are:<br />
March:<br />
19 - Stockholm University<br />
26 - UPenn<br />
27 - Millersville<br />
29/30 - Graduate Student Topology Conference, UIUC<br />
April:<br />
8 - Stanford<br />
11 - U Washington, Seattle<br />
May:<br />
8 - NUI Galway</p>
<p>I will be in Millersville, with occasional visits to UPenn during March 25-28 and April 10-20. I&#8217;ll be somewhere in Illinois most of March 28, and at UIUC for the GSTC 29-30. I&#8217;ll be at MSRI March 31-April 4, and then at Stanford April 4-10.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/03/tour-dates/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Introduction to Algebraic Geometry (3 in a series)</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/03/introduction-to-algebraic-geometry-3-in-a-series/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/03/introduction-to-algebraic-geometry-3-in-a-series/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 14:37:58 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Algebra]]></category>

		<category><![CDATA[Algebraic geometry]]></category>

		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Mathematics]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/03/introduction-to-algebraic-geometry-3-in-a-series/</guid>
		<description><![CDATA[I&#8217;m going to move on with the identification of geometric objects with functions from these objects down to a field soon enough, but I&#8217;d like to spend a little time nailing down the categorical language of this association. Basically, we have two functors I and V going back and forth between two categories. And the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to move on with the identification of geometric objects with functions from these objects down to a field soon enough, but I&#8217;d like to spend a little time nailing down the categorical language of this association. Basically, we have two functors I and V going back and forth between two categories. And the essential statement of the last post is that these two functors form an equivalence of categories.</p>
<p>Now, first off in this categorical language, I want to nail down exactly what the objects are. In the category <img src='/latexrender/pictures/ad9c5aca753932fe6e45672e1941d82f.png' title='\mathcal{AV}ar_k' alt='\mathcal{AV}ar_k' align='middle' /> the objects are solution sets of systems of polynomial equations. And in the category <img src='/latexrender/pictures/b5655648e330b813df29c47685b3f653.png' title='\mathcal{RA}lg_k' alt='\mathcal{RA}lg_k' align='middle' />, the objects are finitely presented Noetherian reduced k-algebras.</p>
<p>The functor <img src='/latexrender/pictures/ad2bbacf81ace3b6fd39e64b2f038a79.png' title='V:\mathcal{RA}lg_k\to \mathcal{AV}ar_k' alt='V:\mathcal{RA}lg_k\to \mathcal{AV}ar_k' align='middle' /> acts on objects by sending an algebra R to the solution set of the polynomial equations generating the ideal in a presentation of the algebra.</p>
<p>And the functor <img src='/latexrender/pictures/5e921306cbfd443eeb1a2ef868175e24.png' title='I:\mathcal{AV}ar_k\to \mathcal{RA}lg_k' alt='I:\mathcal{AV}ar_k\to \mathcal{RA}lg_k' align='middle' /> takes a variety to the algebra of polynomial functions on the variety. This is a slight modification to the way I&#8217;ve introduced I in the previous posts - but the good news is that I(V) is the quotient of the right polynomial ring with the previously defined I(V).</p>
<h2>Morphisms on varieties</h2>
<p>In order to define a category, it&#8217;s not enough with the objects - we want morphisms as well. Since everything else is defined by polynomials, we&#8217;re going to define a morphism of varieties <img src='/latexrender/pictures/88bb990cfa90788a59705302ee7b5697.png' title='V\to W' alt='V\to W' align='middle' /> to be a map <img src='/latexrender/pictures/77abf6ed51ee3ba7e6a4964c968274ab.png' title='\mathbb A^n\to\mathbb A^m' alt='\mathbb A^n\to\mathbb A^m' align='middle' />, polynomial in each coordinate, such that the image of the restriction to the variety <img src='/latexrender/pictures/a0d9814e229150f7347974a01bd9885f.png' title='V\subseteq\mathbb A^n' alt='V\subseteq\mathbb A^n' align='middle' /> is contained in <img src='/latexrender/pictures/03cce3ca93d255d6e005d6df9043d412.png' title='W\subseteq\mathbb A^m' alt='W\subseteq\mathbb A^m' align='middle' />.</p>
<p>In other words, it is a map <img src='/latexrender/pictures/ff558b3aaadb6754a119dd20600734a6.png' title='(x_1,\dots,x_n)\mapsto(f_1(x_1,\dots,x_n),\dots,f_m(x_1,\dots,x_n))' alt='(x_1,\dots,x_n)\mapsto(f_1(x_1,\dots,x_n),\dots,f_m(x_1,\dots,x_n))' align='middle' /> defined by polynomials <img src='/latexrender/pictures/312d9bcb125a3799fad4b84f6991b12e.png' title='f_1,\dots,f_m' alt='f_1,\dots,f_m' align='middle' />.</p>
<p>An isomorphism of varieties is exactly what we expect it to be - it is a morphism that has an inverse.</p>
<p>One specific kind of highly interesting isomorphisms are the linear automorphisms of <img src='/latexrender/pictures/e75c212414a6a6750f34b305153b0648.png' title='\mathbb A^n' alt='\mathbb A^n' align='middle' />. These are given, essentially, by invertible change-of-coordinate matrices in the way we are used to from linear algebra. </p>
<h3>Examples</h3>
<p>Recall from the earlier posts the twisted cubic curve <img src='/latexrender/pictures/a821c4a9f5431350d01ff39b028e2a3d.png' title='V(x-y^2,x-z^3)' alt='V(x-y^2,x-z^3)' align='middle' />. Points on it have the form <img src='/latexrender/pictures/19f66dbddba8ea791961821590ae1d5e.png' title='(s,s^2,s^3)' alt='(s,s^2,s^3)' align='middle' /> - and this, incidentially, gives us precisely a map <img src='/latexrender/pictures/f406f0a4b8c4fa5e07359e57d824aab5.png' title='\mathbb A^1\to\mathbb A^3' alt='\mathbb A^1\to\mathbb A^3' align='middle' /> displaying an isomorphism between the twisted cubic curve and the affine line. The inverse is given by <img src='/latexrender/pictures/8e6e7f06e5038c6ccb179b83f4c76c68.png' title='(x,y,z)\mapsto x' alt='(x,y,z)\mapsto x' align='middle' />. </p>
<p>Consider the parabola <img src='/latexrender/pictures/49234b47786c5e019eec30ef3f77019a.png' title='V(x-y^2)' alt='V(x-y^2)' align='middle' />. This is also isomorphic to the affine line, over the maps <img src='/latexrender/pictures/d0b89cda9761a4603b976aa6d5a04b39.png' title='t\mapsto(t,t^2)' alt='t\mapsto(t,t^2)' align='middle' /> and <img src='/latexrender/pictures/32edafbf1ff3665f4b9cd387f1e81d8c.png' title='(x,y)\mapsto x' alt='(x,y)\mapsto x' align='middle' />.</p>
<p>On the other hand, the affine line is not isomorphic to the nodal curve <img src='/latexrender/pictures/e313f494986a12def52f0e61484c018f.png' title='V(y^2-x^2-x^3)' alt='V(y^2-x^2-x^3)' align='middle' />. The easiest way to show this is to go over smoothness of curves and singular points - which I hope to deal with later at some point. Essentially, smoothness is an invariant of varieties under isomorphisms, and since the point (0,0) is singular on the nodal curve, and the affine line has no singular points, the two varieties can not possibly be isomorphic.</p>
<p>Note that images of varieties need not be affine algebraic varieties - they will, however, always be <i>quasi-projective</i> varieties. We&#8217;ll see if I get into this later on.</p>
<h2>Morphisms of algebras and functoriality of V and I</h2>
<p>We really do already know what morphisms look like in <img src='/latexrender/pictures/b5655648e330b813df29c47685b3f653.png' title='\mathcal{RA}lg_k' alt='\mathcal{RA}lg_k' align='middle' />. This category is the full subcategory of the category of k-algebras - by which we mean that it picks out objects among k-algebras, and have all k-algebra maps between objects as morphisms.</p>
<p>The really awesome bit happens when we start considering the morphisms we&#8217;ve defined. Given a morphism <img src='/latexrender/pictures/47b3a34fa2ec6da6d58a234edbfd0d7b.png' title='F:V\to W' alt='F:V\to W' align='middle' />, we define the pullback <img src='/latexrender/pictures/58d9d4ce1976a966882e7c82d82b3b16.png' title='F^\#:k[W]\to k[V]' alt='F^\#:k[W]\to k[V]' align='middle' /> by <img src='/latexrender/pictures/c21edb1fa4fc99d6f96144f3abbad346.png' title='F^\#(f)=f\circ F' alt='F^\#(f)=f\circ F' align='middle' />. This takes a map <img src='/latexrender/pictures/0a5561ce152d5d314411bb9f4df4718d.png' title='f:W\to k' alt='f:W\to k' align='middle' /> and makes a map <img src='/latexrender/pictures/7d5999df6f5822fbdbd7e461e5614664.png' title='F^\#(f):V\to k' alt='F^\#(f):V\to k' align='middle' />. Since this is a composition of polynomials, it is also a polynomial function. If <img src='/latexrender/pictures/99089dce014558ee490160cba954f89e.png' title='f\in I(V)' alt='f\in I(V)' align='middle' />, then <img src='/latexrender/pictures/6ba86ecf71bf4f9bc3b3507743e71970.png' title='F^\#(f)(p)=f(F(p))' alt='F^\#(f)(p)=f(F(p))' align='middle' />, and since <img src='/latexrender/pictures/c9ecad04fff1e0a26cd5ab52b4e4264a.png' title='F(p)\in V' alt='F(p)\in V' align='middle' />, it follows that <img src='/latexrender/pictures/65cef750edb74dcc5a332a39cf4bf100.png' title='f(F(p))=0' alt='f(F(p))=0' align='middle' />, and thus <img src='/latexrender/pictures/b90b16491539207246328339b7815826.png' title='F^\#(f)\in I(W)' alt='F^\#(f)\in I(W)' align='middle' />.</p>
<p>In the other direction, suppose that R and S are reduced finitely generated k-algebras. Then <img src='/latexrender/pictures/a9e1d837f0532588473cb1ab5c2018c2.png' title='R=k[x_1,\dots,x_r]/I' alt='R=k[x_1,\dots,x_r]/I' align='middle' />, and <img src='/latexrender/pictures/10466ee4c934178961c960b6eb8d00df.png' title='S=k[y_1,\dots,y_s]/J' alt='S=k[y_1,\dots,y_s]/J' align='middle' />. We fix a homomorphism <img src='/latexrender/pictures/9a137544a74c2d34def9f6ada25d0fa0.png' title='\sigma:R\to S' alt='\sigma:R\to S' align='middle' />, and we wish to construct a variety morphism <img src='/latexrender/pictures/800618943025315f869e4e1f09471012.png' title='F' alt='F' align='middle' /> such that <img src='/latexrender/pictures/355d967e735aa975780820018f9fa12d.png' title='F^\#=\sigma' alt='F^\#=\sigma' align='middle' />.</p>
<p>Let <img src='/latexrender/pictures/824ff39cf03c28e185367a8974a30aeb.png' title='F_i\in k[y_1,\dots,y_s]' alt='F_i\in k[y_1,\dots,y_s]' align='middle' /> be a representative of <img src='/latexrender/pictures/f35d2abca0690e7b10a5f2bb687554e2.png' title='\sigma(x_i)' alt='\sigma(x_i)' align='middle' />, and define <img src='/latexrender/pictures/04490679b59f37969f27d96ed4d006e6.png' title='F:\mathbb A^s\to \mathbb A^r' alt='F:\mathbb A^s\to \mathbb A^r' align='middle' /> by <img src='/latexrender/pictures/0052ae45694c9a8049b97f0611d1bc89.png' title='a\mapsto(F_1(a),\dots,F_r(a))' alt='a\mapsto(F_1(a),\dots,F_r(a))' align='middle' />. We need to verify that F maps V to W. This follows if we can only show that for every <img src='/latexrender/pictures/74b772ed1f57705570a5d329409a237f.png' title='a\in V' alt='a\in V' align='middle' />, all polynomials in I vanish on F(a). Let <img src='/latexrender/pictures/dd8b6e371f0037673846188fda7a78ec.png' title='g\in I' alt='g\in I' align='middle' />. Then<br />
<img src='/latexrender/pictures/3085e2eef4109a4f710816b4afda4c87.png' title='g(F(a))=g(F_1(a),\dots,F_r(a))=g(\sigma(x_1)(a),\dots,\sigma(x_r)(a))=\sigma(g)(a)' alt='g(F(a))=g(F_1(a),\dots,F_r(a))=g(\sigma(x_1)(a),\dots,\sigma(x_r)(a))=\sigma(g)(a)' align='middle' /><br />
and since <img src='/latexrender/pictures/dd8b6e371f0037673846188fda7a78ec.png' title='g\in I' alt='g\in I' align='middle' />, it represents the zero class of <img src='/latexrender/pictures/94480f1b196cbb24f2c8bacf58bccb5f.png' title='k[x_1,\dots,x_r]/I' alt='k[x_1,\dots,x_r]/I' align='middle' />, so <img src='/latexrender/pictures/7e0fb729f38d2e86c8580d5abddfe08f.png' title='\sigma(g)=0' alt='\sigma(g)=0' align='middle' /> and hence <img src='/latexrender/pictures/6ba5f00aca6154941916eea5de601783.png' title='\sigma(g)\in J' alt='\sigma(g)\in J' align='middle' />. But J is the ideal of all functions vanishing on V. Hence <img src='/latexrender/pictures/32c6c0c4bca4004c0b77bf54a50b8547.png' title='F(a)\in W' alt='F(a)\in W' align='middle' />, and the proof is complete.</p>
<p>In essence, what this proves to us is that the operations V and I form a contravariant equivalence of categories between <img src='/latexrender/pictures/1b8e7d068548e01cd73072b4dbffdb3a.png' title='V:\mathcal{RA}lg_k' alt='V:\mathcal{RA}lg_k' align='middle' /> and <img src='/latexrender/pictures/ad9c5aca753932fe6e45672e1941d82f.png' title='\mathcal{AV}ar_k' alt='\mathcal{AV}ar_k' align='middle' />.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/03/introduction-to-algebraic-geometry-3-in-a-series/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Introduction to Algebraic Geometry (2 in a series)</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-2-in-a-series/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-2-in-a-series/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 21:43:46 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Algebra]]></category>

		<category><![CDATA[Algebraic geometry]]></category>

		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Mathematics]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-2-in-a-series/</guid>
		<description><![CDATA[I want to lead this sequence to the point where I am having trouble understanding algebraic geometry. Hence, I won&#8217;t take the usual course such an introduction would take, but rather set the stage  reasonably quickly to make the transit to the more abstract themes clear.
But that&#8217;s all a few posts away. For now, [...]]]></description>
			<content:encoded><![CDATA[<p>I want to lead this sequence to the point where I am having trouble understanding algebraic geometry. Hence, I won&#8217;t take the usual course such an introduction would take, but rather set the stage  reasonably quickly to make the transit to the more abstract themes clear.</p>
<p>But that&#8217;s all a few posts away. For now, recall that we recognized already that any variety is defined by an ideal, and that intersections and unions of varieties are given by sums and intersections or products of ideals.</p>
<p>This is the first page of what is known as the Algebra-Geometry dictionary. The dictionary is made complete by a pair of reasonably famous theorems. I won&#8217;t bother proving them - the proofs are a good chunk of any decent commutative algebra course - but I&#8217;ll quote the theorems and discuss why they matter.</p>
<p>We call a ring Noetherian if all ideals are finitely generated. If a ring R is Noetherian, then quotients are Noetherian.</p>
<p><b>Hilbert&#8217;s Basis Theorem:</b> If R is Noetherian, then so is R[x].</p>
<p>We define the radical <img src='/latexrender/pictures/4bd65db8055fe5cdb1ee85f1073c8661.png' title='\sqrt I' alt='\sqrt I' align='middle' /> of an ideal I to be the ideal consisting of all elements a such that some power of a is actually in I. We call an ideal I <i>radical</i> if <img src='/latexrender/pictures/7968b9f14c3a27f504c104cd11f19a60.png' title='I=\sqrt I' alt='I=\sqrt I' align='middle' />. This concept is relevant for our considerations since if for a point p the function f^n(p) vanishes, then f(p) also vanishes. Thus, the set of points such that f^n vanishes is the same set as the set of points where f vanishes. The relevancy of this is captured in:</p>
<p><b>Hilbert&#8217;s Nullstellensatz:</b> Let k be an algebraically closed field. For any ideal I in <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' />, there is an equality of ideals<br />
<img src='/latexrender/pictures/a900c9759a5cbcc1f3e700dd110e7e5c.png' title='I(V(I))=\sqrt I' alt='I(V(I))=\sqrt I' align='middle' /></p>
<p>Note, for the statement of this theorem that we write V(I) for the variety defined by simultaneous vanishing of all elements in I, and we write I(V) for the ideal of all polynomials in <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' /> that vanish on all of I(V). </p>
<p>So - and here is the beautiful part - affine algebraic varieties correspond bijectively to radical ideals in polynomial rings. For every ideal, there is a variety and for every variety, there is an ideal. But we can push this further.</p>
<h2>Coordinate rings</h2>
<p>Let&#8217;s consider polynomial functions from <img src='/latexrender/pictures/e75c212414a6a6750f34b305153b0648.png' title='\mathbb A^n' alt='\mathbb A^n' align='middle' /> to k. These are precisely the polynomials in <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' />.  Given a variety V, we can take a polynomial <img src='/latexrender/pictures/7346c23f9188b822dc31297afce98edf.png' title='f\in k[x_1,\dots,x_n]' alt='f\in k[x_1,\dots,x_n]' align='middle' /> and restrict it to a function <img src='/latexrender/pictures/3a8276462b14ee9342582be8695e0872.png' title='f|_V:V\to k' alt='f|_V:V\to k' align='middle' />.</p>
<p>Two different polynomials give the same restricted function precisely when their difference vanishes on all of V. So polynomial functions on V are precisely the equivalence classes in the quotient ring <img src='/latexrender/pictures/54d7d4e6c0660e03259875db941611fd.png' title='k[x_1,\dots,x_n]/I(V)' alt='k[x_1,\dots,x_n]/I(V)' align='middle' />. We call the resulting ring the <i>coordinate ring</i> and denote it by k[V].</p>
<p>Conversely, if R is a Noetherian k-algebra such that there are no nilpotent elements in R, then R is a quotient of some polynomial ring with some radical ideal. Hence it is the coordinate ring of some variety in some affine space somewhere. We call a ring lacking nilpotents <i>reduced</i>. </p>
<p>We get, out of all this, a bijective correspondence<br />
{ Noetherian reduced k-algebras } <img src='/latexrender/pictures/19401793ec61890d228748bce42da457.png' title='\leftrightarrow' alt='\leftrightarrow' align='middle' /> { Affine algebraic varieties }</p>
<p>The really beautiful part will come in my next post. We can introduce homomorphisms of varieties in a reasonably natural way so that this bijective correspondence ends up being <i>functorial</i> - i.e. any homomorphisms on one side gives rise to a corresponding homomorphism on the other side. Thus, the categories of Noetherian reduced k-algebras and of affine algebraic varieties are equivalent.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-2-in-a-series/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Introduction to Algebraic Geometry (1 in a series)</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-1-in-a-series/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-1-in-a-series/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 11:33:00 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Algebra]]></category>

		<category><![CDATA[Algebraic geometry]]></category>

		<category><![CDATA[English]]></category>

		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Mathematics]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-1-in-a-series/</guid>
		<description><![CDATA[I&#8217;m growing embarrassed by my lack of understanding for the sheaf-theoretic approaches to algebraic (and differential) geometry. I&#8217;ve tried to deal with it several times before, and I&#8217;m currently reading up on Algebraic Geometry again to fill the void that the finished thesis, soon arriving travels and non-existent job application responses produce.
So, why not learn [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m growing embarrassed by my lack of understanding for the sheaf-theoretic approaches to algebraic (and differential) geometry. I&#8217;ve tried to deal with it several times before, and I&#8217;m currently reading up on Algebraic Geometry again to fill the void that the finished thesis, soon arriving travels and non-existent job application responses produce.</p>
<p>So, why not learn by teaching? It&#8217;s an approach that has been pretty darn good in the past. So I thought I&#8217;d write a sequence of posts on algebraic geometry, introducing what it&#8217;s supposed to be about and how the main viewpoints develop more or less naturally from the approaches taken.</p>
<h2>Varieties</h2>
<p>The basic objective of algebraic geometry is to study solution sets to systems of polynomial equations. That is, we take some set <img src='/latexrender/pictures/1390c486ce69cc6b0865fafef40a25b1.png' title='f_1,\dots,f_r' alt='f_1,\dots,f_r' align='middle' /> of polynomials in some polynomial ring <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' /> over some field <img src='/latexrender/pictures/8ce4b16b22b58894aa86c421e8759df3.png' title='k' alt='k' align='middle' />. And we write <img src='/latexrender/pictures/421328c5ab67bd781629a1cb95f6ae70.png' title='V(f_1,\dots,f_r)' alt='V(f_1,\dots,f_r)' align='middle' /> for the set of all simultaneous roots to all these polynomials:<br />
<img src='/latexrender/pictures/73b0e367b655a2fafacf4f0b97de31e1.png' title='V(f_1,\dots,f_r)=\{p\in k^n:f_1(p)=0, \dots, f_r(p)=0\}' alt='V(f_1,\dots,f_r)=\{p\in k^n:f_1(p)=0, \dots, f_r(p)=0\}' align='middle' /></p>
<p>If we write our polynomials as coming from the ring <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' />, then the corresponding solution points will be points in the vector space <img src='/latexrender/pictures/aafabbf195eb3424ca815b9afe5caff1.png' title='k^n' alt='k^n' align='middle' />. In order to emphasize that we do not care for the vector space structure of this space, we shall denote it with <img src='/latexrender/pictures/e75c212414a6a6750f34b305153b0648.png' title='\mathbb A^n' alt='\mathbb A^n' align='middle' />, or if we want to emphasize the field, with <img src='/latexrender/pictures/b5f865c4e2e101f41565160abe202464.png' title='\mathbb A^n_k' alt='\mathbb A^n_k' align='middle' />. </p>
<p>The first observation at this point is that if we take the polynomial <img src='/latexrender/pictures/2cd3b198cc2d1805468e336d663e92cb.png' title='x^2+1' alt='x^2+1' align='middle' />, then the solution set over <img src='/latexrender/pictures/07e5a4a56a57f5c874ebf79bb67a0b18.png' title='\mathbb R' alt='\mathbb R' align='middle' /> is empty, while the solution set over <img src='/latexrender/pictures/b36eac3d201a1a25dda928990a79d751.png' title='\mathbb C' alt='\mathbb C' align='middle' /> is not. So, in order to set all solution sets on an equal footing - and also to make the later occurring correspondences work out - we shall require <img src='/latexrender/pictures/8ce4b16b22b58894aa86c421e8759df3.png' title='k' alt='k' align='middle' /> to be an algebraically closed field. In other words, we can always find a root to any polynomial.</p>
<p>We call the solution sets <i>varieties</i> (or - in order to distinguish from everything else we might encounter, we shall call them <i>affine algebraic varieties</i>).</p>
<p>So, the study of solutions to systems of polynomial equations is the study of varieties. And hence geometry. This neatly expands on the classical linear algebra viewpoint - where we study systems of linear equations as intersections of planes. It turns out that the main computational approach - Gröbner bases - actually specializes to the Gauß algorithm on matrices if we specialize to linear systems of equations.</p>
<h3>Examples</h3>
<p>The unit circle is an affine variety, given by the vanishing of <img src='/latexrender/pictures/3977406a9c38913879d488d5e68c6520.png' title='x^2+y^2-1' alt='x^2+y^2-1' align='middle' />. The hyperbola <img src='/latexrender/pictures/6a2d024426c0c93cbf6641b8380e2dd6.png' title='xy-1' alt='xy-1' align='middle' /> and the parabola <img src='/latexrender/pictures/30cdb631bd165a5b08ec12d1b0d4ddf1.png' title='y-x^2' alt='y-x^2' align='middle' /> are also affine varieties.</p>
<p>Another very commonly used example is the twisted cubic curve - given by the simultaneous vanishing of the parabolic sheet <img src='/latexrender/pictures/30cdb631bd165a5b08ec12d1b0d4ddf1.png' title='y-x^2' alt='y-x^2' align='middle' /> and the cubic curve sheet <img src='/latexrender/pictures/2ad4639fdd5531832be18110513c7f22.png' title='z-x^3' alt='z-x^3' align='middle' />.</p>
<h2>Changing the defining equations</h2>
<p>The points p at which both f and g vanish are the same points as those where f and f+g vanish. Indeed, if f(p)=0 and g(p)=0, then (f+g)(p)=0 as well, so the points in V(f,g) are all contained in V(f,f+g). On the other hand, suppose that f(p)=0 and (f+g)(p)=0. Then 0=(f+g)(p)=f(p)+g(p)=0+g(p). So g(p)=0 as well. Hence, all points in V(f,f+g) are contained in V(f,g). So the two varieties are equal.</p>
<p>Suppose that <img src='/latexrender/pictures/ce971a1993da574a7c38d708582ca8ea.png' title='p\in V(f,\dots)' alt='p\in V(f,\dots)' align='middle' />. Then for any h=fg we&#8217;ll see that h(p)=f(p)g(p)=0g(p)=0. Hence, if f vanishes at p, then every polynomial that f divides will also vanish at p.</p>
<p>Now, a set of polynomials in <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' /> that is closed under addition and multiplication by elements from <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' /> is an <i>ideal</i> of the polynomial ring. Thus, these considerations convince us that the set of all polynomials in <img src='/latexrender/pictures/1de8377bc00a12d8d4e4641774350142.png' title='k[x_1,\dots,x_n]' alt='k[x_1,\dots,x_n]' align='middle' /> that all vanish on all points in <img src='/latexrender/pictures/421328c5ab67bd781629a1cb95f6ae70.png' title='V(f_1,\dots,f_r)' alt='V(f_1,\dots,f_r)' align='middle' /> is in fact an ideal. </p>
<p>So we can define the variety from an ideal - given <img src='/latexrender/pictures/5bddc0766ff957acc660c8d5a63c6053.png' title='I\in k[x_1,\dots,x_n]' alt='I\in k[x_1,\dots,x_n]' align='middle' />, we write V(I) for the set of all points <img src='/latexrender/pictures/ed19d38fb0dbbf1787afbbf228a9133d.png' title='p\in\mathbb A^n' alt='p\in\mathbb A^n' align='middle' /> such that f(p)=0 for all <img src='/latexrender/pictures/1b4e910cd8af4b5c4899976bf945ec4b.png' title='f\in I' alt='f\in I' align='middle' />.</p>
<p>The sum of two ideals I and J are the set of all elements on the form f+g where f is from I and g is from J. If I is generated by <img src='/latexrender/pictures/1390c486ce69cc6b0865fafef40a25b1.png' title='f_1,\dots,f_r' alt='f_1,\dots,f_r' align='middle' /> and J is generated by <img src='/latexrender/pictures/f73102dc281850625bd26dd4528ae267.png' title='g_1,\dots,g_s' alt='g_1,\dots,g_s' align='middle' />, then I+J has generators <img src='/latexrender/pictures/2af066e9b2d8c917659b240f409c9260.png' title='f_1,\dots,f_r,g_1,\dots,g_s' alt='f_1,\dots,f_r,g_1,\dots,g_s' align='middle' />. And the set of points where all the polynomials in I+J vanish are precisely the points where all polynomials in I vanish <b>and</b> all polynomials in J vanish. Hence <img src='/latexrender/pictures/e0db24317effc56d994c5562d0cb448c.png' title='V(I+J)=V(I)\cap V(J)' alt='V(I+J)=V(I)\cap V(J)' align='middle' />.</p>
<p>The product IJ of two ideals I and J is <i>generated by</i> all products of one element from I and one from J. Hence, an element of IJ is on the form <img src='/latexrender/pictures/30ad3a86de244ae7f4b526c1f87e74a0.png' title='f_1g_1+\dots+f_tg_t' alt='f_1g_1+\dots+f_tg_t' align='middle' /> with all the <img src='/latexrender/pictures/59bdf0ba696e13164c5a926386f23cb0.png' title='f_i' alt='f_i' align='middle' /> coming from I and all the <img src='/latexrender/pictures/8d2d80ef00296b9ed491d989b30cebd1.png' title='g_j' alt='g_j' align='middle' /> coming from J. Suppose p is in V(IJ). Then for all f in I and all g in J, f(p)g(p)=0. If for all f in I, f(p)=0, then p is in V(I). Otherwise we can find some <img src='/latexrender/pictures/78155d2ec4b025a5ac903d6f8611756c.png' title='f_0' alt='f_0' align='middle' /> such that <img src='/latexrender/pictures/ab97a49df554c52b299d52592994a023.png' title='f_0(p)=0' alt='f_0(p)=0' align='middle' />. But then since <img src='/latexrender/pictures/29f46b78756dc0ab080236ed980a5f50.png' title='f_0(p)g(p)=0' alt='f_0(p)g(p)=0' align='middle' /> for all g in J, we must have <img src='/latexrender/pictures/a38bc5cfe1943b7eac1b3730060482cd.png' title='g(p)=0' alt='g(p)=0' align='middle' /> for all g in J. Hence p is in V(J).<br />
Thus <img src='/latexrender/pictures/b8fe0d8bd1dac25031abbc996c901662.png' title='V(IJ)\subseteq V(I)\cup V(J)' alt='V(IJ)\subseteq V(I)\cup V(J)' align='middle' />.<br />
On the other hand, if p is in <img src='/latexrender/pictures/c62bf10d4226e06e1609d3e55795b7e6.png' title='V(I)\cup V(J)' alt='V(I)\cup V(J)' align='middle' /> then specifically either p is in V(I) or it is in V(J). Either way, for all f in I and all g in J, f(p)g(p)=0 since one of the factors certainly vanishes. Hence, p is in V(IJ).</p>
<p>We also do have that <img src='/latexrender/pictures/e0c59baf5837f5962f077d0d2f7c000f.png' title='V(I\cap J)=V(I)\cup V(J)' alt='V(I\cap J)=V(I)\cup V(J)' align='middle' />. Which of the ideal operations works best depends a bit on what we would like to <i>do</i> with it.</p>
<h3>Examples</h3>
<p>We can use the above discussion to actually <i>compute</i> things geometrically. The intersection of the circle <img src='/latexrender/pictures/bc33f6de26676290a237e01b8a5a3f41.png' title='V(x^2+y^2-1)' alt='V(x^2+y^2-1)' align='middle' /> with a line <img src='/latexrender/pictures/00b84bf2a5fd7f158877522fe56f9b5a.png' title='V(ax+by+c)' alt='V(ax+by+c)' align='middle' /> is given by the sum of the ideals - so we need to consider the ideal <img src='/latexrender/pictures/b8b1a683c0c431b7e99228048d66ce9f.png' title='(x^2+y^2-1,ax+by+c)' alt='(x^2+y^2-1,ax+by+c)' align='middle' /> in <img src='/latexrender/pictures/464f66865a3de21f2f2a6a2b9a594865.png' title='k[x,y]' alt='k[x,y]' align='middle' />. We could try to bash this out by just wrangling the corresponding equations, or we could systematize the wrangling. Systematizing it leads, basically, to the theory of Gröbner bases - and this is something I tend to avoid doing by hand if I can. Not doing it by hand looks like this:</p>
<pre>
$ Singular
                     SINGULAR                             /
 A Computer Algebra System for Polynomial Computations   /   version 3-0-2
                                                       0<
     by: G.-M. Greuel, G. Pfister, H. Schoenemann        \   July 2006
FB Mathematik der Universitaet, D-67653 Kaiserslautern    \
> ring R=0,(x,y),dp;
> ideal I=x^2+y^2-1,2*x-y;
> std(I);
_[1]=2x-y
_[2]=5y2-4
</pre>
<p>So one good set of generators for the ideal <img src='/latexrender/pictures/17f0e736fb07f21e69030ae7588a2cc9.png' title='(x^2+y^2-1,2x-y)' alt='(x^2+y^2-1,2x-y)' align='middle' /> would be <img src='/latexrender/pictures/baed4e0a9225276151aa20d11c978d64.png' title='(2x-y,5y^2-4)' alt='(2x-y,5y^2-4)' align='middle' />. This, in turn corresponds to the conditions <img src='/latexrender/pictures/db51cb7add5c262eb3c95f8a9ed722f9.png' title='y=\pm 2/\sqrt 5' alt='y=\pm 2/\sqrt 5' align='middle' /> and <img src='/latexrender/pictures/989211a1ba52351d7888cc4a803604c6.png' title='x=y/2' alt='x=y/2' align='middle' />. So we get two points - just as expected.</p>
<p>The equation wrangling, on the other hand, begins with recognizing that if both a and b are 0, then V(ax+by+c) is either empty or the entire plane. Both are rather boring, and easy to handle. So one of a and b is non-zero. Let&#8217;s say that a isn&#8217;t 0. Then we can rewrite ax+by+c=0 to <img src='/latexrender/pictures/76eee6741d3651ff483e15e86c455bc3.png' title='x=-\frac ba y-\frac ca' alt='x=-\frac ba y-\frac ca' align='middle' />. This can be inserted into the quadratic equation <img src='/latexrender/pictures/0d34c87c64f32752b59c9fc56b15ad09.png' title='x^2+y^2-1=0' alt='x^2+y^2-1=0' align='middle' /> to form the new equation <img src='/latexrender/pictures/41856b97b5f02a1fae412c2b07915ab5.png' title='(-\frac ba y-\frac ca)^2+y^2=1' alt='(-\frac ba y-\frac ca)^2+y^2=1' align='middle' />, which in turn expands to<br />
<img src='/latexrender/pictures/d7c6f23b7f88c3f0af3b50b9b16effa3.png' title='(1+\frac{b^2}{a^2})y^2+2\frac{b+c}ay+\frac{c^2}{a^2}=1' alt='(1+\frac{b^2}{a^2})y^2+2\frac{b+c}ay+\frac{c^2}{a^2}=1' align='middle' /><br />
which, in turn, we can easily solve using normal solution techniques for quadratic equations. To get rid of fractions, we&#8217;ll multiply the entire equation by <img src='/latexrender/pictures/ebc3d7bedc1f11e08895c3124001cbb5.png' title='a^2' alt='a^2' align='middle' /> yielding the new equation<br />
<img src='/latexrender/pictures/0241be1468ea35c3be47c52c65dbece9.png' title='(a^2+b^2)y^2+2a(b+c)y+c^2-a^2=0' alt='(a^2+b^2)y^2+2a(b+c)y+c^2-a^2=0' align='middle' /><br />
Now, the discriminant<br />
<img src='/latexrender/pictures/5d244e36043799199bc39a52bb16820e.png' title='\Delta=(2a(b+c))^2-4(b^2+a^2)(c^2-a^2)' alt='\Delta=(2a(b+c))^2-4(b^2+a^2)(c^2-a^2)' align='middle' /><br />
carries information about the nature of solutions. If <img src='/latexrender/pictures/b8151f6178433af03a399b1971d6448c.png' title='\Delta=0' alt='\Delta=0' align='middle' />, then the line V(ax+by+c) is a tangent to the circle, if <img src='/latexrender/pictures/da44aac94b82135888c080a06999d25a.png' title='\Delta&lt;0' alt='\Delta&lt;0' align='middle' />, then the intersections are all complex and if <img src='/latexrender/pictures/3ea7fefa1f6fc0d907e126d1ee5acc34.png' title='\Delta&gt;0' alt='\Delta&gt;0' align='middle' />, then the intersections are real. In both the non-tangent cases, the circle intersects the line exactly twice.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/introduction-to-algebraic-geometry-1-in-a-series/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scripting Games in Haskell</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/scripting-games-in-haskell/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/scripting-games-in-haskell/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 00:15:04 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Haskell]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/scripting-games-in-haskell/</guid>
		<description><![CDATA[I saw the Cerebrate solve the first Scripting Games challenge: Pairing off. And immediately thought &#8220;I can do that in Haskell too&#8221;.
So, here it is. 

import Data.List

cards = [(1,7),(0,5),(3,7),(2,7),(2,13)]

countpairs [] = 0
countpairs [a] = 0
countpairs (a:as) = length . filter (((snd a)==) . snd) $ as

pairingOff = sum . map countpairs . tails

And that&#8217;s that. [...]]]></description>
			<content:encoded><![CDATA[<p>I saw <a href="http://feeds.feedburner.com/~r/cerebratescontemplations/~3/238385247/scripting-games-event-1beginne.html">the Cerebrate solve</a> the first <a href="http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/bevent1.mspx">Scripting Games challenge: Pairing off</a>. And immediately thought &#8220;I can do that in Haskell too&#8221;.</p>
<p>So, here it is. </p>
<pre lang=haskell>
import Data.List

cards = [(1,7),(0,5),(3,7),(2,7),(2,13)]

countpairs [] = 0
countpairs [a] = 0
countpairs (a:as) = length . filter (((snd a)==) . snd) $ as

pairingOff = sum . map countpairs . tails
</pre>
<p>And that&#8217;s that. Alas, the actual competition only takes Perl, VBScript and PowerShell, so I won&#8217;t be submitting this.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/scripting-games-in-haskell/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PROPs and patches</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/props-and-patches/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/props-and-patches/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 18:59:26 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Algebra]]></category>

		<category><![CDATA[Category theory]]></category>

		<category><![CDATA[Operads and PROPs]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/props-and-patches/</guid>
		<description><![CDATA[Brent Yorgey wrote a post on using category theory to formalize patch theory. In the middle of it, he talks about the need to commute a patch to the end of a patch series, in order to apply a patch undoing it. He suggests a necessary condition to do this is that, given patches P [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://byorgey.wordpress.com">Brent Yorgey</a> wrote a post on <a href="http://byorgey.wordpress.com/2008/02/13/patch-theory-part-ii-some-basics/">using category theory to formalize patch theory</a>. In the middle of it, he talks about the need to commute a patch to the end of a patch series, in order to apply a patch undoing it. He suggests a necessary condition to do this is that, given patches P and Q, we need to be able to find patches Q&#8217; and P&#8217; such that PQ=Q&#8217;P', and preferably such that Q&#8217; and P&#8217; capture some of the info in P and Q.</p>
<p>However, as such, this is not enough to solve the issue. For one thing, we can set Q&#8217;=P and P&#8217;=Q, and things are the way he asks for.</p>
<p>Now, I wonder whether we can solve this by using PROPs (or possibly di-operads or something like that). Let&#8217;s represent a document as a list of some sort of tokens. We&#8217;ll set <img src='/latexrender/pictures/e4f7629b574dd05d19a2107c87806700.png' title='D_n' alt='D_n' align='middle' /> the set of all lists of length <img src='/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.png' title='n' alt='n' align='middle' />, and we&#8217;ll set <img src='/latexrender/pictures/8f771bc1b32729794ded2f43f30110d3.png' title='P_n^m' alt='P_n^m' align='middle' /> to denote operations that take a list of length n and returns a list of length m.</p>
<p>One operation here is obvious - the identity operation. So we&#8217;ll take that into the mix. And we&#8217;ll also want to have some manner of composing operations. So, set <img src='/latexrender/pictures/3b72682c4921e5ee163a8aa583f9ba9e.png' title='\circ_i:P_n^m\times P_r^s\to P_n^{m+s-r}' alt='\circ_i:P_n^m\times P_r^s\to P_n^{m+s-r}' align='middle' /> to be the operation that applies the second argument to the elements i,i+1,&#8230;,i+m of the list outputted by the first argument.</p>
<p>This way, we can make patch trees - using the identities to fill out when a patch doesn&#8217;t influence everything; and have composition of operations represent composition of patches.</p>
<p>Now, the commutativity that Brent asks for would manifest as an additional relation - on top of those inherent in the definition of a PROP - to rebuild trees. One obvious one pops out immediately - as long as the trees don&#8217;t overlap, in other words, as long as the subtree we want to reorganize is contractible (in the topological sense), we can commute patches freely.</p>
<p>When trees -do- overlap, however, the undo operation Brent asks for is much more tricky. Consider the following sequence of edits:</p>
<p>[] -> [a] -> [b] -> [cbd]</p>
<p>Now, undo the insertion of [a].</p>
<p>Sure, taken this way, we cheat a little. Maybe we want to restrict edit descriptions to explicit deletions and additions. So we would have</p>
<p>[] -> [a] -> [] -> [b] -> [cb] -> [cbd]</p>
<p>and here we could probably move things around a bit easier. I don&#8217;t quite see how to do it, right now, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/props-and-patches/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thesis written</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/thesis-written/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/thesis-written/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 13:13:30 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[English]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/thesis-written/</guid>
		<description><![CDATA[In a mean push, these last two weeks my advisor has read three different drafts of my thesis. And I&#8217;ve worked on getting the corrections in quickly. The last push started yesterday, when I got a bunch of corrections in the morning, had the last draft ready at 4pm, and then sat reading it myself [...]]]></description>
			<content:encoded><![CDATA[<p>In a mean push, these last two weeks my advisor has read three different drafts of my thesis. And I&#8217;ve worked on getting the corrections in quickly. The last push started yesterday, when I got a bunch of corrections in the morning, had the last draft ready at 4pm, and then sat reading it myself until 1am.</p>
<p>My advisor took it home with him, spent the evening on it, and had his batch of corrections in the morning.</p>
<p>Hence, today at 10-ish when I got myself in to the office, I had two batches of corrections in front of me, and a printer closing at 2pm. So I worked - and now, well, it&#8217;s done.</p>
<p>That&#8217;s it.</p>
<p>It&#8217;ll get printed.</p>
<p>Then read. </p>
<p>In May, we should get all the comments back from the external examiners.</p>
<p>In July, I&#8217;ll be up for two oral exams - one on homological algebra and its uses as invariants for commutative algebra; and one on parallell programming in cluster environments.</p>
<p>And on July 17th I plan to defend.</p>
<p>Damn - this is one heck of an adrenaline rush now.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/thesis-written/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My topology students move into knot theory</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/02/my-topology-students-move-into-knot-theory/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/02/my-topology-students-move-into-knot-theory/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 13:27:20 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[10th grade topology]]></category>

		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Mathematics]]></category>

		<category><![CDATA[Topology]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/02/my-topology-students-move-into-knot-theory/</guid>
		<description><![CDATA[So, here&#8217;s the plan for my 10th grade topology students.
Today, we&#8217;ll abandon algebraic topology completely, and instead go into knot theory. I&#8217;ll want to discuss what we mean by a knot (embedding of  in ), what we mean by a knot deformation (thus introducing isotopies while we&#8217;re at it) and the Reidemeister moves. Also [...]]]></description>
			<content:encoded><![CDATA[<p>So, here&#8217;s the plan for my 10th grade topology students.</p>
<p>Today, we&#8217;ll abandon algebraic topology completely, and instead go into knot theory. I&#8217;ll want to discuss what we mean by a knot (embedding of <img src='/latexrender/pictures/679c4c927f816045befe573024ddd21b.png' title='S^1' alt='S^1' align='middle' /> in <img src='/latexrender/pictures/903faf99a14b55b7ad3d1020786c49a8.png' title='S^3' alt='S^3' align='middle' />), what we mean by a knot deformation (thus introducing isotopies while we&#8217;re at it) and the Reidemeister moves. Also we&#8217;ll discuss knot invariants - and their use analogous to topological invariants.</p>
<p>Later on, we&#8217;ll continue with other invariants; definitely including the Jones polynomial, and possibly even covering Khovanov homology. One possible end report would be to explain a bunch of knot invariants and show using examples how these have different coarseness.</p>
<p><i>Edited to add:</i> I got myself some damn smart students. They figured out the Reidemeister moves on their own - as well as minimal crossing number in a projection being highly relevant - with basically no prompting from me. I&#8217;m impressed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/02/my-topology-students-move-into-knot-theory/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algebraic surface toys!</title>
		<link>http://blog.mikael.johanssons.org/archive/2008/01/algebraic-surface-toys/</link>
		<comments>http://blog.mikael.johanssons.org/archive/2008/01/algebraic-surface-toys/#comments</comments>
		<pubDate>Fri, 25 Jan 2008 16:58:27 +0000</pubDate>
		<dc:creator>Michi</dc:creator>
		
		<category><![CDATA[Algebra]]></category>

		<category><![CDATA[Algebraic geometry]]></category>

		<category><![CDATA[Geometry]]></category>

		<category><![CDATA[Jahr der Mathematik]]></category>

		<guid isPermaLink="false">http://blog.mikael.johanssons.org/archive/2008/01/algebraic-surface-toys/</guid>
		<description><![CDATA[At the start of the German Year of Mathematics, the Oberwolfach research institute has released an exhibition and the software they used to produce it. The software, surfer, is a really nice GUI that sits on top of surf and lets you rotate and zoom your algebraic surfaces as well as pick colours very comfortably.
They [...]]]></description>
			<content:encoded><![CDATA[<p>At the start of the <a href=http://www.jahr-der-mathematik.de/>German Year of Mathematics</a>, the <a href=http://www.mfo.de>Oberwolfach research institute</a> has released an exhibition and the software they used to produce it. The software, <a href=http://imaginary2008.de/surfer.php>surfer</a>, is a really nice GUI that sits on top of <a href=http://surf.sourceforge.net>surf</a> and lets you rotate and zoom your algebraic surfaces as well as pick colours very comfortably.</p>
<p>They have a whole bunch of Really Pretty Images at <a href=http://imaginary2008.de>the exhibition website</a>, and I warmly recommend a visit. If you can get hold of the exhibition, they also have produced real models - with a 3d-printer - of some of the snazzier surfaces, so that one could have a REALLY close encounter with them.</p>
<p>But also, I&#8217;d really like to show you some of my own minor experiments with the program.</p>
<p><img src="http://mikael.johanssons.org/surfer/tubamirum.png" alt="Tuba Mirum - the innards of a Klein Bottle" width="75%" /><br />
This is the interior of a Klein Bottle, using the &#8220;standard&#8221; realization as an algebraic surface given by Mathworld. In other words, I&#8217;m using<br />
(x^2+y^2+z^2+2*y-1)*((x^2+y^2+z^2-2*y-1)^2-8*z^2)+16*x*z*(x^2+y^2+z^2-2*y-1)=0<br />
for the defining equation. It kinda looks a bit like a Sousaphone in my opinion.</p>
<p><img src="http://mikael.johanssons.org/surfer/roman.png" alt="Roman's surface - immersion of the real projective plane." width="75%" /><br />
Roman&#8217;s surface, an immersion of the real projective plane into 3-dimensional euclidean space. It is given by the equation<br />
(x^2+y^2+z^2-9)^2-((z-3)^2-2*x^2)*((z+3)^2-2*y^2)=0<br />
and is one of the Steiner projections of the Veronese surface, embedding the real projective plane into projective 5-dimensional space by the homogenous parametrization (x^2,y^2,z^2,xy,xz,yz).</p>
<p><img src="http://mikael.johanssons.org/surfer/steiner.png" alt="Steiner's surface type 2 - immersion of the real projective plane." width="75%" /><br />
With the defining equation<br />
x^2*y^2-x^2*z^2+y^2*z^2-x*y*z=0<br />
this Steiner surface can be transformed into the Roman surface above if (and only if) you&#8217;re allowed to take shortcuts over the points at infinity. As it is, it has two pinches (both visible) and three lines of self-intersections (also all visible, kinda sorta). It&#8217;s also unbounded - one of the reasons that you cannot get to the bounded Roman surface easily.</p>
<p>With this as inspiration - go forth and draw surfaces. And when you do, please show them to me too.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mikael.johanssons.org/archive/2008/01/algebraic-surface-toys/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
