**********************************************************************************************

\(Clear[f]; 

f[z_] := z^5 + z^3 + \ 2\ z + 2; 


    coords[z_] := {Re[z], Im[z]}; 


    Show[GraphicsArray[{
          Graphics[
            Table[{Hue[r], PointSize[0.007], 
                Point[coords[r\ E^\((I\ t)\)]]}, {
                t, 0, 2\ Pi,  .01}, {r,  .5, 1.4,  .1}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{\(-1.5\), 1.5}, {\(-1.5\), 1.5}}, Axes -> True], 
          Graphics[
            Table[{Hue[r], PointSize[0.008], 
                Point[coords[
                    f[r\ E^\((I\ t)\)]]]}, {t, 0, 
                2\ Pi,  .01}, {r,  .5, 1.4,  .1}], AspectRatio -> Automatic, 
            PlotRange -> {{\(-9\), 13}, {\(-9\), 9}}, Axes -> True]}]]\)

Complexe veeltermen
(cirkels, spirografen en krommen)

Project EXPLOOT
Hania Uscka
Vrije Universiteit Brussel

Inhoudsopgave

1. Inleiding
2. Spirograaf - een staaltje van moderne kunst of designer van Brussels kant?
3. Van robot tot draaiende wielen
	3.1. Robot en efficiëntie - probleembeschrijving
	3.2. Discussie en oplossing
	3.3. Calypso
	3.4. Waarom maar 1 elleboog?
4. Veeltermen
	4.1. Veralgemening van de vorige hoofdstukken. spirograaf - WAT is dat eigenlijk??? [ontrafelen van het geheim]
	4.2. Voorbeelden  (z^4)+2  z+1   en  (z^5) + z  - nulpunten en injectiviteit
	4.3. Een familie veeltermen
	4.4. De Hoofdstelling van de Algebra
		4.4.1. Een animatie
		4.4.2. Hoe elk nulpunt voor een extra lusje rond de oorsprong van de spirograaflijn zorgt
5. Antwoorden op vraagstukken
	5.1. Waarom rechte lijn???
	5.2. Nulpunten van complexe veeltermen met reële coëfficiënten
	5.3. Ligging van de spirograaf-kurven ten opzichte van de assen
	5.4. Spirograaf-kurven en hun symmetrieën

Inleiding

Nog een notebook over complexe getallen??? - hoor ik jullie verschieten - waarvoor?
Kort gezegd: als beloning voor degenen die (met of zonder hulp van de eerste notebook over complexe getallen) hebben kennis gemaakt met basisoperaties op die getallen en zich nu afvragen "waarvoor eigenlijk..."
Ik ga hier niet beschrijven, hoe complexe getallen gebruikt worden om de wisselstroom te beschrijven. Ik ga je alleen maar zeggen DAT ze dat doen - en ze doen dat goed. Hoe - vraag aan je electronikaleraar. Je wordt hier wel uitgenodigd om met complexe veeltermen te experimenteren. Klinkt niet goed? - ik weet het. Maar straks ga je zien hoe boeiend dat kan zijn. Herinner je je nog de "reclame" van de spirograaf van de eerste notebook over complexe getallen? - nu ga je zelf spirografen kunnen tekenen, naar hartelust. En - willen of niet - een aantal belangrijke feiten van de wiskunde erbij oprapen.
Veel plezier!

Spirograaf - een staaltje van moderne kunst of designer van Brussels kant?

Bekijk eens die kronkelende kurve. Hoe gecompliceerd en nochtans regelmatig. Dat is een voorbeeld van spirograaf-kurve. Nu nog een beetje geheimzinnig. Tijdens het werken met die notebook ga je ontdekken WAT ze eigenlijk is en hoe ze ontstaat.

\(Clear[f, n, cons]; 


      f[φ_] := 
        Plus@@Table[E^\((cons^k\ I\ φ)\)/2^k, {k, n}]\)
	n = 5;
cons = 3;

spirograaf[f_, φ_, opts___]:=
	ParametricPlot[{Re[f], Im[f]},{φ, -π,  π},
		opts,
		PlotRange -> All,AspectRatio -> Automatic,Frame -> True,Axes -> False,FrameTicks -> None,PlotPoints -> 250];

𝓈 = 
        spirograaf[f[φ], φ, PlotPoints -> 2 cons 2^n]
          ;

Van robot tot draaiende wielen

Robot en efficiëntie - probleembeschrijving

Stel je een robot voor, die twee armen heeft. Twee armen verbonden door een "elleboog" - zoals op de tekening hieronder. De armen kunnen verschillende lengtes hebben en kunnen ook bewegen met verschillende hoeksnelheden. De eerste arm beweegt steeds tegen de wijzers van de klok in, voor de tweede arm maken we iedere keer een keuze van de richting. De eerste arm draait rond het punt waaraan hij vastzit, de tweede arm rond de elleboog.
De vraag is - hoe moet de robot in mekaar zitten (de verhouding van de armlengtes, de verhouding van arm-hoeksnelheden) om op de meest efficiënte manier, dus met een minimum aan werk, een voorwerp van rechts naar links te brengen.

Als je in programmatie geïnteresseerd bent, klik de cel open. In het programma zijn  len1  en  len2  de twee armlengtes,  c  is snelheidsratio (verhouding van de snelheid van de tweede arm tot de snelheid van de eerste). De parameters in de eerste tekening zijn  (1, .5, 2)  - de tweede arm is dus  50%  korter dan de eerste (en dit is vanaf nu een vast gegeven in alle onze voorbeelden) en beweegt  2  keer sneller. De vierde parameter van "robotTekening" is bijna altijd π (later soms ook 2π). Die parameter bepaalt de volledige hoek waar de eerste robot-arm om draait.
Bekijk eens het effect van de beweging - het traject van de "robot-hand" (de rode kurve):

\(Clear[x, y, move, arm1punten, arm1, arm2punten, arm2, robotTekening]; 

    
x[len1_, len2_, c_, t_] := len1\ Cos[t] + len2\ \ Cos[c\ t]; 

    y[len1_, len2_, c_, t_] := len1\ Sin[t] + len2\ \ Sin[c\ t]; 


    move[len1_, len2_, c_, tot_] := {Hue[0], 
        Table[Point[{x[len1, len2, c, t], y[len1, len2, c, t]}], {t, 0, tot, 
            0.01}]}; 


    arm1punten[len1_, tot_] := 
      Table[{{0, 0}, {len1\ Cos[t], len1\ Sin[t]}}, {t, 0, \ tot, Pi/20}]; 

    
arm1[len1_, tot_] := Map[Line, arm1punten[len1, tot]]; 


    arm2punten[len1_, len2_, c_, tot_] := 
      Table[{{len1\ Cos[t], len1\ Sin[t]}, {x[len1, len2, c, t], 
            y[len1, len2, c, t]}}, {t, 0, \ tot, Pi/20}]; 


    arm2[len1_, len2_, c_, tot_] := 
      Map[Line, arm2punten[len1, len2, c, tot]]; 


    robotTekening[len1_, len2_, c_, tot_] := 
      Show[{Graphics[arm1[len1, tot]], Graphics[arm2[len1, len2, c, tot]], 
          Graphics[move[len1, len2, c, tot]]}, AspectRatio -> Automatic, 
        PlotRange -> {{\(-1.5\), 1.5}, {\(-1.5\), 1.5}}]; \)

robotTekening[1,  .5, 2, Pi]

Laat ons de tweede arm drie maal zo snel doen bewegen als de eerste, zonder iets te veranderen aan de armlengtes:

Show[{Graphics[arm1[1,Pi]],Graphics[arm2[1,.5,3,Pi]],Graphics[move[1,.5,3,Pi]]},AspectRatio -> Automatic]

En als we c  (de snelheidsverhouding) laten variëren van  2  tot  -1  - om de  0.3:

\(Do[
	
      Show[
		{Graphics[arm1[1, Pi]], 
          Graphics[arm2[1,  .5, \(-c\) + 1, Pi]], 
          Graphics[move[1,  .5, \(-c\) + 1, Pi]]}, AspectRatio -> Automatic, 
        PlotRange -> {{\(-1.5\), 1.5}, {\(- .5\), 1.5}}]
, {c, \(-1\), 
        2,  .3}]\)

De vraag blijft:
Welke robot is de meest efficiënte om een voorwerp van rechts naar links te brengen?
			
Herneem de berekeningen van lineaire snelheid en kracht, die hieronder voor  c=2  gemaakt werden, voor
c = -1  (vervang de groene "2" in het programma hieronder door "-1" en evalueer alle cellen).
Voor  c=-1  blijkt de som van de versnellingen (krachten) minimaal te zijn en daarom is het werk minimaal.

Discussie en oplossing

Opgelet:
In deze paragraaf bedoelen we door "snelheid" (en dat is héél uitzonderlijk in deze notebooek!) de lineaire snelheid van de beweging. Als we het over de snelheid van een arm hebben, bedoelen we altijd de hoeksnelheid van die arm!

Analyse van snelheid en versnelling.
We blijven bij de verhouding  1:2  voor de lengtes en zoeken naar de snelheidsverhouding  c,  waarbij de beweging het efficiëntst is.

De tekening hieronder toont de kurve van de beweging voor  c=2:

Clear[x, y, move]
x[t_] := len1 Cos[t] + len2  Cos[c t]y[t_] := len1 Sin[t] + len2  Sin[c t]
		Clear[c, len1, len2];
c=2;
len1 = 1;
len2 =  .5 ;

move[tot_]:=ParametricPlot[{x[t], y[t]},{t, 0, tot}
,AspectRatio -> Automatic
	,PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}}
	,PlotStyle -> Hue[0]]

move[Pi]

Snelheid van de beweging wordt door de eerste afgeleide van de verplaatsingsfunctie uitgedrukt.
Op de eerste tekening hieronder zie je de snelheidskurve. Dat zijn de eindpunten van de snelheidsvectoren voor alle parameters  t  van  [0,π] . Die vectoren zijn gevestigd in de oorsprong. Op de tweede tekening hieronder zie je enkele van die vectoren (voor de parameters  t  om de  π/16) in het donkerblauw:

\(Clear[snelheden]; 


    snelheden := 
      Show[Table[
          Graphics[{Hue[0.7], Line[{{0, 0}, {\(x'\)[t], \(y'\)[t]}}]}], {t, 
            0, Pi, Pi/16}], Axes -> True, AspectRatio -> Automatic, 
        PlotRange -> {{\(-3\), 3}, {\(-3\), 3}}]; 


    ParametricPlot[{\(x'\)[t], \(y'\)[t]}, {t, 0, \ Pi}
, 
      AspectRatio -> Automatic
	, PlotRange -> {{\(-3\), 3}, {\(-3\), 3}}]

    \)snelheden

Op de tekeningen hieronder zie je:
1. Op de eerste tekening - de rode lijn van de beweging
2. Op de tweede tekening - dezelfde lijn en de donkerblauwe snelheidsvectoren (vergelijk met de tekening hierboven!) gevestigde in de punten van de trajectlijn, voor parameters  t  om de  (π/16). Symbool  (Subscript[v, n])  voor   n=0,1,...,15   beschrijft de snelheidsvector voor de parameter  t=n(π/16).
Merk op dat de lengte van de snelheidsvectoren niet constant is: de beginsnelheid is zeer groot en het voorwerp vertraagt bij aankomst:

