En altfor vanskelig måte å løse en enkel ligning på

La oss si at vi har ligningen $x=2x-2$. Dette lærte man å løse på ungdomsskolen ved å få x-ene på èn side. (i dette tilfellet ser vi raskt at $x=2$ er eneste løsning). Men hva om vi har lyst til å være vanskelige?

Siden $x=2x-2$, kan vi skrive $x=2(2x-2)-2=4x-6$. Så vi har nå at $x=4x-6$. På samme måte kan vi sette inn for $x$ i denne ligningen, og få $x=4(2x-2)-6=8x-14$. Fortsetter vi $n$ ganger, får vi at $x=2^nx-2^n-2^{n-1}+\cdots+2$. Det siste leddet er en geometrisk rekke, som forenkler til $2^{n+1}-2$.

Vi har altså nå at $x=2^nx-2^{n+1}-2$.  Vi deler på $2^n$ på begge sider og får $\frac{x}{2^n}=x-2-\frac{2}{2^n}$. Lar vi nå $n$ gå mot uendelig, forsvinner venstresiden av ligningen og mye av høyresiden. Vi står igjen med $0=x-2$, så $x=2$.

Posted in Smalltalk | Leave a comment

En veldig enkel tilfeldig tall-generator

Akkurat nå leser jeg boken “Chaos – A Very Short Introduction“. Den definerer et kaotisk system til å være et system som er veldig ømfintlig overfor initialbetingelsene. På et tidspunkt nevner boken et veldig enkelt dynamisk system.

Hva mener vi med et dynamisk system? For våre formål mener vi bare en følge med tall, $x_0, x_1, \ldots$. En enkel klasse av dynamiske systemer er på formen $x_0=a$ for en eller annen $a$, som vi kaller initialverdien. Så definerer vi rekursivt alle andre verdier av $x_n$ som $x_{n+1}=f(x_n)$ hvor $f(x)$ er en eller annen funksjon.

Nå skal vi la $f(x)=4x(1-x)$. Denne har to nullpunkter, nemlig $x=0$ og $x=1$. Den har et toppunkt i $x=1/2$.

Dette gir opphav til et dynamisk system så snart vi velger en initialverdi. Det kule med denne enkle funksjonen, er at i tidligere tider brukte man denne for å generere “tilfeldige” tall. La oss se litt på dette. En enkel, rekursiv implementasjon i SAGE er gitt ved:

def r(x,n):
    if n==0:
        return x
    else:
        return r(4*x*(1-x),n-1)

Vi genererer listen:

def generateList():
    return [[i,r(1/float(pi),i)] for i in range(0,500)];
L = generateList()

Og vi plotter den:

p = line(L)
p.show(xmin=0,xmax=500,ymin=0,ymax=1)

Her er resultatet vi får (klikk på bildet for noe større versjon):

Dette er kanskje litt overveldende. La oss bare ta 100 punkter:

Dette er ganske kult, for vi ser at oppførselen til følgen er helt vill. Betydningen av “vill” kan defineres matematisk, men la oss hoppe over det. Poenget er at følgen i stor grad oppfører seg “tilfeldig”. Vi ser også at små endringer i startverdien kan gi helt forskjellige følger. Under er først for startverdien 0.3, så for startverdien 0.31.

Vi ser at grafene er ganske like, men at verdiene opptrer på ganske forskjellige steder. Dette kan utnyttes for å lage tilfeldige tall. Man kan for eksempel først velge en initialverdi, så kjøre det dynamiske systemet, og bruke dette til å generere en følge av 100 tall. Neste gang velger man en annen initialverdi, og man vil få en følge som ikke ligner på den forrige.

Posted in Applications, Smalltalk | Leave a comment

Litt om telling

La oss være litt filosofiske. Du er et steinaldermenneske, eller noe enda eldre enn det, eller bare dum. Du kan nemlig ikke tallene, men vil likevel finne ut om det er du eller naboen som har flest fisk.

Hadde du kunnet telle,  hadde det vært mye enklere, for det er lett å sjekke om et tall er større enn et annet. Matematisk kan vi si at du har en funksjon fra mengden av fiskehauger (F) til heltallene. La oss kalle den $f:F \to \mathbb{N}$. Så om din fiskehaug kalles A, og naboen B, er alt vi trenger å sjekke om $f(A) > f(B)$.

