/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 12.04.0 ] */ /* [wxMaxima: title start ] Luento 1 [wxMaxima: title end ] */ /* [wxMaxima: comment start ] Symbolinen laskenta 2016 [wxMaxima: comment end ] */ /* [wxMaxima: section start ] Johdantoa [wxMaxima: section end ] */ /* [wxMaxima: subsect start ] Help: example, apropos ja describe [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] Lista olemassa olevista erillisistä esimerkeistä saadaan komennolla example(); Esimerkiksi komentoon diff liiittyviä esimerkkejä saadaan komennolla example(diff); Komento apropos("diff"); tuo listan komennoista, joiden nimen osana on diff. Komento describe(diff); tai sille vaihtoehtoinen muoto ? diff; antaaa komentoon diff liitetyn käsikirjan selityksen. Komento describe(diff, inexact); tai sille vaihtoehtoinen muoto ?? diff; tuo esiin valikon erilaisista käsikirjan kohdista. [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Käsikirjaa on wxMaxima-käyttöliittymäohjelmasta käsin kuitenkin helpompi selata Help-valikon kohdan Maxima Help avulla. [wxMaxima: comment end ] */ /* [wxMaxima: subsect start ] Peruslaskutoimitukset + - * / ^ [wxMaxima: subsect end ] */ /* [wxMaxima: input start ] */ x + y*z - a^b/c; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ 1 + 2*3 - 4^5/6; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Huomio: Laskutoimitusten järjestys ei ole vasemmalta oikealle! Laskujärjestyksen määräytyminen selitetään (melko teknisesti) käsikirjan kohdassa Operators > Introduction to operators. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ 1+2*3; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ (1+2)*3; /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Tärkeät erikoismerkit [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] ; puolipiste päättää komennon $ dollarimerkki päättää komennon % prosenttimerkki: edellisen laskun tulos , pilkku toimii erottimena . piste: desimaalipiste; vektoreiden ja matriisien tulot : kaksoispiste: arvon tallettaminen muuttujaan = yhtäsuuruusmerkki: yhtälöt := pari kaksoispiste-yhtäsuuruusmerkki määrittelee funktion ( ) kaarisulut ilmoittavat funktion argumentit; useita komentoja samalle komentoriville; laskujärjestyksen ryhmittäminen [ ] hakasulut: listat, vektorit; indeksoidut muuttujat tai funktiot; indeksi listan alkioon { } aaltosulut ilmaisevat joukkoja ' lainausmerkki estää seuraavan symbolin arvon laskemisen (vrt. differentiaaliyhtälöt) '' kahdennettu lainausmerkki (ei kaksoislainausmerkki) pakottaa symbolin arvon laskemisen " kaksoislainausmerkki: merkkijonot /* */ /* tämä on kommentti */ [wxMaxima: comment end ] */ /* [wxMaxima: subsect start ] Vakiot [wxMaxima: subsect end ] */ /* [wxMaxima: input start ] */ [%e, %gamma, %phi, %pi, %i, minf, inf]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(%); /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Alkeisfunktiot ("Mathematical functions", "Polynomials") [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] exp, log (%e-kantainen eli luonnollinen; muita ei ole); trigonometriset: sin, cos, tan cot, sec, csc; arkusfunktiot: asin, acos, atan, acot, asec, acsc; hyperboliset: sinh, cosh, tanh, coth, sech, csch; areafunktiot: asinh, acosh, atanh, acoth, asech, acsch [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ sin(%pi/4); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(%); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ sin(%pi/4), numer; /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] [wxMaxima: subsect end ] */ /* [wxMaxima: input start ] */ cos(n*%pi); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ declare(n, integer); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ cos(n*%pi); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ properties(n); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ facts(); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ remove(n, integer); /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Lukuteoreettisia funktioita ("Mathematical functions", "Number theory") [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] abs, ceiling, floor (=entier =fix), round, max (lmax listoille), min (lmin listoille), signum, ! (=factorial; kertoma; määritelty myös ei-kokonaislukumuuttujille), binomial, genfact (yleistetty kertoma; laskeva ja nouseva potenssi) [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] divide, gcd (=syt), lcm (=pyj), mod, power_mod, inv_mod, totient, ifactors, divisors, primep, next_prime, prev_prime [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ 3^4/5; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(%); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ floor(3^4/5); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ 5*%; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ ceiling(3^4/5); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ 3^4=16*5+1; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ mod(3^4, 5); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ power_mod(3, 4, 5); /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Matemaattisia algoritmeja, A [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] primep(n) testaa, onko luku n alkuluku (=jaoton luku) vai ei (pienille luvuille tämä onnistuu helposti kokeilemalla, mutta suuria lukuja varten tarvitaan "hienompia" matemaattisia menetelmiä); prev_prime(n) määrää lukua n pienemmän alkuluvun; power_mod(a, b, n) laskee luvun a^b jakojäännöksen modulo n nopeasti ja tehokkaasti (3^(42!) = 10^(6.7*10^(50)), joten luvussa 3^(42!) on n.~sata oktiljoonaa numeroa): [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ for n:1 thru 100 do ( if primep(n) then sprint(n) ); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ p:prev_prime(5*10^42); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ slength(string(p)); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Lasketaan 3^(42!) modulo p "oikein": [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ power_mod(3, 42!, p); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Luvussa 3^(42!) olevien numeroiden lukumäärä [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ 42!*log(3)/log(10), numer; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ 1+floor(%); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Potenssiin korotuksen 3^(42!) laskemiseen tarvittava aika, jos laskettaisiin naivilla tavalla (eli 3*3*...*3 42! kpl): [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ %/(10^(24)*31556952), numer; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] 31556952 on vuoden pituus sekunteina; 10^(24) on kuvitteellinen laskentanopeus, tässä 10^(24) laskutoimitusta sekunnissa. Y.o. tulos on siis laskenta-aika VUOSINA! [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ l42:42!; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ obase:2; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ s42:charlist(string(l42)); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ obase:10; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ map(eval_string, s42); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Potenssiinkorotukseen power_mod(3, 42!, p) tarvittavien kertolaskujen lukumäärä (kun laskeminen tehdään "oikein"): [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ length(%)-1 + apply("+", %)-1; /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Matemaattisia algoritmeja, B [wxMaxima: subsect end ] */ /* [wxMaxima: comment start ] Polynomien jako jaottomiin tekijöihin : [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Kun muuttujan modulus on false, lasketaan "normaalisti"; jaottomus mitataan niin, että tekijäpolynomien kertoimet ovat rationaaliset. (Tämä rajoitus voidaan poistaa kertomalla Maximalle, mitä rationaalilukujen kunnan kuntalaajennusta käytetään.) Esimekiksi x^2 - 4 jakautuu tekijöihin x-2 ja x+2, mutta x^2 - 2 on jaoton, koska sen (reaalikertoimiset) tekijät x - sqrt(2) ja x + sqrt(2) eivät ole rationaalikertoimiset. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ modulus; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^2 - 4); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^2 - 2); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^8-1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^9-1); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Jos modulus saa arvon kolme, kertoimilla lasketaan modulo kolme, eli kolmen monikerrat samaistetaan nollan kanssa: 1+1=1, 1+2=3=0, 2+2=4=3+1=1. [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Jos muuttujan modulus arvo muutetaan samalla komentorivillä kuin itse komento, muuttujan arvon muutos vaikuttaa vain kyseisen komennon ajan: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ factor(x^9-1), modulus:3; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^9-1); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Jos muuttujan modulus arvo muutetaan omalla komentorivillään, muuttujan arvon muutos vaikuttaa niin kauan kunnes sen arvoa muutetaan uudestaan: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ modulus:3; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^8-1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^9-1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ modulus:false$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ factor(x^9-1); /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Riittääkö 16 numeron tarkkuus, A? [wxMaxima: subsect end ] */ /* [wxMaxima: input start ] */ kill(values); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Lausekeet [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ l_a:u*v*w*x*y; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ [l_b1:(u*v*w)^(1/3), l_b2:(v*w*x)^(1/3), l_b3:(w*x*y)^(1/3), l_b4:(u*x*y)^(1/3), l_b5: (u*v*y)^(1/3)]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Luku l_a on viiden luvun tulo, luvuista l_b1,..., l_b5 kukin on kolmen kuutiojuuren tulo niin, että jokainen kuutiojuuri esiintyy täsmälleen kolme kertaa. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ l_b1*l_b2*l_b3*l_b4*l_b5; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ l_a - l_b1*l_b2*l_b3*l_b4*l_b5; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Erotus on nolla, kuten pitääkin. [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Testataan sama numeerisilla arvoilla: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ [u,v,w,x,y]:[7919.0, 7927.0, 7933.0, 7937.0, 7949.0]$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ l_a:u*v*w*x*y$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ [l_b1:(u*v*w)^(1/3), l_b2:(v*w*x)^(1/3), l_b3:(w*x*y)^(1/3), l_b4:(u*x*y)^(1/3), l_b5: (u*v*y)^(1/3)]$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ l_a - l_b1*l_b2*l_b3*l_b4*l_b5; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Erotuksen pitäisi olla nolla! Ongelma piilee siinä, että syntyvät tulot ovat niin suuria, että erotukseen jää vain pyöristysvirheitä. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ kill(u,v,w,x,y,l_a,l_b1,l_b2,l_b3,l_b4,l_b5); /* [wxMaxima: input end ] */ /* [wxMaxima: subsect start ] Riittääkö 16 numeron tarkkuus, B? [wxMaxima: subsect end ] */ /* [wxMaxima: input start ] */ kill(values); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Lasketaan kosinin arvo piin monikerrassa, kun kerroin on suuri kokonaisluku. (Tämä ogelma on peräisin erään pro gradun Fourier-sarjatarkasteluista.) [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ cos(%pi*a^n*x); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ (a:7, n:50)$ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Muuttujan a arvo on 0.1 aluksi normaalin tarkkuuden mukaisesti (16 numeron tarkkuus): [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ x1:0.1$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(cos(%pi*a^n*x1)); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Lasketaan seuraavaksi sama käyttäen suurtarkkuuslaskentaa (bfloat(...), fpprec:50 laskee k.o. suureen 50 numeron tarkkuudella): [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ x1:1/10$ /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ bfloat(cos(%pi*a^n*x1)), fpprec=50; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(%); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Tulos eroaa aiemmin lasketusta merkittävästi; missä vika? [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ a^n*x1; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ k1:floor(a^n*x1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ s1:mod(a^n*x1, 1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ a^n*x1=k1+s1; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ is(%); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Laskettavana on siis cos(%pi*k + %pi*s), kun k=k1 ja s=s1: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ trigexpand(cos(%pi*k+%pi*s)); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ declare(k, integer); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ cos_ks:trigexpand(cos(%pi*k + %pi*s)); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ remove(k, integer); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Kosinin jaksollisuuden takia laskettavana on luku: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ev(cos_ks, k=k1, s=s1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ float(%); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Ongelma näkyy seuraavastakin: kun lasketaan tarkalla piin arvolla, on piin monikerroissa [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ [cos(k1*%pi), sin(k1*%pi)]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Mutta kun luvulle k1*%pi lasketaan ensin likiarvo (oletustarkkuus on vain 16 numeroa), saadaan [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ k1_pi:float(k1*%pi); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ [cos(k1_pi), sin(k1_pi)]; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ kill(values)$ /* [wxMaxima: input end ] */ /* Maxima can't load/batch files which end with a comment! */ "Created with wxMaxima"$