\(eindpunten = 
      Table[{{x[t], y[t]}, {x[t] + \(x'\)[t], y[t] + \(y'\)[t]}}, {t, 0, Pi, 
          Pi/16}]; 

    tekstenSnelh = 
      Table[	Text[
          FontForm[v\_n, {"Courier-Bold", 16}], {
            x[n\ Pi/16] + \(x'\)[n\ Pi/16], 
            y[n\ Pi/16] + \(y'\)[n\ Pi/16]}], {n, 0, \ 15, 1}]; 


    rakend = Map[Line, eindpunten]; \)

Show[{
        Graphics[{Hue[0.7], rakend, tekstenSnelh}, AspectRatio -> Automatic, 
          PlotRange -> {{-2, 1.5}, {-1, 3}}, Axes -> True], 
        move[Pi]}, AspectRatio -> Automatic]

Op de tekeningen hieronder zie je:
1. Op de eerste tekening - de rode lijn van de beweging
2. Op de tweede tekening - dezelfde lijn en de groene versnellingsvectoren gevestigde in de punten van de trajectlijn, voor parameters  t  om de (π/16).  Symbool  (Subscript[a, n])  voor   n=0,1,...,15  beschrijft de versnellingsvector voor de parameter   t=n(π/16).
Elke versnellingsvector  (Subscript[a, n]) op de tekening heeft vertrekpunt in   (x(n(π/16)),y(n(π/16)))   en eindpunt in   (x(n(π/16))+x"(n(π/16)),y(n(π/16))+y"(n(π/16))),  waar   t->(x(t),y(t))   een parameterbeschrijving van de beweging is (parametervoorstelling van de rode kurve).
Merk op dat de lengte van de versnellingsvectoren (trouwens evenredig met de krachtenvectoren!) steeds vrij groot is en dat bij het einde van de beweging tegen de zin van de beweging wordt getrokken:

\(trekpunten = 
      Table[{{x[t], y[t]}, {x[t] + \(\(x'\)'\)[t], y[t] + \(\(y'\)'\)[t]}}, {
          t, 0, \ Pi, Pi/16}]; 

    tekstenVersn = 
      Table[	Text[
          FontForm[a\_n, {"Courier-Bold", 16}], {
            x[n\ Pi/16] + \(\(x'\)'\)[n\ Pi/16], 
            y[n\ Pi/16] + \(\(y'\)'\)[n\ Pi/16]}], {n, 0, \ 15, 1}]; 


    kracht = Map[Line, trekpunten]; \)

\(Show[{
        Graphics[{{Hue[ .3], kracht}, tekstenVersn, 

            				{Hue[ .9], Dashing[{ .05,  .05}], 
              Circle[{0, 0}, Abs[1 - c^2]\ len2]}, 

            		{Hue[ .7], Thickness[ .01], 
              Line[{{x[Pi/16], y[Pi/16]}, {x[Pi/16] + \(\(x'\)'\)[Pi/16], 
                    y[Pi/16] + \(\(y'\)'\)[Pi/16]}}]}, 

            					{Hue[ .15], Thickness[ .01], 
              Line[{{x[7\ Pi/16], y[7\ Pi/16]}, {
                    x[7\ Pi/16] + \(\(x'\)'\)[7\ Pi/16], 
                    y[7\ Pi/16] + \(\(y'\)'\)[7\ Pi/16]}}]}
			}], 
        move[Pi]}, AspectRatio -> Automatic, 
      PlotRange -> 
        If[\((1 - c^2 != 0)
            \), {{\(-Abs[1 - c^2]\)\ len2 -  .2, Abs[1 - c^2]\ len2 +  .2}, {
              \(-Abs[1 - c^2]\)\ len2 -  .2, Abs[1 - c^2]\ len2 +  .2}}, {{
              \(-1.6\), 1.6}, {0, 1.6}}], Axes -> True]\)

De krachten werken dus niet echt mee...

Merk op dat de eindpunten van de versnellingsvectoren - punten met coordinaten  (x(t)+x"(t),y(t)+y"(t))  - een kurve vormen die verdacht veel op een cirkel lijkt (de paarse stippelijn op de tekening hierboven). Misschien is dat echt een cirkel? Indien wel - is dat maar toeval of zou dat zo zijn voor alle waarden van c,  len1  en  len2? Even rekenen:

x(t) = len1 cos t + len2 cos(ct)
x'(t) = - len1 sin t - c len2 sin(ct)
x"(t) = - len1 cos t - (c^2) len2 cos(ct)

dus de som is:

x(t) + x"(t) = (1-(c^2)) len2 cos(ct)

Hetzelfde voor de tweede coördinaat in de parametervoorstelling:

y(t) = len1 sin t + len2 sin(ct)
y'(t) = len1 cos t + c len2 cos(ct)
y"(t) = - len1 sin t - (c^2) len2 sin(ct)

dus:

y(t) + y"(t) = (1-(c^2)) len2 sin(ct)

Iedereen weet dat  (cos^2) α + (sin^2) α = 1  voor elke  α. Dat betekent, dat

(((x (t) + x'' (t)))^2)+(((y (t) + y'' (t)))^2) = (((1 - (c^2)))^2) (((len2))^2),
voor elke t  van  [0,2π]

de punten  ( x(t) + x"(t), y(t) + y"(t) )  voor  t  van  [0,2π]  vormen dus een cirkel met het middelpunt  (0,0)  en straal   |1-(c^2) | len2.
Juist... waarom absolute waarde?  (1-(c^2)) len2  is in dit geval  (c=2,  len2=0.5)  gelijk aan -1.5. Straal van een cirkel kan toch niet negatief zijn... Neen - kijk eens naar de tekening. Let op de donkerblauwe en gele lijnen. Ze verenigen de punten  (x(t),y(t))  en  (x(t)+x"(t), y(t)+y"(t))  voor twee waarden parameter  t:  (π/16)  en  ((7 π)/16). Het eindpunt van een versnellingsvector in punt  (x(t),y(t))  beschrijft het punt van de cirkel dat in gewone parametervoorstelling van een cirkel door parameter  π+ct  beschreven wordt. cos(π+ct)=-cos(ct),  sin(π+ct)=-sin(ct).  Daaruit de negatieve waarde.

Probeer hetzelfde uit te voeren voor de andere waarden van de parameter c. Check dat je werkelijk in alle gevallen cirkels krijgt. Voor  c=3  krijgt men een zeer mooie tekening. En  c=1  of  c=-1?  - kan je vragen. Juist, dan is  1-(c^2) = 0   en kan men niet van een cirkel spreken. Waarom niet? En cirkel met straal 0 is gewoon een punt. Doe eens een experiment - vallen alle eindpunten van de versnellingsvectoren voor  c=1  en  c=-1 in 1 punt?

Calypso

We gaan nu nog de robot voor  c<0  bekijken. Tot nu toe hebben wij, behalve de positieve waarden van  c, nog maar één negatieve waarde voor  c  geanalyseerd:  c=-1 . Zie hieronder de tekeningen voor  c=-4,  c=-5  en  c=-3.
Doet het je niet aan kermis denken?

\(Clear[x, y, move, arm1punten, arm1, arm2punten, arm2]; 


    x[len1_, len2_, c_, t_] := len1\ Cos[t] + len2\ \ Cos[c\ t]; 

    y[len1_, len2_, c_, t_] := len1\ Sin[t] + len2\ \ Sin[c\ t]; 


    move[len1_, len2_, c_, tot_] := {Hue[0], 
        Table[Point[{x[len1, len2, c, t], y[len1, len2, c, t]}], {t, 0, tot, 
            0.01}]}; 


    arm1punten[len1_, tot_] := 
      Table[{{0, 0}, {len1\ Cos[t], len1\ Sin[t]}}, {t, 0, \ tot, Pi/20}]; 

    
arm1[len1_, tot_] := Map[Line, arm1punten[len1, tot]]; 


    arm2punten[len1_, len2_, c_, tot_] := 
      Table[{{len1\ Cos[t], len1\ Sin[t]}, {x[len1, len2, c, t], 
            y[len1, len2, c, t]}}, {t, 0, \ tot, Pi/20}]; 


    arm2[len1_, len2_, c_, tot_] := 
      Map[Line, arm2punten[len1, len2, c, tot]]; \)

Show[{Graphics[arm1[1, 2 Pi]], Graphics[arm2[1,  .5, -5, 2 Pi]], 
        Graphics[move[1,  .5, -5, 2 Pi]]}, AspectRatio -> Automatic]

Show[{Graphics[arm1[1, 2 Pi]], Graphics[arm2[1,  .5, -4, 2 Pi]], 
        Graphics[move[1,  .5, -4, 2 Pi]]}, AspectRatio -> Automatic]

Show[{Graphics[arm1[1, 2 Pi]], Graphics[arm2[1,  .5, -3, 2 Pi]], 
        Graphics[move[1,  .5, -3, 2 Pi]]}, AspectRatio -> Automatic]

Waarom maar 1 elleboog?

Opgelet:
In vervolg gaan we de hoeksnelheden waarmee armen draaien, gewoon "snelheden" noemen. We gaan toch niet meer over de lineaire snelheden in deze notebook spreken.

Tot nu toe hebben we ons tot twee armen beperkt. Twee armpjes die door middel van de elleboog aan mekaar vastzitten. Waarom maar 1 elleboog? - Kom, nou, heb je ooit iemand gezien die een "driedelige" arm had? Neen... Maar - als we nu even anders naar de robot kijken... Robot als twee draaiende wielen (de draaibeweging van de armen is immers een cirkelbeweging!):
Het middelpunt van het eerste wiel (met de straal 1) zit vast en het wiel draait (tegen de wijzers van de klok) met hoeksnelheid v rond dit punt. Het middelpunt van het tweede wiel (met de straal 0.5) ligt op de omtrek van het eerste wiel, dus draait mee met het eerste wiel. Tegelijkertijd draait het tweede wiel rond zijn eigen middelpunt met hoeksnelheid cv - in dezelfde zin als het eerste wiel indien c>0, in tegengestelde zin indien c<0; niet trager dan het eerste, omdat we alleen gehele c beschouwen, dus geldt ook dat Abs[c]≥1.
Dan spreken we niet meer van het vergroten van het aantal ellebogen (bah! Wat een gedacht!), maar van het vergroten van het aantal wielen - klinkt toch veel "beschaafder", neen?

\(Clear[machten, f, g, move, coords, armen, cirkels, som, spiroAnimatie]; 

    
machten[machtenList_, z_] := \ z^machtenList; 


    f[coeffList_, machtenList_, φ_] := 
      If[Length[coeffList] == 1, 
        coeffList[\([1]\)]\ E^\((I\ φ\ machtenList[\([1]\)])\), 
        \((coeffList . \ machten[machtenList, z])\) /. 
          z -> E^\((I\ φ)\)]; 


    g[coeffList_, machtenList_, φ_, 0] := 0\)g[coeffList_, machtenList_, φ_, n_] := 
          f[Take[coeffList, n], Take[machtenList, n], φ];

move[coeffList_, machtenList_, s_, a_] := 
          Table[{Hue[a], Point[coords[f[coeffList, machtenList, t]]]}, {t, 0, 
               s, 0.01}];

coords[z_] := {Re[z], Im[z]};

armen[coeffList_, machtenList_, s_] := 
          Table[{Line[
                Table[coords[g[coeffList, machtenList, φ, n]], {n, 
                    0, Length[coeffList], 1}]], {GrayLevel[1], 
                Line[Table[
                    coords[g[coeffList, machtenList, φ - Pi/20, 
                        n]], {n, 0, Length[coeffList], 1}]]}}, {φ, 
              0,  s, Pi/20}];

cirkels[coeffList_, machtenList_, s_] := 
          Table[{Table[
                Circle[coords[g[coeffList, machtenList, φ, n - 1]], 
                  coeffList[[n]]], {n, 1, Length[coeffList], 1}], 
              Table[{GrayLevel[1], 
                  Circle[coords[
                      g[coeffList, machtenList, φ - Pi/20, n - 1]], 
                    coeffList[[n]]]}, {n, 2, Length[coeffList], 1}]}, {
              φ, 0,  s, Pi/20}];

som := Apply[Plus, coeffList]
\(spiroAnimatie[coeffList_, machtenList_, s_, a_] := 
      Show[{Graphics[armen[coeffList, machtenList, s]], 
          Graphics[cirkels[coeffList, machtenList, s]], 
          Graphics[move[coeffList, machtenList, s, a]], 
          Graphics[Line[{{\(-som\), 0}, {som, 0}}]], 
          Graphics[Line[{{0, \(-som\)}, {0, som}}]]}, 
        AspectRatio -> Automatic	, 
        PlotRange -> {{\(-som\), som}, {\(-som\), som}}, Axes -> True]; \)

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .2};
machtenList:={1, -3, 7};

Do[spiroAnimatie[coeffList, machtenList, s, 0], {s, 0.01, 
          2 Pi + Pi/20, Pi/20}]

Bekijk eens de animatie voor 3 wielen (hierboven). Het programma in de gesloten cel hierboven (Opgelet: het programma is "zwaar" - je computer kan flippen!) laat toe om de beweging van een willekeurig aantal cirkels te observeren. In het begin liggen die cirkels als volgt:
de eerste cirkel met de straal (Subscript[r, 1]) heeft middelpunt in (0, 0)
de tweede cirkel met de straal (Subscript[r, 2]) heeft middelpunt in ((Subscript[r, 1]), 0) - op de eerste cirkel dus!
derde (als je zover wil gaan): in ((Subscript[r, 1]) + (Subscript[r, 2]), 0) - op de tweede cirkel,
enzovoort.
We observeren de kurve die ontstaat als traject van "het topje van de cirkelpyramide", of - exacter gezegd - van het punt ((Subscript[r, 1]) + (Subscript[r, 2]) +  ...  + (Subscript[r, n]), 0), waar n het totaal aantal bewegende cirkels is.

Je kan ook zelf experimenteren:
1. evalueer de gesloten cel hierboven - die cel bevat immers het programma voor de animatie
2. kies zelf een aantal cirkels (een natuurlijk getal n) die je wil zien bewegen. Vervang de "rode rijen" getallen in volgende cel door uw eigen getallen:
	a) n stralen (positieve getallen! - maar niet noodzakelijk gehele getallen) in
	coeffList:={r1,r2,...,rn};
	b) n snelheden (hier mogen de coëfficiënten zelfs negatief zijn - wat zoveel betekent als verandering van de zin. Neem alleen maar gehele getallen!) in 					machtenList:={v1,v2,...,vn};
	OPGELET! - de lijsten moeten evenveel elementen hebben! - elke cirkel moet zijn snelheid hebben!
3. evalueer de cel met de coëfficiënten.
4. als de evaluatie compleet is, kan je de output-cellen samenvouwen zodat alleen maar de bovenste cel zichtbaar is. Dubbelklik op die cel om de animatie te zien. Met behulp van de videobalk onderaan op het scherm kan je de animatie vertragen om het proces van het ontstaan van de spirograaf-lijn nog beter te kunnen volgen.

De lijn die je als resultaat (in het rood) gekregen hebt is een voorbeeld van een spirograaf-kurve.
De animatie hielp je zien HOE zo'n kurve ontstaat. Nu heb je daar een goed idee over. Als je verder wil oefenen en ontdekken welke kurven bij verschillende stralen en snelheden ontstaan, gebruik daarvoor beter het "spaarzamere programma" in de cel hieronder. Ook hier kan je je eigen rijen stralen en snelheden invoeren. Als resultaat krijg je de tekening van de cirkels die je gekozen hebt en de spirograaf-kurve voor die cirkels en de door jou gekozen snelheden. De beweging kan je hier niet zien, maar het programma werkt beduidend sneller. Dat laat je toe op een efficiënte manier de spirografen-wereld te verkennen. 
Vergeet niet de cel met het programma hieronder te evalueren!

Clear[machten, f, move, g, coords, cirkels, som, spiroMetCirkels, 
        veelterm, poly];

machten[machtenList_, z_] :=  z^machtenList;

f[coeffList_, machtenList_, φ_] := 
        If[Length[coeffList] == 1, 
          coeffList[[1]] E^(I φ machtenList[[1]]), 
          (coeffList .  machten[machtenList, z]) /. 
            z -> E^(I φ)];

move[coeffList_, machtenList_, a_] := 
        Table[{Hue[a], Point[coords[f[coeffList, machtenList, t]]]}, {t, 0,  
            2 Pi, 0.001}];

g[coeffList_, 0] := 0g[coeffList_, n_] := Apply[Plus, Take[coeffList, n]];

coords[z_] := {Re[z], Im[z]};

cirkels[coeffList_] := 
            Table[Circle[{g[coeffList, n - 1], 0}, coeffList[[n]]], {n, 
                1, Length[coeffList], 1}];

som := Apply[Plus, coeffList]
\(spiroMetCirkels[coeffList_, machtenList_, a_] := 
      Show[{Graphics[cirkels[coeffList]], 
          Graphics[move[coeffList, machtenList, a]]}, 
        AspectRatio -> Automatic, 
        PlotRange -> {{\(-som\), som}, {\(-som\), som}}, Axes -> True]; 


    veelterm[coeffList_, machtenList_, φ_] := 
      TraditionalForm[f[coeffList, machtenList, φ]]; 

    poly[coeffList_, machtenList_] := 
      If[Length[coeffList] == 1, 
        coeffList[\([1]\)]\ z^\((machtenList[\([1]\)])\), 
        \((coeffList . \ machten[machtenList, z])\)]; \)

Clear[coeffList, machtenList];

coeffList:={1,  .3};
machtenList:={1, 10};

spiroMetCirkels[coeffList, machtenList,  .15]

Snelheidscoëfficiënten 1 en 10  geven  9  gelijke lusjes als resultaat. Toeval?

Formules voor de tekening hierboven - nuttig voor de toekomst:

Clear[coeffList, machtenList];

coeffList:={1,  .3};
machtenList:={1, 10};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Bekijk nu het volgende! Lijkt dat meer op Brussels kant of op hersenen? Het is in ieder geval ook een spirograaflijn:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1,  .5,  .25,  .125};
machtenList:={1, 3, 9, 27, 81, 243};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven - ook nuttig voor de toekomst:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1,  .5,  .25,  .125};
machtenList:={1, 3, 9, 27, 81, 243};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

In het volgende voorbeeld draait de tweede cirkel met de klokwijzers (negatieve snelheid: "-3" in de "machtenList"), maar de eerste en de derde tegen de wijzers (positieve snelheden: "1" en "5" in de "machtenList"). 
Het resultaat bestaat uit 4 gelijke "segmenten". Zou er geen verband zijn met de keuze van de snelheidscoëfficiënten?
We maken een korte analyse - eerst onderzoeken we paarsgewijze verschillen van de snelheidscoëfficiënten in "machtenList":
1-(-3)=4
1-5=-4
-3-5=-8
en daarna vinden we hun grootste gemene deler: GGD[4,4,8]=4.
Verder merken we op dat alle coëfficiënten gelijk zijn aan 1 modulo 4 (geven rest 1 bij het delen door 4).
Waarom heeft dat verband met aantal gelijke segmenten waaruit de spirograaflijn bestaat? Het is niet evident om daar de uitleg voor te vinden. Je wordt echter van harte uitgenodig om dat te proberen. Als dat lukt: een dikke proficiat! Als niet lukt - maak je geen zorgen, dat is echt niet zo voor de hand liggend. Bekijk nog een aantal voorbeelden hieronder en probeer naar antwoord te zoeken. Als je ten einde raad bent, klik hierop om de uitleg te vinden.

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, -3, 5};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven - onthou voor straks (neen, je moet dat niet van buiten leren):

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, -3, 5};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Volgend voorbeeld - een kleine aanpassing van de vorige situatie - het minteken in de "machtenList:={1,-3,5}" wordt verplaatst. De nieuwe snelheidscoëfficiëntenlijst "machtenList" is nu {1,3,-5}. De kleine aanpassing heeft grote gevolgen! De nieuwe spirograaflijn heeft maar 2 gelijke segmenten. Waarom? - een kleine geheimzinnige analyse van de paarsgewijze verschillen van de snelheidscoëfficiënten geeft volgende resultaten:
1-3=-2
1-(-5)=6
3-(-5)=8
en de grootste gemene deler van die verschillen (GGD[2,6,8]) is nu 2! Alle coëfficiënten zijn gelijk aan 1 modulo 2 (geven rest 1 bij het delen door 2).
Bekijk eens het resultaat:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 3, -5};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 3, -5};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

In het volgende geval is de snelheid van de tweede cirkel 6 keer groter dan de snelheid van de eerste. Resultaat: 5 lusjes naar binnen.
Herken je onze robot? Zijn tweede arm is wel precies wat energieker geworden... En... het voorwerp dat van rechts naar links overgebracht moet worden is hopelijk geen kop koffie...
1-6=-5  (daarom 5 lusjes?...):

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={1, 6};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={1, 6};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

En nu: de snelheid van de tweede cirkel is 4 keer groter dan de snelheid van de eerste MAAR de richting verandert. Resultaat: ook 5 lusjes. Deze keer naar buiten.
1-(-4)=5.

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={1, -4};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={1, -4};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Probeer nu te voorspellen: welke tekeningen krijgen we door de volgende combinaties van snelheden (stralen in elk geval 1 en 0.5):
{1,4}, {1,5}, {1,7}, {1,8}
{1,-3}, {1,-5}, {1,-6}, {1,-7}. Je kan in elk van die gevallen de juistheid van je vermoedens controleren door een tekening te laten maken door "Mathematica". coeffList blijft dus {1,.5}, en als machtenList gebruik je om beurt de gegevens van de opgave.

***********************************************************************************

En nu een beetje gek doen: 10 cirkels en allerraarste snelheden! Pre-Copernicus planeet orbitebaan?:

Clear[coeffList, machtenList];

coeffList:={10, 8, 6, 3, 2, 1, 5, 2, 1,  .1};
machtenList:={1, -2, 3, -25, 7, -11, 13, -55, 19, -23};

spiroMetCirkels[coeffList, machtenList,  .3]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={10, 8, 6, 3, 2, 1, 5, 2, 1,  .1};
machtenList:={1, -2, 3, -25, 7, -11, 13, -55, 19, -23};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Een vis?:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1,  .5,  .25};
machtenList:={2, 5, 7, -7, 15};

spiroMetCirkels[coeffList, machtenList,  .6]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1,  .5,  .25};
machtenList:={2, 5, 7, -7, 15};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Banen van planeten (ná Copernicus!) ofwel een wollen draad in een (regelmatige) wanorde:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1, 4};
machtenList:={3, 15, -7, -19};

spiroMetCirkels[coeffList, machtenList,  .6]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={3, 2, 1, 4};
machtenList:={3, 15, -7, -19};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Wat valt je op in verband met de ligging van de kurven ten opzichte van de assen?
Wat voor invloed op die ligging heeft het even/oneven-zijn van de snelheidscoëfficiënten?
Gebruik ook de volgende voorbeelden als hulp. Je kan je conclusies vergelijken met het antwoord aan het einde van de notebook. Klik hierop.

***********************************************************************************

alle snelheden oneven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 3, 3};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 3, 3};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