Men du kjenner ikke til heltallene $\mathbb{N}$! Fiskehauger er mengder bestående av fisk. Symbolsk kan vi si $A = \bigcup_{a \text{ fisk}} \{a\}$. Så hvordan kan vi telle uten tall? Vel, det kan vi ikke! Men vi er ikke helt fortapte. La oss si at du har to hauger, A og B,  med like mange fisk. Da kan hver fisk fra haug A “parres” med nøyaktig en fisk fra haug B, og hver fisk fra haug B kan parres med èn fra haug A. Vi ser at vi får en 1-1-korrespondanse mellom fisk i haug A og fisk i haug B.  Matematisk har vi en bijeksjon $g:A \to B$, det vil si en funksjon fra A til B som er både 1-1 og “på”/surjektiv.

Men hvordan er situasjonen om det er færre fisk i haug A enn i haug B? (for enkelhets skyld kan du tenke at det er to fisk i haug A og 5 i haug B) Da ser vi at det er umulig å få til en funksjon fra A til B som er “på” B, eller surjektiv. Det betyr at det er umulig å gi hver fisk i haug B en “partner” i A, fordi det er færre fisk i haug A.

Motsatt, om det er flere fisk i haug A enn i haug B, sier litt ettertanke oss at det er umulig å få til en injeksjon $A \to B$. En injeksjon er en funksjon som sender hver $a$ til kun èn $b$. Om det er flere fisk i haug A, må minst to $a$ sendes til samme $b$.

Dermed ser vi at det eneste tilfellet hvor vi klarer å få til en funksjon som er både surjektiv og injektiv, er når det er like mange fisk i haug A som i haug B. Dette gir oss også muligheten til å si når det er færre eller flere fisk i haug A enn i haug B. Vi definerer det til å være flere fisk i haug A enn i haug B om det ikke finnes noen injeksjoner $A \to B$, og vi definerer det til å være færre fisk i haug A enn i haug B om det ikke finnes noen surjeksjoner $A \to B$. Til slutt sier vi at det er like mange fisk om det finnes en bijeksjon mellom A og B, altså både en injeksjon og surjeksjon.

Hva forteller alt dette oss? Det første vi kan si, er at heltallene har mye mer struktur enn vi trenger om vi bare skal sjekke om noe har like mange elementer som noe annet. Å sjekke om det finnes en injeksjon/surjeksjon/bijeksjon sier ingenting om hvor mange elementer det er i mengdene, bare om det er færre/flere/like mange. Å telle er en kvantitativ operasjon, mens å sjekke hva slags funksjoner det finnes mellom to mengder er en kvalitativ operasjon.

Men ok, vi har kommet fram til at vi ikke trenger heltallene for å sjekke hvilken mengde som har flest elementer. Men hva er poenget? Hvorfor gjøre det så tungvindt? Vel – nå har vi en mer elementær måte å sjekke størrelse på mengder på, og dette hinter om at vi kanskje kan generalisere definisjonene av “flere/færre enn” til andre mengder enn bare endelige.

For nå, la oss anta at leseren skjønner hva som menes med en uendelig mengde. Et eksempel på en slik mengde er mengden av alle heltall. Det er lett å sjekke at det er flere heltall enn, la oss si, elementer i mengden $A=\{1,2,3,4,5\}$. Det finnes nemlig ingen surjeksjoner $A \to \mathbb{N}$ (Bevis: om det finnes en slik surjeksjon, finnes også en surjeksjon $A \to \{1,2,3,4,5,6\}$ ved restriksjon. Dette går bare ikke).

Et annet eksempel på en uendelig mengde er mengden av partall, altså tallene $E=\{2,4,6,8,\cdots\}$. Siden partallene er en ekte delmengde av heltallene (det finnes heltall som ikke er partall), er det naturlig å tro at det er flere heltall enn partall. La oss sjekke med vår definisjon: Kan vi bevise at det ikke finnes noen injeksjoner $\mathbb{N} \to E$? Svaret er nemlig nei: et eksempel på en injeksjon er funksjonen $n \to 2n$. Det er lett å sjekke at denne er injektiv, så vi må konkludere (med vår definisjon av “færre enn”) at det er færre/like mange heltall som partall. Det er også lett å se at den er surjektiv, så vi er faktisk nødt til å konkludere med at det er like mange partall som heltall, selv om det åpenbart finnes mange heltall som ikke er partall.

