Kompleksilukujen kunnan konstruointi

Seuraava esitys osoittaa, miten kompleksilukujoukko voidaan määritellä tunnetuista reaalisista käsitteistä lähtien. Määrittelyjen jälkeen on helppoa osoittaa Mathematican laskentamahdollisuuksia käyttäen, että tulos on algebralliselta rakenteeltaan kunta.

Laskutoimistusten määrittely joukkoon (ℝ^2)

Lähtökohtana on xy-taso, ts. joukko (ℝ^2), jonka alkioiden välille määritellään yhteen- ja kertolasku. Alkiot ovat lukupareja, Mathematican terminologialla kaksialkioisia listoja. Määrittelyä varten muodostetaan aluksi testi, joka tarkistaa, että funkion argumentit ovat sallittua tyyppiä:

ctest[z_]:=Head[z]==List && Length[z]==2

Laskutoimitukset ovat kahden argumentin funktioita, joiden arvona on argumenttien summa ja tulo siten kuin ne kompleksiluvuille määritellään:

summa[z_?ctest,w_?ctest]:={(Subscript[z, [[1]]])+(Subscript[w, [[1]]]),(Subscript[z, [[2]]])+(Subscript[w, [[2]]])}

tulo[z_?ctest,w_?ctest]:={(Subscript[z, [[1]]]) (Subscript[w, [[1]]])-(Subscript[z, [[2]]]) (Subscript[w, [[2]]]),(Subscript[z, [[1]]]) (Subscript[w, [[2]]])+(Subscript[z, [[2]]]) (Subscript[w, [[1]]])}

Merkintä (Subscript[z, [[k]]]) viittaa listan z k:nteen alkioon.

Jotta päästään luonnollisempiin summan ja tulon merkintöihin, asetetaan Mathematicassa valmiiksi määritelty (mutta merkitystä vailla oleva) funktio CirclePlus tarkoittamaan funktiota summa, vastaavasti CircleTimes tarkoittamaan funktiota tulo. Tällöin laskutoimitusten symboleina voidaan käyttää renkaan sisässä olevia plus- ja kertomerkkejä (vinoristiä).

CirclePlus=summa;

CircleTimes=tulo;

Tämän jälkeen laskutoimitukset toimivat normaaliin tapaan:

{1,2}⊕{3,4}

{1,2}⊗{3,4}

Nolla, ykkönen ja imaginaariyksikkö ovat erikoisasemassa olevia kompleksilukuja ja näille annetaan omat nimet:

o={0,0}

e={1,0}

i={0,1}

Tälöin pätee

i⊗i==-e

Tuloksena on saatu yhteen- ja kertolaskulla varustettu kompleksilukujen joukko ℂ.

Kuntastruktuuri

Joukko ℂ voidaan osoittaa kunnaksi tarkistamalla kunta-aksioomien voimassaolo. Näissä esiintyy kolme mielivaltaisesti valittua kompleksilukua, joten luodaan kolme symbolista kaksialkioista listaa:

a={(Subscript[α, 1]),(Subscript[α, 2])};b={(Subscript[β, 1]),(Subscript[β, 2])};c={(Subscript[γ, 1]),(Subscript[γ, 2])};

Näitä käyttäen tarkistetaan kunta-aksioomien voimassaolo yksi kerrallaan.

Yhteenlaskun vaihdannaisuus:

a⊕b==b⊕a

Yhteenlaskun liitännäisyys:

(a⊕b)⊕c==a⊕(b⊕c)

Yhteenlaskun neutraalialkio on nolla-alkio o:

a⊕o==a

Alkion  a={(Subscript[α, 1]),(Subscript[α, 2])} vasta-alkio löydetään ratkaisemalla yhtälö:

x={(Subscript[ξ, 1]),(Subscript[ξ, 2])};

Solve[a⊕x==o,x]

x/.%[[1]]

Kertolaskun vaihdannaisuus:

a⊗b==b⊗a

Kertolaskun liitännäisyys, missä tarvitaan eksplisiittinen sievennyskäsky:

(a⊗b)⊗c==a⊗(b⊗c)

%//Simplify

Kertolaskun neutraalialkio on ykkösalkio e:

a⊗e==a

Alkion  a={(Subscript[α, 1]),(Subscript[α, 2])} käänteisalkio löydetään ratkaisemalla yhtälö:

Solve[a⊗x==e,x]

x/.%[[1]]

Osittelulaki:

a⊗(b⊕c)==(a⊗b)⊕(a⊗c)

%//Simplify

Koska kaikki kunta-aksioomat ovat voimassa, joukko ℂ varustettuna edellä määritellyillä laskutoimituksilla on todellakin kunta.

Lisäyksiä laskutoimitusten määrittelyyn