alle snelheden oneven; een ervan negatief:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, -3, 3};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, -3, 3};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

1 oneven, 2 even:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 4, 2};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 4, 2};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

2 oneven, 2 even:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3,  .1};
machtenList:={1, 4, 3, 6};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3,  .1};
machtenList:={1, 4, 3, 6};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

2 oneven, 1 even:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 4, 1};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={1, 4, 1};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

alle snelheden even:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={8, 14, 2};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .3};
machtenList:={8, 14, 2};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Kan men een stuk rechte lijn als resultaat van twee draaibewegingen krijgen? Indien wel - hoe groot moeten de cirkels zijn ten opzichte van mekaar en hoe snel en in welke richtingen moeten ze draaien?
Bekijk eens het voorbeeld hieronder en probeer de uitleg te vinden: WAAROM geeft die combinatie van coëfficiënten een stuk rechte lijn als resultaat? Gebruik gerust de coëfficiënten hieronder voor het animatie-programma - dat gaat je helpen verstaan, op welke manier de rechte lijn ontstaat door die beweging. En de "wiskundige" uitleg? Bestaat het ook? Natuurlijk. Die vindt je op het einde van de notebook. Klik hier.

Clear[coeffList, machtenList];

coeffList:={1, 1};
machtenList:={1, -1};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1, 1};
machtenList:={1, -1};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Volgend voorbeeld: wat krijgen wij bij gelijke snelheden van beide cirkels?:

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={2, 2};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven:

Clear[coeffList, machtenList];

coeffList:={1,  .5};
machtenList:={2, 2};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

1 draaiende (in dit geval 5 keer rond zijn middelpunt) cirkel geeft cirkel als beeld...
Terug naar het hoofdstuk over de Hoofdstelling van de Algebra - klik hierop.

Clear[coeffList, machtenList];

coeffList:={1};
machtenList:={5};

spiroMetCirkels[coeffList, machtenList,  .9]

Formules voor de tekening hierboven - zeer nuttig voor de toekomst:

Clear[coeffList, machtenList];

coeffList:={1};
machtenList:={5};

veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Kunnen alle kurven verkregen worden als spirograaflijnen? Neen - je hebt al enkele noodzakelijke voorwaarden daarvoor gevonden. Kan er een voldoende voorwaarde geformuleerd worden? - daarover kan je in de volgende notebook lezen.

Veeltermen

Veralgemening van de vorige hoofdstukken. Een spirograaf - WAT is dat eigenlijk??? [ontrafelen van het geheim]

Terug naar de antwoorden op vraagstukken - "Waarom rechte lijn???" - klik hier.

Een spirograafkurve is het resultaat van een samenstelling van cirkelbewegingen.
Wat heeft dat te maken met complexe getallen???

Bekijk eens goed de animatie van spirograaf. Denk daarbij aan het optellen van complexe getallen en aan de machtsverheffing.  Klik hierop om op de juiste plaats van de notebook te geraken. 

Voor parameters:
stralen:  coeffList:={r1,r2,...,rn}
snelheden:  machtenList:={c1,c2,...,cn}
voeren we een aantal operaties uit om de spirograaf-kurve te bekomen.

Analyseer aandachtig de tekening hieronder. Die tekening toont de drie stappen die we "achteruit" moeten doen om van de spirograaf-kurve tot  in de complexe getallen te geraken.
Volg de beschrijving van die stappen en wijs hun resultaten aan op de tekening:

1. [nodig: DEFINITIE VAN SOM VAN COMPLEXE GETALLEN - PARALELLOGRAMREGEL!]: spirograaflijn is het resultaat van de draaibeweging van n aan mekaar gekoppelde cirkels met stralen  (Subscript[r, 1]),  (Subscript[r, 2]),  ... ,  (Subscript[r, n])  en snelheden  (Subscript[c, 1]),  (Subscript[c, 2]),  ... ,  (Subscript[c, n]). Voor elke parameter  φ   van   [0,2π]  is het punt  SpirograafParam[φ]   de som van "de dikke stralen" op de tekening - complexe getallen  (Subscript[r, 1]) (e^(i φ (Subscript[c, 1]))), (Subscript[r, 2]) (e^(i φ (Subscript[c, 2]))), ..., (Subscript[r, n]) (e^(i φ (Subscript[c, n]))).