Nå blir du kanskje frustrert, river deg i håret, og tenker at matematikere lager helt pussige definisjoner. Er alle mengder like store, bare de er uendelige? Nei, det finnes mange forskjellige “uendeligheter”, alle av forskjellige størrelse (det vil si, det finnes ingen bijeksjoner mellom dem). Det kan vi ta i en senere bloggpost.

Posted in Set Theory, Smalltalk | Leave a comment

Beregne volum av kuler

I anvendelser av matematikk har man ofte behov for å regne ut volumer av avanserte geometriske objekter. Som regel går det ikke an å regne ut slikt for hånd eller med pene formler, så matematikere jobber mye med å finne algoritmer som datamaskiner kan utføre for å finne en tilnærmet løsning.

Tenk deg at du har fått i oppdrag å regne ut arealet av en kule i n dimensjoner. Først av alt – hva i all verden mener vi med dette? En sirkel i planet med radius 1 kan beskrives som alle punkter $(x,y)$ i planet slik at  $x^2+y^2=1$ (hvorfor? hint: Pythagoras’ setning). På samme måte kan vi beskrive en kule som alle punkter $(x,y,z)$ i rommet slik at $x^2+y^2+z^2=1$.

Vi generaliserer, og definerer en  kule i n dimensjoner til å være alle punkter $(x_1,x_2,\ldots,x_n)$ i $\mathbb{R}^n$ slik at $\sum_{i=1}^n x_i^2 = 1$.

Men la oss nå si at du har lyst å regne ut arealet av en sirkel i planet. Vi kan anta sirkelen har radius 1 og er plassert i origo. Tegn så et kvadrat rundt sirkelen, med diagonaler med lengde 1, som på figuren under:

Enhetssirkelen på innsiden av en firkant.

Siden firkanten har sidelengder på 2, har den arel 4. Her kommer trikset: kast masse “dart-piler” (eller punkter, om du vil) på firkanten slik at de havner tilfeldig spredt omkring. Kall arealet til sirkelen for A. Da vil A/4 av dart-pilene havne på innsiden av sirkelen.  Dermed, for å få arealet av sirkelen, ganger vi dette forholdet med 4.

Fordelen med denne metoden er at det er veldig lett å sjekke om et punkt er på innsiden av sirkelen eller ikke. Vi sjekker bare om $x^2+y^2 < 1$ eller ikke. Om $x^2+y^2 < 1$, så er punktet $(x,y)$ på innsiden av sirkelen. Dette generaliserer lett til flere dimensjoner enn 2 og til andre figurer enn sirkler.

Jeg har testet denne metoden på sirkler i Python. Jeg laget et program som jeg kalte for areal_kule.py. Vi tester for sirkelen og med 1000 dart-piler:

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 2 1000
Tilfeldig volum: 3.196
Ekte volum: 3.14159265359
Error: 0.0544073464102

Ikke veldig imponerende, kanskje – vi kastet tross alt 1000 dart-piler! Vi tester med èn million dart-piler i stedet (dette tok litt under 10 sekunder på min maskin):

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 2 1000000
Tilfeldig volum: 3.144456
Ekte volum: 3.14159265359
Error: 0.00286334641021

Nå ble resultatet en god del bedre. La oss prøve å regne ut volumet av en kule:

Fredriks-MacBook-Air:Python Fredrik$ python areal_kule.py 3 1000000
Tilfeldig volum: 4.184968
Ekte volum: 4.18879020479
Error: 0.00382220478639

Ikke dårlig! Denne metoden kalles for Monte Carlo-integrasjon, og det viser seg at slike “tilfeldige” metoder ofte er mer effektivt i høyere dimensjoner.

Når vi først snakker om sirkler, kan man lure på hva som skjer med volumet til sfærer når vi øker dimensjonene. Resultatet er litt kontraintuitivt:

Volum kuler

Vi ser at volumet til kulene øker fram til dimensjon 4, hvor det begynner å falle. Faktisk går kulevolumet i dimensjon n mot null når n går mot uendelig. Dette er fordi diagonallengden på kvadratet rundt kulen blir større og større etterhvert som n øker.

For ordens skyld, her er Python-programmet jeg brukte for å regne ut volumene:

from random import random
from math import pi, gamma, fabs
import sys

if len(sys.argv) == 1:
    sys.exit("Skriv areal_kule d n. d dimensjon, n antall, std n=1000")
if len(sys.argv) == 2:
    d = int(sys.argv[1])
    n = 1000