Koska sekä summa että tulo ovat liitännäisiä, olisi luontevaa sallia sulkujen poisjättäminen useamman termin summassa ja useamman tekijän tulossa. Ilman lisämäärittelyjä tämä ei kuitenkaan onnistu, koska funktiot summa ja tulo on edellä määritelty vain kahden argumentin tapauksessa.

a⊕b⊕c

Tarvittavat lisämäärittelyt ovat seuraavat:

summa[z_?ctest]:=z

summa[z__?ctest,w__?ctest]:=summa[summa[z],summa[w]]

tulo[z_?ctest]:=z

tulo[z__?ctest,w__?ctest]:=tulo[tulo[z],tulo[w]]

Tämän jälkeen sulkujen poisjättäminen tai mielivaltainen ryhmittely toimii:

a⊕b⊕c

a⊕b⊕c⊕a⊕b⊕c⊕a

a⊗a⊗a

lasku1=(a⊗(a⊗a)⊗b)⊗(c⊗a)

lasku2=a⊗(((a⊗a)⊗b)⊗c⊗a)

lasku1-lasku2//Simplify

Summan ja tulon laskujärjestystä ei tarvitse erikseen määritellä, sillä Mathematicassa on valmiina määrittely, jonka mukaan ⊗ lasketaan ensin ja ⊕ sen jälkeen:

(a⊗b)⊕(a⊗c)==a⊗b⊕a⊗c

Myös ei-negatiivinen kokonaislukupotenssi voidaan määritellä:

pottest[n_]:=IntegerQ[n]&&NonNegative[n]

z_?ctest⋄n_?pottest:=Nest[z⊗#&,e,n]

Huomaa, että symbolina ei ole tavallinen hattumerkki,vaan pieni vinoneliö!

a⋄2//ExpandAll

pot1=a⋄5⊗b⋄3//ExpandAll

pot2=a⊗a⊗a⊗a⊗a⊗b⊗b⊗b//ExpandAll

pot1-pot2//Simplify

Siirtyminen kompleksilukujen tavanomaiseen esitykseen

Edellä on rakennettu kompleksilukuaritmetiikkaa Mathematicaan tarkoituksena osoittaa, miten tämä määritelmien pohjalta tulisi periaatteessa tehdä. Lopuksi on syytä katsoa, miten voidaan siirtyä kompleksilukujen tavanomaiseen esitykseen, mikä toki on Mathematicassa valmiinakin. Edellä käsitellyt kaksialkioisen listan muotoiset kompleksiluvut voidaan muuntaa normaaliin muotoon funktiolla

normMuoto[z_?ctest]:=(Subscript[z, [[1]]])+I (Subscript[z, [[2]]])

Tässä i tarkoittaa imaginaariyksikköä. Esimerkiksi:

normMuoto[a]

normMuoto[a⋄2]

ipot=Table[i⋄n,{n,0,10}]

Map[normMuoto,ipot]

Varsinaisesti kompleksiluvuilla laskettaessa ne syötetään Mathematicassa suoraan normaalimuodossa. Laskutoimitussymbolit ovat samoja kuin reaalisten muuttujien tapauksessa. Esimerkiksi:

(2+3 I) (4+5 I)

(2+3 I)/(4+5 I)

Table[I^n,{n,0,10}]

Harjoitustehtäviä

1) Laske kompleksilukujen (Subscript[z, 1])=-5+7i ja (Subscript[z, 2])=-2-11i summa, tulo ja osamäärä sekä edellä olevan määritelmän mukaisella formalismilla että normaalia tapaa käyttäen.

2) Laske kompleksilukujen (Subscript[z, 1])= cos((Subscript[φ, 1]))+i sin((Subscript[φ, 1])) ja (Subscript[z, 2])= cos((Subscript[φ, 2]))+i sin((Subscript[φ, 2])) tulo ja osamäärä sekä luvun (Subscript[z, 1]) käänteisluku edellä olevan määritelmän mukaisesti. Sievennä tulokset.

3) Määrittele funktiot, jotka antavat reaalilukuparina esitetyn kompleksiluvun liittoluvun ja itseisarvon. Tarkista näitä käyttäen, että seuraavat yhtälöt ovat voimassa kaikille kompleksiluvuille: a) (Overscript[(Subscript[z, 1])+(Subscript[z, 2]), ─])=(Subscript[(OverBar[z]), 1])+(Subscript[(OverBar[z]), 2]), b) (Overscript[(Subscript[z, 1]) (Subscript[z, 2]), ─])=(Subscript[(OverBar[z]), 1]) (Subscript[(OverBar[z]), 2]), c) (OverBar[(OverBar[z])])=z, d) |(OverBar[z])|=|z|, e) z (OverBar[z])=|z((|)^2), f) |(Subscript[z, 1]) (Subscript[z, 2])|=|(Subscript[z, 1])||(Subscript[z, 2])|.

Simo K. Kivelä    23.4.2005