SpirograafParam[φ] = (Subscript[r, 1]) (e^(i φ (Subscript[c, 1])))+(Subscript[r, 2])(e^(i φ (Subscript[c, 2])))+(Subscript[r, 3]) (e^(i φ (Subscript[c, 3]))) +  ...  + 
          (Subscript[r, n]) (e^(i φ (Subscript[c, n]))),
voor   φ   van   [0,2π]

2. [nodig: DELEN DOOR EEN SKALAIR!]: elk van die getallen ontstaat door de getallen  (e^(i φ (Subscript[c, 1]))), (e^(i φ (Subscript[c, 2]))), ..., (e^(i φ (Subscript[c, n])))  van de eenheidscirkel (die hebben allemaal modulus 1) te vermenigvuldigen met (Subscript[r, 1]),  (Subscript[r, 2]),   ... ,  (Subscript[r, n])  respectievelijk. Zie de bundel stralen (op de tekening hieronder) gevestigd in (0,0) - op de tekening zijn de stralen van dezelfde kleur parallel (en hoeken gemarkeerd met bogen van dezelfde kleur zijn gelijk).

3. [nodig: MACHTSVERHEFFING!]: de getallen  (e^(i φ (Subscript[c, 1]))), (e^(i φ (Subscript[c, 2]))), ..., (e^(i φ (Subscript[c, n])))  ontstaan door het getal  z = (e^(i φ ))  te verheffen tot de macht (Subscript[c, 1]),  (Subscript[c, 2]),   ... ,  (Subscript[c, n])  respectievelijk. Een getal met modulus 1 tot de k-de macht verheffen is het argument vermenigvuldigen met k  (k-1 keer roteren rond de oorsprong met de hoek φ).

Wat betekent dat? - dat, wat je eigenlijk al lang vermoedt:

spirograaf is het beeld van de eenheidscirkel onder de werking van de volgende functie S (een VEELTERM!!!):
S[z] = (Subscript[r, 1]) (Subscript[(z^c), 1])+(Subscript[r, 2])(Subscript[(z^c), 2])+(Subscript[r, 3]) (Subscript[(z^c), 3]) +  ...  + (Subscript[r, n])  (Subscript[(z^c), n]),
voor  z  van de eenheidscirkel, dus z = (e^(i φ))

Nu weet je wat was de betekenis van de formules onder elke spirograaf ("nuttig voor de toekomst" - en het is NU). Tot nu toe leek het misschien ietwat geheimzinnig...

In de gesloten cel hieronder bevindt zich het programma die het verband tussen spirografen en complexe getallen helpt in te zien. Als je wil, kan je het bekijken. Dat programma is ook, zoals de animatie van de spirograaf, gemaakt voor een willekeurig aantal draaiende cirkels. Bij al te veel cirkels verliest het beeld zijn overzichtelijkheid.
Experimenteer daar gerust zelf mee - je kan hieronder rode reeksen getallen door je eigen straallengtes (positieve getallen!) en snelheden (gehele getallen!) vervangen. De reeksen moeten even lang zijn. Evalueer de cel hieronder en de cel met de nieuwe gegevens.

\(Clear[coords, som, machten, f, move, h, armen, stippelijnen, bogen, 
      bogenCentrum, stralen, teksten, verbandSpiroComplex, veelterm, poly]; 

    
coords[z_] := {Re[z], Im[z]}; 

som := Apply[Plus, coeffList]; 


    machten[machtenList_, z_] := \ z^machtenList; 


    f[coeffList_, machtenList_, φ_] := 
      If[Length[coeffList] == 1, 
        coeffList[\([1]\)]\ E^\((I\ φ\ machtenList[\([1]\)])\), 
        \((coeffList . \ machten[machtenList, z])\) /. 
          z -> E^\((I\ φ)\)]; 


    move[coeffList_, machtenList_, a_] := 
      Table[{Hue[a], PointSize[0.001], 
          Point[coords[f[coeffList, machtenList, t]]]}, {t, 0, \ 2\ Pi, 
          0.001}]; 

h[coeffList_, machtenList_, φ_, 0] := 0\)h[coeffList_, machtenList_, φ_, n_] := 
          f[Take[coeffList, n], Take[machtenList, n], φ];

armen[coeffList_, machtenList_, φ_] := 
          Table[{Hue[3 n/10], Thickness[0.008], 
              Line[{coords[h[coeffList, machtenList, φ, n]], 
                  coords[h[coeffList, machtenList, φ, n + 1]]}]}, {
              n, 0, Length[coeffList] - 1, 1}];

stippelijnen[coeffList_, machtenList_, φ_] := 
          Table[{Dashing[{0.02, 0.02}], 
              Line[{{-som, 
                    Im[h[coeffList, machtenList, φ, n]]}, {som, 
                    Im[h[coeffList, machtenList, φ, n]]}}]}, {n, 1, 
              Length[coeffList] - 1, 1}];

bogen[coeffList_, machtenList_, φ_] := 
          Table[{Hue[3 n/10], Thickness[0.006], 
              If[machtenList[[n + 1]] > 0, 
                Circle[coords[
                    h[coeffList, machtenList, φ, n]],  .3, {0, 
                    machtenList[[n + 1]] φ}], 
                Circle[coords[
                    h[coeffList, machtenList, φ, n]],  .3, {
                    machtenList[[n + 1]] φ, 0}]]}, {n, 0, 
              Length[coeffList] - 1, 1}];

bogenCentrum[machtenList_, φ_] := 
          Table[{Hue[3 n/10], Thickness[0.003], 
              If[machtenList[[n + 1]] > 0, 
                Circle[{0, 0},  .4 + n/10, {0, 
                    machtenList[[n + 1]] φ}], 
                Circle[{0, 0},  .4 + n/10, {
                    machtenList[[n + 1]] φ, 0}]]}, {n, 0, 
              Length[coeffList] - 1, 1}];

stralen[machtenList_, φ_] := 
          Table[{Hue[3 n/10], Thickness[0.005], 
              Line[{{0, 0}, 
                  coords[E^
                      (I φ machtenList[[n + 1]])]}]}, {n, 
              0, Length[coeffList] - 1, 1}];

\(teksten[coeffList_, machtenList_, φ_] := 
          	{Text[FontForm[
                "φ", {"Courier-Bold", 24}], { .8\ 
                  Cos[φ/2],  .8\ Sin[φ/2]}], 
			
            Text[FontForm[
                \*""z=(E^I)φ"", {"Courier-Bold", 16}], {Cos[φ] +  .5, Sin[φ]}], 

            Text[FontForm["S[z]", {"Courier-Bold", 16}], 
              coords[f[coeffList, machtenList, φ]] + {0,  .2}]}
            \)
\(verbandSpiroComplex[coeffList_, machtenList_, a_, φ_] := 
      Show[{Graphics[Circle[{0, 0}, 1]], 
          Graphics[stralen[machtenList, φ]], 
          Graphics[armen[coeffList, machtenList, φ]], 
          Graphics[stippelijnen[coeffList, machtenList, φ]], 
          Graphics[bogen[coeffList, machtenList, φ]], 
          Graphics[bogenCentrum[machtenList, φ]], 
          Graphics[{Thickness[0.006], 
              Line[{{0, 0}, coords[E^\((I\ φ)\)]}]}], 
          Graphics[{PointSize[0.01], Point[coords[E^\((I\ φ)\)]]}], 
          
			Graphics[{PointSize[0.01], 
              Point[coords[f[coeffList, machtenList, φ]]]}], 

          			Graphics[move[coeffList, machtenList, a]], 
          Graphics[teksten[coeffList, machtenList, φ]]}, 
        AspectRatio -> Automatic, Axes -> True]; 


    veelterm[coeffList_, machtenList_, φ_] := 
      TraditionalForm[f[coeffList, machtenList, φ]]; 

    poly[coeffList_, machtenList_] := 
      If[Length[coeffList] == 1, 
        coeffList[\([1]\)]\ z^\((machtenList[\([1]\)])\), 
        \((coeffList . \ machten[machtenList, z])\)]; \)

Clear[coeffList, machtenList];

coeffList:={1.8, 1.5,  .7};
machtenList:={2, 5, 9};

verbandSpiroComplex[coeffList, machtenList,  .9, Pi/13]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Nog een voorbeeld - een zeer leuke kurve...

Clear[coeffList, machtenList];

coeffList:={1,  .5,  .2};
machtenList:={2, 7, 15};

verbandSpiroComplex[coeffList, machtenList,  .4, Pi/13]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Volgend voorbeeld - een bloem...
Gebruikelijke analyse van de snelheidscoëfficiënten:
paarsgewijze verschillen (in dit voorbeeld maar 1 paar): 3-15=-12.
Alle coëfficiënten zijn gelijk aan 3 modulo 12 (geven rest 3 bij het delen door 12). Daarom 4 gelijke segmenten? (12/3):

Clear[coeffList, machtenList];

coeffList:={3,  .5};
machtenList:={3, 15};

verbandSpiroComplex[coeffList, machtenList,  .6, Pi/20]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

***********************************************************************************

Negatieve coëfficiënten - veralgemening van begrip "veelterm".

Clear[coeffList, machtenList];

coeffList:={3, 2, 1};
machtenList:={3, 15, -7};

verbandSpiroComplex[coeffList, machtenList,  .9, 2 Pi/13]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Een opmerking:
3  (z^3) + 2  (z^15) + (z^(-7))=(z^(-7))+2  (z^15)+3  (z^3)  (optelling is commutatief). De spirograaflijn zou dus niet mogen veranderen als we de volgorde van draaiende cirkels veranderen! Even controleren:

Clear[coeffList, machtenList];

coeffList:={1, 2, 3};
machtenList:={-7, 15, 3};

verbandSpiroComplex[coeffList, machtenList,  .9, 2 Pi/13]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Opgave:
Op hoeveel mogelijke manieren kunnen wij de spirograaflijn verkrijgen die ontstaat als resultaat van draaibeweging van  n  cirkels met stralen  (Subscript[r, 1]),  (Subscript[r, 2]),  ... , (Subscript[r, n])  en snelheden (Subscript[c, 1]),  (Subscript[c, 2]),  ... , (Subscript[c, n])  respectievelijk (voorwaarde:  (Subscript[r, i]) ≠ (Subscript[r, j])   voor  i≠j   en  (Subscript[c, i]) ≠ (Subscript[c, j])  voor   i≠j)?  [Om je antwoord te controleren, klik de cel open]

Antwoord:
n! - evenveel als permutaties van  n  verschillende voorwerpen. We kunnen de cirkels in willekeurige volgorde zetten!

Voorbeelden  (z^4) + 2 z + 1  en  (z^5) + z  - nulpunten en injectiviteit

Bekijk eens een voorbeeld: veelterm  P[z] = (z^4) + 2 z + 1.  Hier nemen we voor de eerste keer een veelterm wiens vrije term is verschillend van nul. Dat betekent dat het beeld van de eenheidscirkel is een spirograaflijn voor de cirkels met stralen 1 en 2 en snelheden 4 en 1 respectievelijk, opgeschoven over een vector [1,0]. Op de linker coordinatenstelsel zie je de eenheidscirkel en op de rechter - zijn beeld onder de werking van die veelterm. Argumenten en functiewaarden hebben dezelfde kleur.