if len(sys.argv) == 3:
    d = int(sys.argv[1])
    n = int(sys.argv[2])

i = 1
s = 0.
cube_area = 2**d #area of cube in dimension d

while i < n:
    if (sum([random()**2 for j in range(d)])) < 1:
        s += 1
    i += 1

random_area = (s/n)*cube_area
true_volume = pi**(0.5*d)/gamma(0.5*(d+2))

print "Tilfeldig volum: " + str(random_area)
print "Ekte volum: " + str(true_volume)
print "Error: " + str(fabs(random_area-true_volume))
Posted in Smalltalk | 3 Comments

Monty Hall-paradokset

“Monty Hall”-problemet er et statistisk paradoks som ble kjent etter at Marilyn vos Savant skrev om det i et amerikansk blad i 1990. Problemet går som følger:

“Suppose you’re on a game show, and you’re given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1 [but the door is not opened], and the host, who knows what’s behind the doors, opens another door, say No. 3, which has a goat. He then says to you, “Do you want to pick door No. 2?” Is it to your advantage to switch your choice?”

Eller på norsk: Du er med på en konkurranse, og skal velge èn av tre dører. Bak en av dørene er det en bil (som er premien), og bak de to andre er det geiter. Om du velger, la oss si, dør nummer 1 – så åpner programlederen en dør, f.eks nummer 3, og bak den er det en geit. Han gir deg nå mulighet til velge dør på nytt. Er det til din fordel?

Intuitivt burde det ikke hjelpe å bytte dør. Du vet fra før at sjansen for at du finner en bil er 1/3. Om programlederen viser deg en dør med geit, vet du at enten er bilen i den du har valgt eller den andre døren som ikke er vist.  Burde det da ha noe å si om du bytter? Det paradoksale (i betydningen at det kan overraske), er at det alltid vil lønne seg å velge ny dør. Hvorfor? Det finnes flere intuitive måter å forklare dette på.

Forklaringen er overraskende enkel: Du taper om du bytter dør hvis og bare hvis du valgte bilen første gang. Sjansen for å velge bil første gang er 1/3. Dermed er sjansen for å vinne med bytting lik $1-\frac{1}{3}=\frac 23$.

Eller vi kan teste problemet med empiri (og litt logisk tenking). Jeg programmerte to Monty Hall-funksjoner i SAGE (Python-kode). Den ene funksjonen bytter dør, mens den andre ikke gjør. Så tester vi. Her er koden til funksjonen som bytter dør:

def montyhall_change(choice): # med bytting
   if choice == 1:
       return False
   else:
       return True

Kort forklaring av funksjonen: Vi kan anta bilen ligger bak dør nummer 1. Hvis du velger å bytte, og velger dør nummer 1, taper du. Derfor returnerer funksjonen False. Hvis ikke, viser Monty deg en dør med geit i. Det er bare to dører med geiter, så han må åpne den du ikke valgte. Om du skal bytte, er eneste mulighet å velge døren med bilen, og funksjonen returnerer derfor True.

Vi lager også en funksjon for å ikke bytte dør. Den er naturligvis noe enklere:

def montyhall_keep(choice):
    if choice == 1:
        return True
    else:
        return False

Til slutt simulerer vi konkurransen et stort antall ganger, og ser på tallmaterialet vi får:

k = 10000
s_change = 0
s_keep = 0
for n in range(k):
    random = ZZ.random_element(3)+1
    if montyhall_change(random) == True:
        s_change += 1
    if montyhall_keep(random) == True:
        s_keep += 1

print "Antall forsok: ", k
print "Antall suksess bytte: ", s_change,
      " Antall suksess beholde: ", s_keep
print "Prosent riktig bytte: ", s_change/float(k)
print "Prosent riktig bytte: ", s_keep/float(k)

Koden over kjører konkurransen 10.000 (ti tusen) ganger. For hver gang vi vinner bil, øker s_change eller s_keep med 1, avhengig av hvilken metode vi brukte. Resultatet vises under:

Antall forsok:  10000
Antall suksess bytte:  6721  Antall suksess beholde:  3279
Prosent riktig bytte:  0.6721
Prosent riktig beholde:  0.3279

Dette stemmer godt med utregningene vi gjorde.

Posted in Probability and statistics | Leave a comment

The probability distribution of the length of pop songs

