Matematikk-seminar med Maple-demo
Ivar Skau og Harald Pleym
Mathematics possesses not only truth, but supreme beauty
- a beauty cold and au stere, like that of sculpture,
without appeal to any part of our weaker nature...
sublimely pure, and capable of a stern perfection
such as only the greatest art can show
Bertrand Russell
Symmetri og ornamentikk
Symmetri
Det klassiske symmetribegrepet
En symmetriegenskap ved en figur består i at den er invariant ved en kongruenstransformasjon (en avstandsbevarende transformasjon). Eksempler: Speiling, rotasjon . Hva mere?:
Setning: Enhver kongruenstransformasjon i planet kan klassifiseres som
En endelig figurs symmetriegenskap er gitt ved
1)
Rotasjoner
, symmetrigruppene er
, ...
Eksempel
på
:
> | alpha:=2*Pi/6: |
> | Rotasjon(pltHP(red),alpha,5); |
> | alpha:=67/180*Pi: |
> | Rotasjon(pltHP(red),alpha,5); |
> | R:=i->Rotasjon(pltHP(red),alpha,i): |
> | display(seq(R(i),i=0..20),insequence=true); |
> | Rotasjon(pltHP(red),alpha,90); |
2)
Speiling
, symmetrigruppene er
, ...
Eksempel
på
:
> | L1:=[[0,0],[1,0]]: L2:=[[0,0],[1,tan(Pi/5)]]: |
> | S:=Speiling(t1,L1,L2,axes=none,scaling=constrained):%; |
> | rot:=u->rotate(p2,u): plt:=u->display(S,rot(u)): display(seq(plt(2*Pi/100*i),i=0..20),insequence=true,scaling=constrained); |
> | beta:=72/180*Pi: |
> | display(S,rotate(S,2*beta),rotate(S,3*beta),scaling=constrained); |
Båndmønster
> | BåndMønster(1,red,8); |
> | BåndMønster(2,blue,8); |
> | BåndMønster(3,coral,8); |
> | BåndMønster(4,cyan,8); |
> | BåndMønster(5,magenta,10); |
> | BåndMønster(6,maroon,10); |
> | BåndMønster(7,pink,4); |
> | BåndMønster(8,turquoise,8); |
FermatPunktet
> | a,alpha,b,beta,d,e:=-1,0,1,0,0,-sqrt(3): |
> | FermatPunktet(1,1,a,alpha,b,beta,d,e,XY,G); |
> | XY; |
> | G; |
> | p:=(c,phi)->FermatPunktet(c,phi,a,alpha,b,beta,d,e,XY,G): |
> | display(seq(p(cos(Pi/41*i),sin(Pi/41*i)),i=1..38),tickmarks=[4,4],insequence=true,scaling=constrained); |
Similariteter og logaritmiske spiraler
> | plt:=n->polarplot(exp(-theta/20),theta=0..n*2*Pi,numpoints=1500,thickness=2,scaling=constrained): |
> | plt(20); |
Rotasjon av en logaritmisk spiral
Rotasjon mot urviseren gir en ekspansjon, rotasjon med urviseren gir en kontraksjon
Spiralformet gangmønster
Fire innsekter jager hverandre på en kvadratisk flate. Hvert innsekt har hele tiden kurs mot naboen.
Kjeglespiral
> | display(seq(Spiral(i),i=1..24),lightmodel=light2,insequence=true,orientation=[-71,66]); |
Sjøskjell
Punktet (
) på et skjell kan skrives på formen:
Parametrene er
Skjell
Natalina
> | Ld1:=[80,40,55,10,30,25,12,16,0,0,0,0,0]: theta1:=[-4*Pi,4*Pi]: S:=[-270,62]: Grid:=[100,200]: SeaShell(Ld1,Grid,theta1,S,Natalina,scaling=constrained,orientation=[-68,80],style=patchnogrid,lightmodel=light2,shading=xy); |
Natalina i aksjon
Lyria
> | Ld:=[83.9,-19,45,1,-2,50,40,14,0,6,27,8,8]: theta:=[-4*Pi,4*Pi]: S:=[-51,9]: Grid:=[80,150]: |
> | SeaShell(Ld,Grid,theta,S,Lyria,style=patchnogrid,scaling=constrained,orientation=[-39,66],lightmodel=light2,shading=xyz); |
Turritella
> | Ld:=[88.9,4,55,1,-2,22.2,1.3,1.5,0,0,0,0,0]: theta:=[-30*Pi,4*Pi]: S:=[-267,39]: Grid:=[30,250]: |
> | SeaShell(Ld,Grid,theta,S,Turritella,style=patchnogrid,scaling=constrained,orientation=[-83,89],lightmodel=light2,shading=xy); |
> |
Oxystele
> | Ld:=[84.9,7,-36,1,-2,47,40,19,0,6,27,8,0]: theta:=[-20*Pi,4*Pi]: S:=[-70,70]: Grid:=[40,350]: |
> | SeaShell(Ld,Grid,theta,S,Oxystele,style=patchnogrid,scaling=constrained,orientation=[-26,91],lightmodel=light2,shading=xyz); |
> |
Planorbis
> | Ld:=[84,85,10,45,5,45,20,30,0,0,0,0,0]: theta:=[-1*Pi,4*Pi]: S:=[-150,130]: Grid:=[50,150]: |
> | SeaShell(Ld,Grid,theta,S,Planorbis,style=patchnogrid,scaling=constrained,orientation=[-94,65],lightmodel=light3,shading=xy); |
Ammonite
> | Ld:=[83,90,1,1,1,2.5,1.0,0.9,10,100,20,15,0.5]: theta:=[-Pi,4*Pi]: S:=[-170,170]: Grid:=[40,160]: |
> | SeaShell(Ld,Grid,theta,S,Ammonite,style=patchnogrid,scaling=constrained,orientation=[-90,62],lightmodel=light4,shading=xy); |
Conus
> | Ld:=[87,7,78,0,0,7,4.3,1.0,0,0,0,0,0]: theta:=[-12*Pi,4*Pi]: S:=[-180,2]: Grid:=[60,280]: |
> | SeaShell(Ld,Grid,theta,S,Conus,style=patchnogrid,scaling=constrained,orientation=[-81,94],lightmodel=light2,shading=xy); |
Helcion
> | Ld:=[18,90,0,0,-40,450,400,310,0,0,0,0,0]: theta:=[-0,4*Pi]: S:=[-180,180]: Grid:=[60,100]: |
> | SeaShell(Ld,Grid,theta,S,Helcion,style=patch,scaling=constrained,orientation=[121,103],color=eggshell); |
Nautilus
> | Ld:=[80,90,0,0,0,2,2,1.5,0,0,0,0,0]: theta:=[Pi,4*Pi]: S:=[-163,163]: Grid:=[30,60]: |
> | SeaShell(Ld,Grid,theta,S,Nautilus,style=patchnogrid,scaling=constrained,orientation=[-79,54],lightmodel=light2,shading=xyz); |
Codakia
> | Ld:=[37,90,0,1,1,10500,10000,10500,0,0,0,0,0]: |
> | theta:=[-Pi,4*Pi]: S:=[-180,180]: Grid:=[100,100]: |
> | SeaShell(Ld,Grid,theta,S,Codakia,style=patch,scaling=constrained,orientation=[-122,-58],color=gainsboro); |
Ukjent
> | Ld:=[83,90,1,1,1,2.5,1,0.9,Pi/18,5*Pi/9,Pi/9,15,1/2]: theta:=[-Pi,3*Pi]: S:=[-170,170]: Grid:=[150,250]: |
> | SeaShell(Ld,Grid,theta,S,Utvekster,style=patchnogrid,scaling=constrained,orientation=[-90,15],lightmodel=light2,shading=xy); |
Struthiolaria
> | Ld:=[86.9,13,40,10,30,5,1.8,1.6,-15,5,5,16,1/2]: |
> | theta:=[-20*Pi,4*Pi]: S:=[-168,24]: Grid:=[50,350]: |
> | SeaShell(Ld,Grid,theta,S,Struthiolaria,style=patchnogrid,scaling=constrained,orientation=[-58,82],lightmodel=light2,shading=xy); |
Forvitring av et skjell
> | Ld:=[84.2,20,-55,0,0,20,7.5,5,0,6,27,8,0]: |
> | theta:=[-20*Pi,4*Pi]: S:=u->[-180,-25*u]: Grid:=[50,350]: |
> | p:=u->SeaShell(Ld,Grid,theta,S(u),Struthiolaria,style=patch,scaling=constrained,orientation=[-85,50],color=light_tan): |
> | display(seq(p(u),u=-6..1),insequence=true); |
Sluttproduktet uten gridlinjer
> | SeaShell(Ld,Grid,theta,S(1),Struthiolaria,style=patchnogrid,scaling=constrained,orientation=[73,77],lightmodel=light4,color=light_tan); |
Smultring
> | Ld:=i->[90,90,0,0,0,25,6+i/80,(i/80)^2,0,0,0,0,0]: theta:=[-4*Pi,4*Pi]: S:=[-270,90]: Grid:=[20,40]: |
> | s1:=i->SeaShell(Ld(i),Grid,theta,S,Natalina,style=wireframe,scaling=constrained,orientation=[-68,54],color=coral): |
> | display(seq(s1(i),i=90..240),insequence=true,scaling=constrained,orientation=[-68,54]); |
Det gyldne snitt og Fibonacci-tallene
Det gyldne snitt
> | GyldneSnitt(20,s); |
> | s; |
Eksakt løsning
> | eq:=F(n)=F(n-2)+F(n-1):%; |
> | F(n)=rsolve({eq,F(0)=1,F(1)=1},F(n)); F:=unapply(rhs(%),n): |
> | F(10)=simplify(F(10)); |
> | L:=[seq(simplify(F(i)),i=1..50)]; |
> | GS:=Limit(F(n)/F(n-1),n=infinity): GS=value(GS); |
Fibonacci og binomialkoeffisientene
> | f:=n->sum(binomial(n-k,k-1),k=1..n): |
> | 'f(n)'=f(n); |
> | seq(f(n),n=1..20); |
> | PascalsTrekant(6); |
> | matrix(10,10,(i,j)->binomial((i-1),(j-1))); |
Vekst av punkter (frøsetting på en solsikke)
På en sirkel
> | FrøPlot(12,0,5/16,style=point,symbol=box,symbolsize=16,color=red,axes=none); |
> | FrøPlot(110,0,Pi-3,style=point,symbol=circle,symbolsize=16,color=red,axes=none); |
Spiral
> | Vekst(200,1/2,Pi-3,P,style=point,symbol=circle,symbolsize=12,color=red,axes=none); |
> | with(numtheory): |
> | cf:=n->cfrac (Pi-3,n): |
> | seq(cf(i),i=1..5); |
> | Konv:=n->nthconver (cf(n),n): |
> | seq(Konv(i),i=1..5); |
Solsikke
> | p1:=FrøPlot(150,1/2,(sqrt(5)-1)/2,style=point,symbol=circle,symbolsize=18,color=red,axes=none):%; |
> | p2:=FrøPlot(150,1/2,(sqrt(5)-1)/2,style=line,color=blue,axes=none): |
> | display(p1,p2); |
> | p3:=FrøPlot(150,1/2,13/21,style=point,symbol=circle,symbolsize=18,color=red,axes=none):%; |
> | p4:=FrøPlot(150,1/2,13/21,style=line,color=blue,axes=none): |
> | display(p1,p2); |
Et snodig "paradoks" basert på formelen:
Eksempel 1
13·5 -
= 1
Løsning paradokset
Eksempel 2
Løsning på paradokset
Fraktaler
Snøfnugg
> | Snøfnugg(2,blue); |
> | Snøfnugg(5,blue); |
> | display(seq(Snøfnugg(i,blue),i=0..5),insequence=true); |
Lengden av snøfnugget er gitt ved
> | eq:=s(n) = s(n-1)+s(n-1)/3, s(1)=3:%; |
> | s(n)=rsolve({eq},s(n)); |
> | s:=unapply(rhs(%),n): |
> | plot(s(n),n=1..20,`s(n)`); |
Sierpinski
> | L:=[[0,0],[2,0],[1,tan(Pi/3)]]: |
> | Sierpinski(L,5,t); |
> | display(seq(Sierpinski(L,i,t),i=1..5),insequence=true); |
> | L:=[[-1,-1,0],[0,sqrt(3)-1,0],[1,-1,0],[0,sqrt(3)/3-1,2*sqrt(15)/5]]: |
> | Sierpinski(L,3,p); |
> | display(seq(Sierpinski(L,i,p),i=1..5),insequence=true); |
> | L:=[[0,0],[0,1],[1,0]]: |
> | S:=Sierpinski(L,5,t,axes=none):%; |
> | T:=transform((x,y)->[x^2*(x-1),y]): |
> | display(T(S)); |
Mandelbrot
Flytdiagrammet indikerer beregningen som utføres for å bestemme fargen som skal assosieres med punktet i det komplekse planet svarende til det komplekse tallet
. Maksimum antall iterasjoner som trengs for å bestemme om et punkt tilhører Mandelbrotsettet eller ikke er vilkårlig satt til
, som kan økes for finere detaljer. Tilsvarende er "unnslipningsdistansen" satt
> | plot3d(0,-2.1..1.1,-1.6..1.6,orientation=[-90,0], grid=[150,150],style=patchnogrid,scaling=constrained,color=Mandelbrot); |
Flere eksempler
zoom 1
Sentrum:
, der
.
1616
og
.6519
. Bredde og høyde:
0.012
zoom 2
Sentrum:
, der
.161617 og
.
654518
. Bredde og høyde:
0.0006
zoom 3
Sentrum:
, where
.
16161714
and
.
65451814
. Bredde og høyde:
0.000006
.
zoom 4
Sentrum:
, der
.
1616171402
og
.
654518136
. Bredde og høyde:
0.0000024
.
Dette er omtrent minste utsnitt som kan gjøres med Maple. Videre inn-zooming må gjøres med andre typer av computerprogrammer.
zoom 5
Sentrum:
, der
.
1616171402
og
.
654518136
. Bredde:
.
zoom 6
Sentrum:
, der
.
1616171402
og
.
654518136
. Bredde:
.
zoom 7
Sentrum:
, der
.
16161714023
og
.
65451813597
. Bredde:
.
zoom 8
Sentrum:
, where
.161617140231491 and
.654518135972208. Width:
.
zoom 9
Sentrum:
, der
.
161617140232233
og
.
65451813597249
. Bredde:
.
Andre typer
Eksempel 1
Eksempel 2
Eksempel 3
Eksempel 4
Eksempel 5
RSA-kryptering
Oppskriften
Ola ønsker at Dolly skal sende ham en hemmelig melding som ingen andre kan lese. Da må hun kunne RSA-kryptere meldingen . Her er hva Ola må gjøre:
1. Han finner to store primtall p og q .
2.
Han danner produktet
n = pq
.
3.
Han beregner
(
n
) = (
p -
1) (
q-
1) som inngår i
Euclid-algoritmen
:
d e
+
t
(
p -
1) (
q
- 1) = 1
, som gir han
dekodingsnøkkelen
d
4.
Han velger et positivt tall
e
slik at største felles heltalls-divisor
igcd
(
e
,
(
n
)) = 1
.
5.
Han beregner
d
=
mod
(
n
)
6.
Han sender den
offentlige nøkkelen
med tallparet [
n
,
e
] til
Dolly
.
Tallene
[
p
,
q
,
d
,
(
n
)]
må
holdes hemmelig
.
d
er den
private nøkkelen
(som
dekoder
)
7.
Ola
forteller
Dolly
hvordan Maple skal brukes for å konvertere teksten i meldingen til en sekvens av positive heltall
,
, . . . ,
,
som hver må være mindre enn
n
.
Denne metoden vises i eksemplet under og kan gjøres
offentlig
8.
Ola
ber
Dolly
om å beregne
mod
n
og sende ham sekvensen av tallene
,
, . . .,
.
Hun behøver ikke å holde alle
hemmelig etter at de er beregnet, men hun bør holde alle
hemmelig
9.
Når
Ola
får sekvensen av
fra
Dolly
, beregner han
mod
n
, som da gir sekvensen
som
Dolly
sendte ham.
Og
så konverterer
Ola
sekvensen
til tekst og får dermed den dekrypterte meldingen fra
Dolly
, som vist under.
Kodingen og dekodingen
> | restart; |
Bokstaver til ascii tall og motsatt
> | Melding:="Hallo Ola. Det du driver med av kryptering er kjempebra. Nå kan jeg faktisk sende glødene hete meldinger til deg uten at det kommer frem i offentlighetens lys. Det er kjempebra, og så har jeg også fått med meg hva kryptering er for noe rart. Love og hilsen Dolly!"; |
> | convert(Melding,bytes); |
> | convert(%,bytes); |
Kryptering og dekryptering av en melding
De følgende kommandoer danner en
RSA kryptering
ved å generere to primtall
p
og
q
, som så brukes til å danne tallene
n
og
(
n
) = (
p -
1) (
q-
1)
,
satt lik
f
under.
> | N:=rand(10^19..10^20-1 )(); M:=rand(10^19..10^20 -1)(); |
> | p:= nextprime(N); |
> | q:= nextprime(M); |
Vi sjekker om tallene er primtall med isprime
> | isprime(p); isprime(q); |
Offentlige nøkler ( Public key ) er n og e ( innkoder ):
n skal ved modulo-regning ( mod n ) kutte halen av (de vanvittig store) tallene.
> | n:=p*q; |
> | length(n); |
> | R:=rand(10^18..10^19-1 )(); |
> | e:=nextprime(R); |
Euclid-algoritmen gir oss dekodingsnøkkelen d :
> | f:=(p-1)*(q-1); |
> | igcdex(e,f,'d','t'); #gir største felles nevner (må være = 1) samt d |
> | d; #kan ikke være negativ |
> | igcd(e,f); |
> | d:=1/e mod f; |
d må holdes strengt hemmelig ( privat ) fordi den dekoder .
> | 'n'=n; |
> | Melding; #meldingen |
> | OffentligNøkkel:=n; |
> | e; |
> | PrivatNøkkel:=d; |
> | L1:=convert(Melding,bytes); |
Eksempel på tastatur tegn og tilhørende tall
Det fins 255 tegn på tastaturet . Tar vi med et mellomrom ( space ) blir det 256 tegn .
> | convert("a",bytes), convert("A",bytes);; |
> | convert([1,97,65,255],bytes); |
> | convert([256],bytes); |
Nå konverterer vi meldingens "byte" -liste L1 med base 256 til base n .
Hva betyr det?
Et mer kjent eksempel:
> | convert([12],base,10,2); |
> | 0*2^0+0*2^1+1*2^2+1*2^3; |
> | convert([64],base,10,8); |
> | 0*8^0+0*8^1+1*8^2; |
> | convert([64,8,9,6],base,10,8); |
> | 64*10^0+8*10^1+9*10^2+6*10^3=4*8^0+0*8^1+6*8^2+5*8^3+1*8^4; |
> | base_n=length(n); |
> | L1; |
> | L2:=convert(L1,base,256,n); |
> | map(length,L2); |
Dollys
kodete melding
blir nå at vi anvender operatoren
&^e mod n
på meldingen, dvs. på hvert element i listen
L2
. Vi definerer funksjonen
E
slik at
.
> | E:=x->Power(x,e) mod n; |
> | 'e'=e; |
> | unprotect(D): |
Vi gjenkaller tallkoden med
> | D:=x->Power(x,d) mod n; |
> | 'd'=d; |
La oss sjekke kodingsfunksjonen E og dekodingsfunksjonen D .
> | 60, 'E(60)'=E(60), 'D(E(60))'=D(E(60)); |
Nå kodes L2 .
> | Kryptering:=map(E, L2); |
Denne koden kan offentligjøres for hele verden. Dekodingen skjer via D(x) , når man har tilgang til nøkkelen d .
> | DeKryptering:=map(D,Kryptering); |
Nå konverteres først tallkoden til tall i basen 256 .
> | DeKryptering2:=convert(DeKryptering,base,n,256); |
Videre konvertering til bytes gir Dollys leselig tekst .
> | DeKryptering3:=convert(DeKryptering2,bytes); |
> |
Automatiserte prosedyrer
> | Melding:="Til alle som vanligvis ikke vinner i Lotto! Følgende Lottokupong går inn med full pott førstkommende lørdag: [[1, 5, 9, 13, 27, 28, 30], [1, 10, 14, 27, 28, 29, 33], [4, 8, 11, 16, 21, 27, 32], [7, 10, 14, 24, 25, 27, 28], [4, 5, 7, 8, 19, 24, 30], [5, 17, 19, 22, 23, 33, 34], [4, 5, 12, 13, 14, 17, 19], [5, 8, 13, 22, 26, 29, 34], [2, 3, 5, 8, 24, 28, 30], [5, 17, 18, 25, 26, 31, 33]]. Hilsen fra Norsk Tipping"; |
> | K:=Kryptering(Melding,n,d); |
> | n; #offentlig nøkkel |
> | d; #privat nøkkel |
> | DeKryptering(K,n,d); |