\(<< Graphics`ArgColors`
\)\(Clear[kleuren, punten, coords, complex]
\)\(coords[z_] := {Re[z], Im[z]}
\)\(complex[{a_, b_}] := a + b\ I
\)\(kleuren[set_List] := Table[ArgColor[set[\([j]\)]], {j, Length[set]}]; 

    
punten[set_List] := 
      Table[{PointSize[0.02], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; 


    puntenKlein[set_List] := 
      Table[{PointSize[0.01], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; \)

\(Clear[f]
\)\(f[z_] := z^4 + 2\ z + 1
\)\(setCircle[x0_, y0_, r_] := 
      Map[complex, 
        Table[{x0 + r\ Cos[φ], y0 + r\ Sin[φ]}, {
            φ, 0, 2\ Pi,  .01}]]
\)Show[
      GraphicsArray[{
          Graphics[
            Transpose[{kleuren[setCircle[0, 0, 1]], 
                puntenKlein[setCircle[0, 0, 1]]}], AspectRatio -> Automatic, 
            PlotRange -> {{-5, 5}, {-5, 5}}, Axes -> True], 
          Graphics[
            Transpose[{kleuren[setCircle[0, 0, 1]], 
                puntenKlein[f[setCircle[0, 0, 1]]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-5, 5}, {-5, 5}}, Axes -> True]}]]

Wat zijn de nulpunten van die veelterm? We laten dat uitrekenen door "Mathematica":

N[Solve[z^4 + 2 z + 1 == 0, z]]

Vier complexe nulpunten: twee "zuiver" reële en twee "echt" complexe.

Nu gaan wij de absolute waarden (de moduli) van de nulpunten uitrekenen. De absolute waarde is afstand van de oorsprong. Als we ze kennen, gaan wij weten, op welke cirkels met het middelpunt in de oorsprong de nulpunten van de veelterm liggen. Dan kunnen we de beelden van die cirkels apart bekijken (zie tekeningen hieronder):

\(Clear[nulpt, f, pts]; 

f[z_] := z^4 + 2\ z + 1\ ; 


    nulpt := Solve[f[z] == 0, z]; 


    pts = Re[z] + I\ Im[z] /. nulpt; 

N[Abs[pts]]\)

Absolute waarden van twee nulpunten zijn gelijk. Waarom? Klik hierop om het antwoord te vinden.

\(Clear[f, cirkelNul]; 

f[z_] := z^4 + 2\ z + 1\ ; 


    coords[z_] := {Re[z], Im[z]}; 


    cirkelNul[r_] := 
      Show[GraphicsArray[{
            Graphics[
              Table[{Hue[r], PointSize[0.01], 
                  Point[coords[r\ E^\((I\ t)\)]]}, {
                  t, 0, 2\ Pi,  .01}], AspectRatio -> Automatic, 
              PlotRange -> {{\(-1.5\), 1.5}, {\(-1.5\), 1.5}}, Axes -> True], 
            Graphics[
              Table[{Hue[r], PointSize[0.01], 
                  Point[coords[
                      f[r\ E^\((I\ t)\)]]]}, {t, 0, 
                  2\ Pi,  .01}], AspectRatio -> Automatic, 
              PlotRange -> {{\(-5\), 7.5}, {\(-6\), 6}}, Axes -> True]}]]

    \)Do[cirkelNul[1]]Do[cirkelNul[0.543689]]Do[cirkelNul[1.3562]]

De beelden van de cirkels passeren inderdaad door de oorsprong! Zoals verwacht.

We krijgen dus 3 beelden van 3 verschillende cirkels onder de veelterm. Beelden van 2 eerste cirkels passeren maar 1 keer door de oorsprong. Waarom? - Op de eerste 2 cirkels liggen de twee reële nulpunten van de veelterm. 1 nulpunt op elke cirkel - dus het beeld van elke cirkel kan enkel maar 1 keer door het nul gaan. Op de derde, groene cirkel liggen twee complexe nulpunten van de veelterm. Ze zijn mekaars toegevoegden. Merk op dat het beeld van de groene cirkel inderdaad 2 keer door de oorsprong passeert. En dat de beide bogen die het startpunt van de spirograaf met de oorsprong verenigen, evenlang zijn. In dit geval ligt het vertrekpunt van de spirograaf op de reële as, een beetje voorbij punt (7,0). De x-coordinaat van dit punt kan je uitrekenen als f(1.3562), waar f(z)=(z^4) + 2  z + 1:

\(Clear[f]; 
f[z_] := z^4 + 2\ z + 1; 

N[f[1.3562]]\)

Merk ook op dat de veelterm injectief is op de kleinste van de drie cirkels. Dat wil zeggen, de veelterm neemt op de kleinste (de donkerblauwe) cirkel geen twee keer dezelfde waarde aan. Voor twee grootste cirkels is dat niet meer waar. Op de rode cirkel bereikt de veelterm drie van de waarden twee keer (de kurve snijdt zichzelf in 3 verschillende punten!). Op de groene - zelfs 9 waarden! - er zijn immers 9 snijpunten. Zou dat niks te maken hebben met de grootte van de cirkel?

***********************************************************************************

Een ander voorbeeld: vergelijking  (z^5) + z = 0  heeft als oplossingen: nul en alle 4de machtswortels van -1. Vier van de vijf wortels van de veelterm  V (z) = (z^5) + z  liggen dus op de eenheidscirkel! Bekijk eens het beeld van de eenheidscirkel onder werking van de veelterm:

\(<< Graphics`ArgColors`
\)\(Clear[kleuren, punten, coords, complex]
\)\(coords[z_] := {Re[z], Im[z]}
\)\(complex[{a_, b_}] := a + b\ I
\)\(kleuren[set_List] := Table[ArgColor[set[\([j]\)]], {j, Length[set]}]; 

    
punten[set_List] := 
      Table[{PointSize[0.02], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; 


    puntenKlein[set_List] := 
      Table[{PointSize[0.01], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; \)

\(Clear[f]
\)\(f[z_] := z^5 + z
\)\(setCircle[x0_, y0_, r_] := 
      Map[complex, 
        Table[{x0 + r\ Cos[φ], y0 + r\ Sin[φ]}, {
            φ, 0, 2\ Pi,  .01}]]
\)Show[
      GraphicsArray[{
          Graphics[
            Transpose[{kleuren[setCircle[0, 0, 1]], 
                puntenKlein[setCircle[0, 0, 1]]}], AspectRatio -> Automatic, 
            PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, Axes -> True], 
          Graphics[
            Transpose[{kleuren[setCircle[0, 0, 1]], 
                puntenKlein[f[setCircle[0, 0, 1]]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, Axes -> True]}]]

De kurve - het beeld van de eenheidscirkel - passeert inderdaad 4 keer door de oorsprong. Bovendien snijdt de kurve zichzelf in 8 andere punten!

Misschien een beetje kleinere cirkel nemen? r=0.9. Wat we over het beeld van de cirkel met alle zekerheid kunnen zeggen, is dat hij niet door de oorsprong gaat passeren. Alle nulpunten (= punten, wiens beelden zijn NUL) liggen immers op de eenheidscirkel of in de oorsprong zelf:

\(Clear[f]
\)\(f[z_] := z^5 + z
\)\(setCircle[x0_, y0_, r_] := 
      Map[complex, 
        Table[{x0 + r\ Cos[φ], y0 + r\ Sin[φ]}, {
            φ, 0, 2\ Pi,  .01}]]
\)Show[
      GraphicsArray[{
          Graphics[
            Transpose[{kleuren[setCircle[0, 0,  .9]], 
                puntenKlein[setCircle[0, 0,  .9]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-1.6, 1.6}, {-1.6, 1.6}}, Axes -> True], 
          Graphics[
            Transpose[{kleuren[setCircle[0, 0,  .9]], 
                puntenKlein[f[setCircle[0, 0,  .9]]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-1.6, 1.6}, {-1.6, 1.6}}, Axes -> True]}]]

Die kurve snijdt zichzelf nog maar 4 keer.

Misschien nog een kleinere cirkel? Laat ons r=0.5 nemen:

\(Clear[f]
\)\(f[z_] := z^5 + z
\)\(setCircle[x0_, y0_, r_] := 
      Map[complex, 
        Table[{x0 + r\ Cos[φ], y0 + r\ Sin[φ]}, {
            φ, 0, 2\ Pi,  .01}]]
\)Show[
      GraphicsArray[{
          Graphics[
            Transpose[{kleuren[setCircle[0, 0,  .5]], 
                puntenKlein[setCircle[0, 0,  .5]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-0.6, 0.6}, {-0.6, 0.6}}, Axes -> True], 
          Graphics[
            Transpose[{kleuren[setCircle[0, 0,  .5]], 
                puntenKlein[f[setCircle[0, 0,  .5]]]}], 
            AspectRatio -> Automatic, 
            PlotRange -> {{-0.6, 0.6}, {-0.6, 0.6}}, Axes -> True]}]]

Op die cirkel is de veelterm injectief! - geen enkele waarde wordt meer dan 1 keer bereikt!

Een familie veeltermen

Nu gaan wij een familie veeltermen   (Subscript[P, a])[z] = (z^5) + a (z^2) + 0.1 z  analyseren voor parameters  a  van  0.05  tot  0.95  om de  0.05  (hoeveel veeltermen zijn dat dan?)

Wat zijn de nulpunten van die veeltermen?

Table[Solve[z^5 + a z^2 + 0.1 z == 0, z], {a, 0.05, 0.95, 0.05}]

Je ziet dat elke veelterm 5 nulpunten heeft. Eerste 6 veeltermen hebben alleen maar 1 reëel nulpunt en 4 complexe. De rest heeft 3 reële en 2 complexe nulpunten (elk).

Op de volgende tekening zie je de nulpunten van elke veelterm van de familie:
- in het rood voor de veelterm met de parameter 0.05
- ...
- in het blauw voor a=0.95
volgens de "legende" hieronder. De legende toont welke kleur bij welke parameter hoort.

\(kleurenLegende := 
      Table[Graphics[{Hue[a/2], PointSize[0.03], Point[{a, 0}]}, 
          AspectRatio -> 1/3, Axes -> {True, False}, 
          Ticks -> {0.05\ Range[19], None}], {a,  .05,  .95,  .05}]; 


    Show[kleurenLegende]\)

Het blauwe punt in de oorsprong is een nulpunt van alle veeltermen van de familie omdat  (z^5) + a (z^2) + 0.1 z = z ((z^4) + a z + 0.1).

\(Clear[nulpt, f, pts]; 

f[z_] := z\^5 + a\ z\^2 + 0.1\ z\ ; 


    nulpt := Solve[f[z] == 0, z]; 

pts = {Re[z], Im[z]} /. nulpt; 


    samenKleur := 
      Table[Graphics[{
            Circle[{0, 0}, 1], {Hue[a/2], PointSize[0.02], Point/@pts}}, 
          AspectRatio -> Automatic, Axes -> Automatic], {
          a,  .05,  .95,  .05}]; 

Show[samenKleur]\)Show[kleurenLegende]

Elke veelterm van de familie heeft 5 nulpunten: 1 "blauwe" en 4 in de "eigen kleur" (zie tekening hierboven). Alle nulpunten van al de veeltermen liggen binnen de eenheidscirkel ofwel op zijn rand (of net erbuiten).
Enkele vragen voor u:
1. Welke veeltermen (dwz voor welke parameters  a ) hebben 3 reële nulpunten en welke alleen maar 1 (nul dus)? Je kan dat aflezen van de tekening hierboven (met behulp van de legende). Controleer dan je conclusie met de tabel met de oplossingen boven beide tekeningen.
2. Leg uit waarom de verzameling van de nulpunten een symmetrieas heeft (welke rechte is dat?). Om je antwoord te controleren, surf naar het einde van de notebook (klik hier).

In de tabel hieronder zie je de spirografen die horen bij de familie veeltermen. Elk in de eigen kleur van "zijn" veelterm - volgens de legende. De volgorde is van boven naar beneden volgens de kolommen (en dan van links naar rechts, maar dat had je wel al gedacht):

Clear[g, spirograaf];

spirograaf[g_, a_, φ_, opts___]:=
	ParametricPlot[{Re[g], Im[g]},{φ, -π,  π},
		opts,
		PlotRange -> All,AspectRatio -> Automatic,Frame -> True,Axes -> False,FrameTicks -> None,PlotStyle -> {Hue[a/2], Thickness[ .01]},PlotPoints -> 250];

g[a_, k_, φ_] := 
        0.1 E^(I φ) + 
          (a + k 0.2) E^(I 2 φ) + 
          E^(I 5 φ);
		
Show[GraphicsArray[
          Table[Graphics[
              spirograaf[g[a, k, φ], a + 0.2 k, φ, 
                DisplayFunction -> Identity]], {a, 0.05, 0.2, 0.05}, {k, 0, 
              4, 1}]]]

Show[kleurenLegende]

En een animatie - die alle spirografen na mekaar toont.

\(Clear[h]; 


    h[a_, φ_] := 
      0.1\ E^\((I\ φ)\) + a\ E^\((I\ 2\ φ)\) + 
        E^\((I\ 5\ φ)\)
		\)Do[
      spirograaf[h[a, φ], a, φ], {a, 0.05, 0.95, 0.05}];

Show[kleurenLegende]

Nog eens animatie omtrent de "familie-spirografen", maar deze keer in een andere context: veelterm als functie en spirograaf als beeld van de eenheidscirkel. De betekenis van de kleuren is hier anders dan in de vorige animatie. Hier duidt men de argumenten van de functie en hun beelden met dezelfde kleur aan.
Doe alle cellen van de output open en tel voor elke  a, hoeveel keer de spirograaf-kurve rond de oorsprong gedraaid is!

\(<< Graphics`ArgColors`
\)\(Clear[kleuren, punten, coords, complex]
\)\(coords[z_] := {Re[z], Im[z]}
\)\(complex[{a_, b_}] := a + b\ I
\)\(kleuren[set_List] := Table[ArgColor[set[\([j]\)]], {j, Length[set]}]; 

    
punten[set_List] := 
      Table[{PointSize[0.02], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; 


    puntenKlein[set_List] := 
      Table[{PointSize[0.01], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; \)

\(Clear[f]
\)\(f[z_, a_] := z^5 + a\ z^2 + 0.1\ z
\)\(setCircle[x0_, y0_, r_] := 
      Map[complex, 
        Table[{x0 + r\ Cos[φ], y0 + r\ Sin[φ]}, {
            φ, 0, 2\ Pi,  .01}]]
\)Do[Show[
        GraphicsArray[{
            Graphics[
              Transpose[{kleuren[setCircle[0, 0, 1]], 
                  puntenKlein[setCircle[0, 0, 1]]}], 
              AspectRatio -> Automatic, 
              PlotRange -> {{-2, 2}, {-2, 2}}, Axes -> True], 
            Graphics[
              Transpose[{kleuren[setCircle[0, 0, 1]], 
                  puntenKlein[f[setCircle[0, 0, 1], a]]}], 
              AspectRatio -> Automatic, 
              PlotRange -> {{-2, 2}, {-2, 2}}, Axes -> True]}]], {a, 
        0.05, 0.95, 0.05}]

Elke spirograaf-kurve (behalve de laatste) draait 5 keer rond de oorsprong.
De laatste kurve lijkt (2 keer zelfs!) door de oorsprong te passeren. Zouden de nulpunten van de laatste veelterm op de eenheidscirkel liggen? Een van de nulpunten is -0.945106 - ligt dus net binnen de disk, maar inderdaad niet zo ver van zijn rand. Misschien de twee complexe nulpunten:

Abs[0.525249 - 0.85326 I]

Ook "bijna" op de eenheidscirkel - deze keer net buiten de rand. En de spirograaflijn draait maar 3  (=5-2)  keer rond de oorsprong. Meer daarover in het volgende hoofdstuk.

De Hoofdstelling van de Algebra

Iedere veelterm (polynoom) in  ℂ[X]  (verzameling van alle polynomen met complexe coëfficiënten) met graad  n>0  heeft minstens één wortel in  ℂ.

Een animatie

In het vorige hoofdstuk onderzochten we de werking van een familie veeltermen op de eenheidscirkel. De cirkel was vast en de veeltermen veranderden. Nu gaan we iets anders doen: de werking van 1 bepaalde veelterm op verschillende cirkels bekijken. We gaan   V (z) = (z^5) + (z^3) + 2 z + 2  gebruiken (die geeft mooie beelden). Hoe verandert de spirograaflijn met vergroten van de straal van het "domein". Bekijk eens de animatie voor de spirograaflijnen (herken je ze? - dezelfde lijnen heb je reeds gezien op de kaft van de notebook):

\(Clear[f]; 

f[z_] := z^5 + z^3 + \ 2\ z + 2; 


    coords[z_] := {Re[z], Im[z]}; 


    Do[Show[GraphicsArray[{
            Graphics[
              Table[{Hue[r], PointSize[0.007], 
                  Point[coords[r\ E^\((I\ t)\)]]}, {
                  t, 0, 2\ Pi,  .01}], AspectRatio -> Automatic, 
              PlotRange -> {{\(-1.5\), 1.5}, {\(-1.5\), 1.5}}, Axes -> True], 
            Graphics[
              Table[{Hue[r], PointSize[0.009], 
                  Point[coords[
                      f[r\ E^\((I\ t)\)]]]}, {t, 0, 
                  2\ Pi,  .01}], AspectRatio -> Automatic, 
              PlotRange -> {{\(-9\), 13}, {\(-9\), 9}}, Axes -> True]}]], {
        r,  .5, 1.4,  .1}]\)

Hoe groter de straal van de cirkel, wiens beeld we onderzoeken, hoe meer keer de spirograaflijn rond de oorsprong draait.

Hoe elk nulpunt voor een extra lusje rond de oorsprong zorgt

Nu gaan we een van de veeltermen van de familie (voor parameter a=0.75) van het vorige hoofdstuk analyseren en zijn spirograaflijnen voor verschillende cirkels onderzoeken. We gaan proberen zoeken naar het verband tussen aantal nulpunten van de veelterm binnen de cirkel en aantal keer draaien van de spirograaflijn voor die cirkel rond de oorsprong.

Voor dat doel vinden we eerst alle nulpunten van die veelterm en hun absolute waarden:

\(Clear[nulpt, f, pts]; 

f[z_] := z^5 + 0.75\ z^2 + 0.1\ z
\)\(nulpt := Solve[f[z] == 0, z]; 


    pts = Re[z] + I\ Im[z] /. nulpt; 

pts\)N[Abs[pts]]

De absolute waarden van de nulpunten, in volgorde, zijn dus:
0,  0.13376,  0.858878,  0.932977  en  0.932977.

Nu kunnen we verschillende spirograaflijnen bekijken - voor de volgende cirkels met het middelpunt in (0,0):
* cirkel die alleen maar het nulpunt 0 bevat,
* cirkel met de straal 0.13376 - waarop de "volgende" nulpunt ligt,
* cirkel met de straal tussen 0.13376 en 0.858878 - met twee nulpunten binnen,
enzovoort...
Alle nulpunten worden ook getoond op de tekening. Zij hebben verschillende kleuren. Er is geen logisch verband tussen de kleuren van de nulpunten en de kleuren van de cirkels.
Dat experimentje gaat ons veel leren over het "gedrag" van complexe veeltermen.

\(Clear[f, cirkelNul, nulpunten]; 

f[z_] := z^5 + 0.75\ z^2 + 0.1\ z; 
    

coords[z_] := {Re[z], Im[z]}; 


    nulpunten := 
      Table[{Hue[i/5], PointSize[0.03], Point[coords[pts[\([i]\)]]]}, {i, 1, 
          5}]
\)cirkelNul[r_] := 
      Show[GraphicsArray[{
            Graphics[{
                Table[{Hue[r], PointSize[0.01], 
                    Point[coords[
                        r E^(I t)]]}, {t, 0, 
                    2 Pi,  .01}], nulpunten}, AspectRatio -> Automatic, 
              PlotRange -> {{-r -  .001, r +  .001}, {-r -  .001, 
                    r +  .001}}, Axes -> True], 
            Graphics[
              Table[{Hue[r], PointSize[0.01], 
                  Point[coords[
                      f[r E^(I t)]]]}, {t, 0, 
                  2 Pi,  .01}], AspectRatio -> Automatic, 
              PlotRange -> {{-f[r] -  .001, f[r] +  .001}, {
                    -f[r] -  .001, f[r] +  .001}}, Axes -> True]}]]

Straal=0.001.  Het "eerste" (d.w.z. met de kleinste modulus) nulpunt zit binnen de cirkel:

Do[cirkelNul[0.001]]

Resultaat - de spirograaf-kurve draait 1 keer rond de oorsprong. En de afbeelding beperkt tot die cirkel is injectief.

********************************************************************************

Straal=0.01.  Het eerste nulpunt zit binnen de cirkel. Het tweede nulpunt ligt nog erbuiten:

Do[cirkelNul[0.01]]

Het beeld lijkt nog altijd op het beeld in het eerste geval.

********************************************************************************

Straal=0.1.  Het eerste nulpunt zit binnen de cirkel. Het tweede nulpunt ligt nog erbuiten:

Do[cirkelNul[0.1]]

De spirograaf-kurve draait ook in dit geval maar een keer rond de oorsprong. De injectiviteit is al echter verloren! - een van de waarden wordt twee keer bereikt.

********************************************************************************

Straal=0.13376.  Het eerste nulpunt zit binnen de cirkel. Het tweede nulpunt ligt erop:

Do[cirkelNul[0.13376]]

Een grensgeval. Het beeld (de spirograaf-kurve) draait 1 keer volledig rond de oorsprong. Tweede keer is op komst! - aangezien het tweede nulpunt op de cirkel ligt, passeert het beeld van de cirkel door de oorsprong.
De injectiviteit - als in vorig geval - is verloren.

********************************************************************************

Straal=0.4.  Eerste twee nulpunten zitten binnen de cirkel:

Do[cirkelNul[0.4]]

Resultaat - 2 keer draaien rond de oorsprong.

********************************************************************************

Straal=0.858878.  Eerste twee nulpunten zitten binnen de cirkel, het derde ligt erop:

Do[cirkelNul[0.858878]]

Twee keer volledig draaien. Derde keer op komst. Weeral een grensgeval omdat het derde nulpunt op de cirkel ligt.
We kunnen nog minder van injectiviteit spreken... 6 verschillende waarden worden twee keer bereikt.

********************************************************************************

Straal=0.9.  Eerste drie nulpunten zitten binnen de cirkel:

Do[cirkelNul[0.9]]

Drie nulpunten binnen - drie keer volledig draaien rond de oorsprong. Toeval of niet?
Injectiviteit - al 10 verschillende waarden worden twee keer bereikt (de kurve snijdt zichzelf in 10 verschillende punten).

********************************************************************************

Straal=0.932977.  Eerste drie nulpunten zitten binnen de cirkel. Twee (mekaars toegevoegden!) liggen op de cirkel:

Do[cirkelNul[0.932977]]

3 keer volledig rond de oorsprong draaien. Vierde en vijfde keer op komst - de kurve passeert 2 keer door de oorsprong, omdat de twee "laatste" nulpunten op de cirkel liggen.
Injectiviteit - nog verder van...

********************************************************************************

Straal=1.  Alle 5 nulpunten van de veelterm liggen binnen de cirkel! Meer zijn er niet, want de veelterm heeft graad 5:

Do[cirkelNul[1]]

5 keer draaien rond de oorsprong!

********************************************************************************

Straal=2.  Alle nulpunten zitten ("zeer diep" zelfs) binnen de cirkel:

Do[cirkelNul[2]]

Het beeld begint te trekken op een opgerolde stuk touw of metaaldraad. 5 keer rondgedraaid. De lijn snijdt zichzelf meerdere keren. Een beetje moeilijk te zien, hoeveel precies, maar het is duidelijk dat de injectiviteit niet verbetert met de groei van de straal...

********************************************************************************

Straal=5:

Do[cirkelNul[5]]

Ook hier draait de spirograafkurve 5 keer rond de oorsprong. Merk op dat het beeld erg goed op het spirograaf-kurve voor de veelterm  (z^5)  trekt (maar nooit identiek aan wordt). Klik hierop om het te kunnen vergelijken met het beeld van de cirkel die 5 keer rond zijn middelpunt draait.

********************************************************************************

Conclusie:
Beelden van alle cirkels waarbinnen alle nulpunten van een veelterm liggen zijn spirograaflijnen die evenveel keren rond de oorsprong draaien als de hoogste macht van de veelterm. Dat is ook aantal nulpunten - met elke nulpunt "komt immers een draaike bij". Spirograaflijnen van de veeltermen met de hoogste macht n lijken voor de zeer grote stralen van cirkels op de spirograaflijnen voor de veelterm  (z^n). En dat is een n-voudige cirkel - dat WETEN we al.
En vice-versa: er zijn evenveel nulpunten binnen de cirkel als het aantal omwentelingen van de spirograaflijn. En voor voor de spirograaflijnen die ontstaan als beelden van cirkels met voldoende grote straal is dit gelijk aan de graad van de veelterm.
Dus is het aantal nulpunten van elke veelterm gelijk aan zijn graad.

Dat is natuurlijk geen "echte" bewijs van de Hoofdstelling van de Algebra. Het echte bewijs wordt toch gebaseerd op de observaties gelijk hierboven!
We hebben ons hier ook beperkt tot complexe veeltermen met reële coëfficiënten.

Antwoorden op vraagstukken

Waarom rechte lijn???

terug naar de tekst van de notebook.

Het is nuttig om eerst kennis te maken met het hoofdstuk 4.1. In dat hoofdstuk wordt er verband tussen de spirografen en complexe veeltermen aangetoond. Klik hier.

Voor  z=a+bi   van de eenheidscirkel is  (z^(-1))=a-bi.  Gewoon omdat de modulus gelijk is aan 1. Bij de multiplicatief inverse verandert dus maar het argument in "min argument". De som is gelijk aan  z+(z^(-1))=a+bi+a-bi=2a  - een reëel getal! Daarom is voor alle z van de eenheidscirkel  z+(z^(-1))=2Re[z].  De spirograaflijn - het beeld van de eenheidscirkel onder de werking van functie  z->z+(z^(-1)) is dus interval  [-2,2], want voor z van de eenheidscirkel geldt:  -1≤Re[z]≤1,  dus  -2≤2Re[z]≤2.

Nulpunten van complexe veeltermen met reële coëfficiënten

Terug naar de tekst van de notebook.
Als z=a+bi een nulpunt is dan is zijn toegevoegde Conjugate[z]=a-bi dat ook.
a(x^2) + bx + c = 0
Δ=(b^2) - 4  ac
(Subscript[x, 1]) = ((-b + (Sqrt[Δ]))/(2  a)),  (Subscript[x, 2]) = ((-b - (Sqrt[Δ]))/(2  a))
Re[(Subscript[x, 1])]=Re[(Subscript[x, 2])]
Im[(Subscript[x, 1])]=-Im[(Subscript[x, 2])]
(Subscript[x, 1])  en  (Subscript[x, 2])  zijn dus mekaars toegevoegde. z  en  Conjugate[z]  liggen symmetrisch t.o.v. de X-as.

Ligging van de spirograaf-kurven ten opzichte van de assen

Terug naar de tekst van de notebook.
Een klein test-programma die assymmetrieën van de spirograaf-kurven laat onderzoeken. Experimenteer daar gerust zelf mee door de groene veeltermen door je eigen veeltermen te vervangen en de cellen evalueren. Als TestSymOX[polyn] "True" is, is de spirograaf-kurve van de veelterm symmetrisch ten opzichte van de X-as, in geval van "False" - niet. Op dezelfde manier beschrijft TestSymOY[polyn] symmetrie t.o.v. as Y.

\(ComplexExpand[Re[polyn[a + b\ I]]]; 

    ComplexExpand[Re[polyn[a - b\ I]]]; 

    ComplexExpand[Re[polyn[\(-a\) + b\ I]]]; 

    ComplexExpand[Im[polyn[a + b\ I]]]; 

    ComplexExpand[Im[polyn[a - b\ I]]]; 

    ComplexExpand[Im[polyn[\(-a\) + b\ I]]]; 


    TestSymOX[polyn_] := 
      \((ComplexExpand[Re[polyn[a + b\ I]]] === 
            ComplexExpand[Re[polyn[a - b\ I]]])\) && 
        \((ComplexExpand[Im[polyn[a + b\ I]]] === 
            \(-ComplexExpand[Im[polyn[a - b\ I]]]\))\)
\)TestSymOY[polyn_] := 
      (ComplexExpand[Re[polyn[a + b I]]] === 
            -ComplexExpand[Re[polyn[-a + b I]]]) && 
        (ComplexExpand[Im[polyn[a + b I]]] === 
            ComplexExpand[Im[polyn[-a + b I]]])

Hieronder volgen enkele toepassingen van het test-programma. We onderzoeken symmetrieën van de beelden van veeltermen met verschillende snelheidscoëfficiënten:

Voorbeeld 1: Alle snelheidscoëfficiënten oneven:

Clear[polyn]
polyn[z_]:=z^19 + 5 z^15 + 9 z^11 + 7 z^7 + 4 z^3 + 6 z
TestSymOX[polyn]TestSymOY[polyn]

Beide symmetrieen! - toeval of niet? Maak zelf je eigen testen, voor andere veeltermen met alleen maar oneven machten z.

***********************************************************************************

Voorbeeld 2: Snelheidscoëfficiënten: behalve 1 coëfficiënt alle coëfficiënten oneven:

Clear[polyn]
polyn[z_]:=4 z^19 + 7 z^10 + 22 z^11 + 92 z^7 + 100 z^3 + z
TestSymOX[polyn]TestSymOY[polyn]

Zelfs maar één even macht z "jaagt de symmetrie t.o.v. de Y-as weg"!!! Symmetrie t.o.v. de X-as blijft.

***********************************************************************************

Voorbeeld 3: Alle snelheidscoëfficiënten even:

Clear[polyn]
polyn[z_]:=5 z^14 + 9 z^6 + 91 z^4 + 76 z^2
TestSymOX[polyn]TestSymOY[polyn]

De tweede symmetrie lijkt voorgoed verloren.

***********************************************************************************

Formeel bewijs - goniometrie:

\(Clear[punten, lijnen, teksten, bogen, tekening]; 


    punten[α_, 
        r_] := {{Hue[0], PointSize[0.02], 
          Point[{r\ Cos[α], r\ Sin[α]}]}, 

        		{Hue[0.3], PointSize[0.02], 
          Point[{r\ Cos[α], r\ Sin[\(-α\)]}]}, 

        		{Hue[0.7], PointSize[0.02], 
          Point[{r\ Cos[Pi - α], r\ Sin[Pi - α]}]}}; 


    lijnen[α_, 
        r_] := {{Hue[0], Thickness[0.007], 
          Line[{{0, 0}, {r\ Cos[α], r\ Sin[α]}}]}, 

        		{Hue[0.3], Thickness[0.007], 
          Line[{{0, 0}, {r\ Cos[\(-α\)], r\ Sin[\(-α\)]}}]}, 

        		{Hue[0.7], Thickness[0.007], 
          Line[{{0, 0}, {r\ Cos[Pi - α], r\ Sin[Pi - α]}}]}}; 

    
teksten[α_, r_] := {
        Text[FontForm["a+bI", {"Courier-Bold", 18}], {
            r\ Cos[α], r\ Sin[α] +  .2}], 
		
        Text[FontForm[
            "α", {"Courier-Bold", 18}], { .3\ r\ 
              Cos[α/2],  .3\ r\ Sin[α/2]}], 
		
        Text[FontForm["a-bI", {"Courier-Bold", 18}], {
            r\ Cos[\(-α\)], r\ Sin[\(-α\)] +  .2}], 
			
        Text[FontForm[
            "α", {"Courier-Bold", 18}], { .3\ r\ 
              Cos[\(-α\)/2],  .3\ r\ Sin[\(-α\)/2]}], 
		
        Text[FontForm["-a+bI", {"Courier-Bold", 18}], {
            r\ Cos[Pi - α], r\ Sin[Pi - α] +  .2}], 
		
        Text[FontForm[
            "α", {"Courier-Bold", 18}], { .3\ r\ 
              Cos[Pi - α/2],  .3\ r\ Sin[Pi - α/2]}]}; 


    bogen[α_, 
        r_] := {{Hue[0], Thickness[0.007], 
          Circle[{0, 0}, r/2, {0, α}]}, 

        		{Hue[0.3], Thickness[0.007], 
          Circle[{0, 0}, r/2, {2\ Pi - α, 2\ Pi}]}, 

        		{Hue[0.7], Thickness[0.007], 
          Circle[{0, 0}, r/2, {Pi - α, Pi}]}}; 


    tekening[α_, r_] := 
      Show[Graphics[{punten[α, r], lijnen[α, r], 
            teksten[α, r], bogen[α, r], Circle[{0, 0}, r]}, 
          Axes -> True, AspectRatio -> Automatic, 
          PlotRange -> {{\(-r\) -  .2, r +  .2}, {\(-r\) -  .2, r +  .2}}]]; 
    \)

tekening[Pi/6, 2]

Laat ons voor   z=a+bi    volgende notatie invoeren:
Abs[z]=(Sqrt[(a^2) + (b^2)])=r	Arg[z]=α
Dan hebben we:
z=r(cosα+isinα)	Re[z]=rcosα,   Im[z]=rsinα

Om de symmetrieën van de beelden van complexe functies op cirkels met middelpunt in de oorsprong te onderzoeken, kunnen we bepaalde begrippen van de wereld van reële functies veralgemenen. Welke begrippen? - "even functie" en "oneven functie".
Ter herinnering:
Functie f:ℝ→ℝ heet even als  f(-x)=f(x)  voor elke reële x. Merk op: de grafiek van zulke functie is symmetrisch t.o.v. de Y-as. Voorbeeld: cosinus.
Functie f:ℝ→ℝ heet oneven als  f(-x)=-f(x)  voor elke reële x. Merk op: de grafiek van zulke functie is puntsymmetrisch t.o.v. de oorsprong. Voorbeeld: sinus.
In de "reële" wereld vergeleken we functiewaarden op de twee halfrechten, die mekaars symmetrie-beelden zijn t.o.v. de Y-as en de oorsprong. In de "complexe" wereld gaan we functiewaarden op halve-cirkels vergelijken: waarden op de "onderste helft" met de waarden op de "bovenste helft" voor de symmetrie t.o.v. de X-as en waarden op de "linker helft" met de waarden op de "rechter helft" voor symmetrie t.o.v. Y-as:

Symmetrie van beelden van cirkels onder  f:ℂ→ℂ  ten opzichte van de X-as
\(z\&_\)=a-bi  - toegevoegde (Conjugate[z]) is symmetrisch beeld van  z  t.o.v. de X-as (zie tekening boven!)
f(a+bi) en f(a-bi) zijn symmetrich t.o.v. de X-as als:
Re[f(a-bi)]=Re[f(a+bi)],	Im[f(a-bi)]=-Im[f(a+bi)]

Symmetrie van beelden van cirkels onder  f:ℂ→ℂ  ten opzichte van de Y-as
-a+bi  is symmetrisch beeld van  z  t.o.v. de Y-as (maar heeft geen speciale naam).
f(a+bi) en f(-a+bi) zijn symmetrich t.o.v. de Y-as als:
Re[f(-a+bi)]=-Re[f(a+bi)],	Im[f(-a+bi)]=Im[f(a+bi)]

We proberen nu voorwaarden voor de machten  c  van  z  te vinden, onder welke de functiewaarden van   f(z)=(z^c)  op symmetrisch liggende getallen symmetrisch blijven. Voor veeltermen kunnen we dit term per term analyseren. Vermenigvuldigen met een reëel getal ( a(z^c)) verandert enkel maar de straallengte van het beeld. Een veelterm ontstaat als som van dergelijke termen. In verband met de spirografen analyseren we alleen maar veeltermen met de vrije term gelijk aan nul. Enkel maar als elke term van een veelterm zich "symmetrisch gedraagt", gedraagt zich de hele veelterm symmetrisch. Daarom formuleren wij van de eerste keer een voorwaarde voor de hele snelheidscoëfficiëntenlijst!
In de tabel hieronder zie je voor  a+bi=r(cosα+isinα)  argumenten (de hoeken!) van zijn symmetrische beelden t.o.v. de assen (kolom "Arg[z]") en argumenten van de beelden van al die drie getallen onder de functie  f(z)=(z^c)  voor even en oneven  c  (kolommen "Arg[(z^(2 n))]" en "Arg[(z^(2 n + 1))]").  2n symboliseert hier even macht, 2n+1 - oneven macht.
Niet vergeten! - machtsverheffing betekent vermenigvuldigen van de hoek met het getal van macht:

\(TableForm[{{"-------", "----------", "----------", 
          "---------------"}, 

        		{"a+bI", "α", "2nα", 
          "(2n+1)α"}, 

        		{"a-bI", "-α", "-2nα", 
          "-(2n+1)α"}, 

        	{"-a+bI", "π-α", 
          "2nπ-2nα", "(2n+1)π-(2n+1)α"}}, 
      TableHeadings -> {
          None, {"z", "Arg[z]", \*""Arg[\!\(z\^\(2  n\)\)]"", 
            \*""Arg[\!\(z\^\(2  n + 1\)\)]""}}]\)

Invloed van de machtsverheffing op cosinus van de argumenten, dus automatisch ook op de reële waarde van getal
(we maken hier gebruik van 2π-periodiciteit van functie cos en daarvan dat cos(-α)=cosα, cos(π-α)=-cosα):

\(TableForm[{{"------", "-------", "-----------", 
          "-------------"}, 

        		{"a+bI", "cosα", 
          "cos(2nα)", "cos((2n+1)α)"}, 

        		{"a-bI", "cosα", 
          "cos(2nα)", "cos((2n+1)α)"}, 

        	{"-a+bI", "-cosα", 
          "cos(2nα)", "-cos((2n+1)α)"}}, 
      TableHeadings -> {
          None, {"z", \*""\!\(Re[z]\/r\)"", 
            \*""\!\(Re[z\^\(2  n\)]\/r\^\(2  n\)\)"", 
            \*""\!\(Re[z\^\(2  n + 1\)]\/r\^\(2  n + 1\)\)""}}]\)

Conclusie: 
	voor even machten  c  van  z,  hebben we voor   f(z)=(z^c):
Re[f(a-bi)]=Re[f(a+bi)]- sym. t.o.v. X-as O.K.,
Re[f(-a+bi)]=Re[f(a+bi)]- sym. t.o.v. Y-as NIET O.K.
	voor oneven machten  c  van  z,  hebben we voor   f(z)=(z^c):
Re[f(a-bi)]=Re[f(a+bi)]- sym. t.o.v. X-as O.K.,
Re[f(-a+bi)]=-Re[f(a+bi)]- sym. t.o.v. Y-as O.K.

Invloed van de machtsverheffing op sinus van de argumenten, dus automatisch ook op de imaginaire waarde van getal
(we maken hier gebruik van 2π-periodiciteit van functie sin en daarvan dat sin(-α)=-sinα, sin(π-α)=sinα):

\(TableForm[{{"------", "-------", "-----------", 
          "-------------"}, 

        		{"a+bI", "sinα", 
          "sin(2nα)", "sin((2n+1)α)"}, 

        		{"a-bI", "-sinα", 
          "-sin(2nα)", "-sin((2n+1)α)"}, 

        	{"-a+bI", "sinα", 
          "-sin(2nα)", "sin((2n+1)α)"}}, 
      TableHeadings -> {
          None, {"z", \*""\!\(Im[z]\/r\)"", 
            \*""\!\(Im[z\^\(2  n\)]\/r\^\(2  n\)\)"", 
            \*""\!\(Im[z\^\(2  n + 1\)]\/r\^\(2  n + 1\)\)""}}]\)

Conclusie: 
	voor even machten  c  van  z,  hebben we voor   f(z)=(z^c):
Im[f(a-bi)]=-Im[f(a+bi)]- sym. t.o.v. X-as O.K.,
Im[f(-a+bi)]=-Im[f(a+bi)]- sym. t.o.v. Y-as NIET O.K.
	voor oneven machten  c  van  z,  hebben we voor   f(z)=(z^c):
Im[f(a-bi)]=-Im[f(a+bi)]- sym. t.o.v. X-as O.K.,
Im[f(-a+bi)]=Im[f(a+bi)]- sym. t.o.v. Y-as O.K.

Algemene conclusie: 
Ongeacht de machten (even, oneven, of gemengd) is de symmetrie t.o.v. de X-as altijd aanwezig. De spirograaf-kurve is ook symmetrisch t.o.v. de Y-as alleen maar als alle machten oneven zijn!

spirograaf-kurven en hun symmetrieën - inspiratie opgedaan tijdens een bezoek aan de web-site van Frank Farris

Terug naar de tekst van de notebook.

Voor een gegeven spirograaf (veelterm):
Neem alle snelheidscoëfficiënten (machten van z) en schrijf hun paarsgewijze verschillen uit. Bij voorbeeld:
machtenList={c1,c2,...,cn}
verschillen={c1-c2, c1-c3, ..., c1-cn, c2-c3, ..., c2-cn, ..., c(n-1)-cn}. Op die manier krijgen wij ((n (n - 1))/2) getallen.
Vind de grootste gemene deler van die verschillen. Het resultaat helpt aantal identieke "segmenten" te vinden van welke de spirograaf gebouwd is. Op welke manier? - gaan we straks zien. (daarom hebben we in de notebook al die "GGD's" uitgerekend!)

Een klein programma dat alle paarsgewijze verschillen en hun grootste gemene deler uitrekent:

Clear[machtenList, verschillen, n];
n := Length[machtenList];
verschillen[machtenList_] := 
        Flatten[Table[
            machtenList[[i]] - machtenList[[j]], {i, n}, {j, i + 1, 
              n}]];

machtenList:={1, 37, 7, -5, 13, 19, -11};

verschillen[machtenList]Apply[GCD, verschillen[machtenList]]

We gaan de snelheidscoëfficiënten {1,37,7,-5,13,19,-11} in ons volgend voorbeeld gebruiken. De grootste gemene deler van hun paarsgewijze verschillen is (resultaat van het test-programma hierboven) gelijk aan 6. Alle coëfficiënten zijn gelijk aan 1 modulo 6. Bekijk (op de tekening hieronder) een voorbeeld van een spirograaflijn met die snelheidscoëfficiënten:

Clear[machten, f, move, g, coords, cirkels, som, spiroMetCirkels, 
        veelterm, poly];

machten[machtenList_, z_] :=  z^machtenList;

f[coeffList_, machtenList_, φ_] := 
        If[Length[coeffList] == 1, 
          coeffList[[1]] E^(I φ machtenList[[1]]), 
          (coeffList .  machten[machtenList, z]) /. 
            z -> E^(I φ)];

move[coeffList_, machtenList_, a_] := 
        Table[{Hue[a], Point[coords[f[coeffList, machtenList, t]]]}, {t, 0,  
            2 Pi, 0.001}];

g[coeffList_, 0] := 0g[coeffList_, n_] := Apply[Plus, Take[coeffList, n]];

coords[z_] := {Re[z], Im[z]};

cirkels[coeffList_] := 
            Table[Circle[{g[coeffList, n - 1], 0}, coeffList[[n]]], {n, 
                1, Length[coeffList], 1}];

som := Apply[Plus, coeffList]
\(spiroMetCirkels[coeffList_, machtenList_, a_] := 
      Show[{Graphics[cirkels[coeffList]], 
          Graphics[move[coeffList, machtenList, a]]}, 
        AspectRatio -> Automatic, 
        PlotRange -> {{\(-som\), som}, {\(-som\), som}}, Axes -> True]; 


    veelterm[coeffList_, machtenList_, φ_] := 
      TraditionalForm[f[coeffList, machtenList, φ]]; 

    poly[coeffList_, machtenList_] := 
      If[Length[coeffList] == 1, 
        coeffList[\([1]\)]\ z^\((machtenList[\([1]\)])\), 
        \((coeffList . \ machten[machtenList, z])\)]; \)

Geval 1:
Rest bij het delen door 6 is voor alle snelheidscoëfficiënten gelijk aan 1:

Clear[coeffList, machtenList];

coeffList:={8, 4, 2, 1,  .5,  .25,  .125};
machtenList:={1, 37, 7, -5, 13, 19, -11};

spiroMetCirkels[coeffList, machtenList,  .9]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Resultaat: 6 gelijke compartementen. De patroon herhaalt zich om de 1/6 van de route.

Hoe verandert het aantal gelijke segmenten van de spirograaflijn voor dezelfde stralen van de cirkels, maar met snelheidscoëfficiënten vergroot met 1 (dwz. die bij het delen door 6 rest 2 geven!)? En als de rest 3, 4, 5 is? - we analyseren alle die gevallen hieronder (we tellen in elk volgend geval 1 bij alle snelheidscoëfficiënten van het geval daarvoor - om de rest bij het delen door 6 aan te passen):

Geval 2:
Rest bij het delen door 6 is voor alle coëfficiënten gelijk aan 2:

Clear[coeffList, machtenList];

coeffList:={8, 4, 2, 1,  .5,  .25,  .125};
machtenList:={2, 38, 8, -4, 14, 20, -10};

spiroMetCirkels[coeffList, machtenList,  .9]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Resultaat: 3 gelijke compartementen. De patroon herhaalt zich om de 2/6=1/3 van de route.

Geval 3:
Rest bij het delen door 6 is voor alle coëfficiënten gelijk aan 3:

Clear[coeffList, machtenList];

coeffList:={8, 4, 2, 1,  .5,  .25,  .125};
machtenList:={3, 39, 9, -3, 15, 21, -9};

spiroMetCirkels[coeffList, machtenList,  .9]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Resultaat: 2 gelijke compartementen. De patroon herhaalt zich om de 3/6=1/2 van de route.

Geval 4:
Rest bij het delen door 6 is voor alle coëfficiënten gelijk aan 4:

Clear[coeffList, machtenList];

coeffList:={8, 4, 2, 1,  .5,  .25,  .125};
machtenList:={4, 40, 10, -2, 16, 22, -8};

spiroMetCirkels[coeffList, machtenList,  .9]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Resultaat: 3 gelijke compartementen. De patroon herhaalt zich om de 4/6=2/3 van de route.

Geval 5:
Rest bij het delen door 6 is voor alle coëfficiënten gelijk aan 5:

Clear[coeffList, machtenList];

coeffList:={8, 4, 2, 1,  .5,  .25,  .125};
machtenList:={5, 41, 11, -1, 17, 23, -7};

spiroMetCirkels[coeffList, machtenList,  .9]veelterm[coeffList, machtenList, φ]poly[coeffList, machtenList]

Resultaat: 6 gelijke compartementen. De patroon herhaalt zich om de 5/6 van de route. GGD(5,6)=1, dus als we "om de 5/6 springen", krijgen we alle "tussenposten": 1/6, 2/6, 3/6, 4/6, 5/6, 6/6. Een prachtige analogie met de groep van 6de machtswortels van 1 en haar generatoren! Alleen maar de wortels wiens "nummer" relatief priem is met 6, kunnen hele groep genereren ("geraken tot alle tussenposten door iedere keer te springen over hun argument").
Bekijk eens hoe de veelterm  0.125(z^(-7)) + (z^(-1)) + 8(z^5) + 2(z^11) + 0.5(z^17) + 0.25(z^23) + 4(z^41)  (wiens beeld op de eenheidscirkel je daarnet bekeken hebt) op alle 6de machtswortels van 1 werkt. Alle die wortels liggen natuurlijk op de eenheidscirkel. Op de tekening hieronder zie je dus 6 punten van de spirograaflijn die je op de tekening hierboven in het geheel gezien hebt. De 6de machtswortels van 1 en hun beelden onder de veelterm hebben dezelfde kleur:

\(<< Graphics`ArgColors`

Clear[kleuren, punten, coords, set1]; 


    coords[z_] := {Re[z], Im[z]}
\)\(kleuren[set_List] := Table[ArgColor[set[\([j]\)]], {j, Length[set]}]; 

    
punten[set_List] := 
      Table[{PointSize[0.02], Point[coords[set[\([j]\)]]]}, {j, 
          Length[set]}]; 

Clear[n]; 

n = 6; 
    set1 = E\^\(\(I\ Range[n]\ 2\ π\)\/n\); 


    Clear[f]; 


    f[z_] := 0.125\ z^\((\(-7\))\) + z^\((\(-1\))\) + 8\ z^5 + 2\ z^11 + 
        0.5\ z^17 + 0.25\ z^23 + 4\ z^41
\)\(Show[{Graphics[Transpose[{kleuren[set1], punten[set1]}]], 
        Graphics[Transpose[{kleuren[set1], punten[f[set1]]}]]}, 
	
      PlotRange -> {{\(-17\), 17}, {\(-17\), 17}}, 
      AspectRatio -> Automatic, Axes -> True]\)

Als de rest bij het delen door 6 nul is voor alle coëfficiënten, gebeurt er niks merkwaardigs. Er hoeven geen gelijke segmenten aanwezig te zijn. Enkel maar de "verplichte" symmetrie t.o.v. de X-as. Waarom? - het wordt duidelijk na analyse van het bewijs hieronder:

Stelling
(vergelijk met het voorbeeld hierboven - voor  K=6  en   r=1,2,3,4,5.)
Als alle snelheidscoëfficiënten van de spirograaf dezelfde rest  r  hebben modulo een zeker natuurlijk getal  K  (d.w.z.  K  is een deler van alle paarsgewijze verschillen van de snelheidscoëfficiënten), dan herhaalt de spirograaflijn om de  r/K  van de hele traject hetzelfde patroon.
Er zijn dus maksimaal  (Subscript[K, max])  gelijke compartementen van de spirograaflijn, waar  (Subscript[K, max])=GGD(paarsgewijze verschillen van de snelheidscoëfficiënten).
Als GGD((Subscript[K, max]),r)=1, zijn er exact (Subscript[K, max]) gelijke segmenten. Anders minder:  (Subscript[K, max])/GGD(r,(Subscript[K, max])).

Bewijs (schets):
We gebruiken hier een parametervoorstelling van een veelterm (dus i.p.v.  (z^c)  spreken we van  V(φ)=(e^i)φc,  waar  z=cosφ+isinφ. Spirograaflijn als grafiek van som van functies type V:[0,2π]->ℂ).
We bekijken wat er gebeurt met elk van de wielen na de beweging om 1/K van de periode (dat is 2π). We vervangen dus φ door φ+2π/K. Snelheid  c  van elk wiel kan uitgedrukt worden als c=Km+r, waar m is geheel getal en r (de rest) is van verzameling {1,2,...,K-1}.

V (φ)(( = e)^i)φc=(e^(iφ (Km + r)))

V (φ + 2 π/K)=(e^((Km + r) i 
              (φ + 2  π/K))) = 
          (e^((Km + r) iφ)) 
              (e^((Km + r) 2  πi/K)) = 
            (e^((Km + r) iφ))(e^m2)πi(e^(r2πi/K))=(e^((Km + r) iφ))(e^(2  πir/K))=V (φ)(e^(2 πir/K))

Voor de toename van de argument gelijk aan 2π/K (1/K van de hele cirkel) is de waarde bijna niet veranderd - alleen maar geroteerd over de hoek gelijk aan r/K van de volledige weg over de cirkelboog.
Elke wiel gedraagt zich op dezelfde manier (alle wielen bewegen immers met de snelheid wiens waarde gelijk is aan r modulo K.), dus we hebben een soort K-voudige symmetrie. Als r=1, K gelijke compartementen, anders K/GGD(K,r).

Opmerking:
De hele redenering hierboven heeft natuurlijk maar zin in geval van spirograaflijn die als resultaat van draaibeweging van minstens twee wielen ontstaat. Draaibeweging van één cirkel geeft immers (ongeacht de straal en snelheid) cirkel als resultaat. En die heeft oneindig veel symmetrieassen en oneindig veel "gelijke segmenten"!
Er moeten ook minstens twee verschillende snelheidscoëfficiënten zijn. Meerdere aan mekaar gekoppelde wielen die met dezelfde snelheid draaien, geven ook een cirkel als resultaat.
In de redenering hierboven hebben we dus stilzwijgend verondersteld dat het om draaibeweging van minstens twee wielen gaat en dat minstens twee van die wielen met verschillende hoeksnelheden draaien...