Taking a course in probability can be extremely fun if you try to apply some of acquired knowledge to real world data sets. Finding data types that are easy to gather and at the same time interesting is a problem in itself. By a flash of inspiration, I came to think of this incredible easy example: the length (in seconds) of pop songs.

After a succesful Google search, I ended up with NRK’s Spotify list “NRK mP3 – siste 400″ and sampled the 42 first song lenghts.  Using the Python function below, the lengths were converted to seconds:

def mintilsek(n):
    min = floor(n)
    s   = (n-min)*100
    return int(round(min*60+s))

The sample data ended up as follows:

w = [52 241 223 231 225 242 263 222 200 220 238 213 210 213 210 183 321
 265 228 200 206 200 228 193 269 289 197 211 211 236 252 222 224 184
232 198 207 220 178 192 258 192]

The natural question to ask is: Which distribution does these numbers belong to? As so many real world populations distribute normally, the first thing I did was to plot the observed sample values in a normal QQ-plot (that is, normal quantiles on one axis, and sample quantiles on the other axis). I did that using the following R code:

> qqnorm(w); qqline(w)

Where w is the data set. The result is seen below:

The fit is not too bad, but there are noticable probability mass on the tails, so a probability distribution with heavier tails should be considered.

Let us for the moment assume that the distrubution is normal. We can do a maximum likelihood estimation, to estimate the parameters $\mu,\sigma$, the mean and standard deviation respectively. R has (obviously) a function for this:

> fitdistr(w, "normal")
      mean          sd
  223.785714    29.214751
 (  4.507934) (  3.187591) 

That is, if we assume that the distribution is normal, then a maximum likelihood estimate of the parameters tells us that the mean song length is 3:43 with a standard deviation of 29 seconds. That is, about 68% of all songs are between 3:14 and 4:12 minutes long.

If we now however assume that the population has a Cauchy distribution, which has heavier tails, then we get the following:

> fitdistr(w, "cauchy")
    location      scale
  217.829335    15.684886
 (  3.897386) (  3.090949)

Since neither the mean nor the variance exists for a Cauchy distribution because of its heavy tails, these numbers are difficult to compare with the previous numbers. According to this, however, 50% of all pop songs have length less than 3:37 minutes.

Finally: We know that for sufficiently large samples, the sample average $\overline{X}$ is approximately normal. Thus we can find an approximate confidence interval for the real median $\mu$ (page 386, Devore & Berk). The sample mean is $223.8$ and the sample standard deviation is $29.6$. Thus by the formula $\overline{x} \pm z_{\alpha/2} \frac{s}{\sqrt{n}}$ we find that a confidence interval for $\mu$ with approximately 95% confidence is  $(215, 233)$.

Conclusion: Though I could, and maybe should, have written a lot more, it seems that assuming song lengths are normally distributed is a fair assumption, given that the data fit was nearly linear for values near the mean. (that is, if we ignore the “extremes”, then the distribution is certainly “very” normal)

This proves that playing with statistics can be fun (as I have just been doing it for the last 3-4 hours).

Posted in Probability and statistics, Uncategorized | Leave a comment

The St Petersburg paradox

We toss a coin. If you get heads first toss, you get €2. If not, we toss again. If you get heads second toss, you get €4. In general, if you get heads on the n’th toss, you get €$2^n$. What is your expected gain?

Basic probability theory tells us that the expected value is the sum of the probabilities of the possible events multiplied by the corresponding gain.  One can consider the coin tossing as a discrete random variable, taking the values 0 or 1, each with a probability of $\frac 12$. Getting heads at first toss has a probability of $\frac 12$ and earns you €2, getting heads at second toss has a probability of  $\frac 14$ and earns you 4€, and so on. Thus the expected value of this game is $\sum_{i=1}^\infty 2^{i} \frac{1}{2^i}=1+1+1+\cdots=\infty$.

This sounds surprising. After all, you cannot reasonably expect to earn an infinite amount of money – there will never be an infinite row of tails. However, in this case the gain grows just as quickly as the diminishing probability of successive tails.

A simulation of the game shows that, indeed, the (arithmetic) mean grows as the number of tosses grow, but very slow. The plot below shows the mean value up to $10^7$ tosses. Since the expected value is infinity, a mean gain of about €25 after ten million tosses doesn’t sound much.

The plots show the same script run twice. The dissimilarity of the plots indicates the slow growth of the accuracy of the simulation (indeed, if the simulation told the real story, the plots would be too large for this world).

Let us, just for fun, change the rules of the game. Instead of getting $2^n$ on the n’th toss, you now get $n$. As we know, linear functions grow substantially slower than exponential ones, so we should expect a change in the expected value. Indeed, a calculation shows that the expected value is 2. Plotting this:

We see that already at 100 tosses, we can be pretty sure what the expected value is. This is far from the case with the original rule. From the plots, the expected value could just as well be converging (albeit very slowly).

What does these considerations imply? Firstly, that simulating events with extremely low probabilities demand extremely accuracy/number of trials. Secondly, that using only expected value leads to “paradoxes”. Say you were an economist – then you’d naïvely assume that your rational course of action is to play this game. After all, if you do it many times, you will certainly get rich. But as the probability of earning anything more than a few € is so low, it will take ages before you get rich. Economists solved this by considering time as a resource. Read Wikipedias’s article for more information.

The Python file used to generate the plots.

Posted in Probability and statistics | Leave a comment

“Fearless Symmetry” by Avner Ash, Robert Gross

At a book store in a shopping center by the coast of California I found this gem of a book. I skimmed through the content list, and bought it without much more thinking. In retrospect, it is safe to say that it was worth the $23.95 plus Californian tax.

As the title suggests, the book is much about symmetry  - but it is also slightly misleading. The book is really about number theory and the theory that led to the solution of Fermat’s  Last Theorem.

The book’s main mission is to explore the absolute Galois group $G=G(Q^{alg}/Q)$ through representations, that is, morphisms from $G$ to more known groups, such as matrix groups and finite fields. As such, the book is more about representation theory than symmetry. But it doesn’t stop there! A main theme in the book is how representation theory is behind generalized reciprocity laws in number theory and how reciprocity laws are used in advanced mathematics (an example of a reciprocity law is $(p/q)=(-1/q)(q/p)$ where $(p/q)$ is the Legendre symbol. That is, knowing if $p$ is square mod $q$ tells us if $q$ is square mod $p$ and conversely).

The book is written in a leisurely language and contains no difficult proofs and avoids technical definitions – without losing substance. Number theory is presented as a rich subject with lots of tools and abstractions.

The presentation was very inspirational, and this next semester will be like Christmas for me.

Posted in Reviews | Leave a comment

Examples in mathematics

I recently installed the open source progam Sage on my computer. It is a mathematics software program with the functionalities of Mathematica, MATLAB, Magma, PARI, et alia. Installing it on Windows is a bit tricky; you have to install a Linux virtual machine, which again runs as a local server. After that, you type something like 192.168.216.128 in your browser, and who-ha, you are now able to do amazing shit.

Sage uses the Python programming language, so in case you know Python, learning Sage should be no biggie. Anyways, I write this short post most out of inspiration. The plotting part of Sage is really good. Below are some examples:

Using the Sage function “implicit_plot3d()”, you can plot level curves. Below is the variety defined by the polynomial $xz^3+y^2-1$ viewed from two different angles:

Notice the hole. That makes you wonder what properties of polynomial equations give rise to varieties with such properties (surely the sphere has no holes. It is even bounded).

Below is the variety in $\mathbb{A}^2$  defined by $y^3x^5-x^2+3$.

D

Below is the variety defined by $yx^2+xy^2-1$:

This one has three disconnected components. If I remember my commutative algebra correctly, it should be possible to do a primary decomposition here, so that each part of the variety has a prime ideal. (or something like that)

Below is the variety defined by $x^4+y^3+x^2+y-1$:

To summarize: using SAGE to visualize complex algebraic structures is really inspiring, it gives abstract thoughts a concrete image (literally). But it’s more than that: SAGE also does numerical and symbolic calculations. It can differentiate and integrate symbolically, it can solve problems in algebraic number theory (like finding integral bases, finding algebraic closures, et cetera).

Posted in Algebraic geometry | 5 Comments

Mathematics – Form and function by Saunders Mac Lane

I have just finished reading “Mathematics – form and function” by Saunders Mac Lane. The main goal of the book is to present the author’s philosophy of mathematics, answering the question “what is mathematics?”. In doing so, he also answers the question “is mathematics true?” and demonstrates that it is a non-question. He presents mathematics as a set of tightly intervowen formal rules, wherein deduction is only allowed following the “rules of deduction”. Continue reading

Posted in Reviews | Leave a comment