De digitale vraagbaak voor het wiskundeonderwijs

home |  vandaag |  gisteren |  bijzonder |  gastenboek |  wie is wie? |  verhalen |  contact

HOME

samengevat
vragen bekijken
een vraag stellen
hulpjes
zoeken
FAQ
links
twitter
boeken
help

inloggen

colofon

  \require{AMSmath} Printen

Patronen in een vierkant van 4 bij 4 vakjes

hoe bereken ik het aantal mogelijke patronen uitgaande van het volgende:
ik maak een vierkant van 4 bij 4 vakjes (dus 16);
in ieder vakje staat een diagonaal (dalend of stijgend);
door de vierkanten (van 16 vakjes) te schakelen ontstaan
door de diagonalen in de vakjes patronen; ik wil geen herhalingen van patronen (spiegelingen, draaiingen).

P.S.
het idee is dat de vierkanten (zelf verdeeld in 4 bij 4, dus zestien vierkantjes) horizontaal en verticaal worden uitgebreid tot 'matjes' van 4 bij 4 vierkanten...

omdat er, volgens mij, 2 tot de zestiende mogelijke patronen kunnen ontstaan en ik ze grafisch wil verbeelden wordt het veel tekenwerk, terwijl ik weet dat er veel verdubbelingen (gespiegeld en gedraaid) zullen voorkomen...
die wil ik liever niet tekenen, want het gaat mij om unieke patronen en dat zullen er beduidend minder zijn...

Robert
Ouder - maandag 23 februari 2004

Antwoord

Hallo Robert,

Inmiddels is dit een heel project geworden. Om dit antwoord overzichtelijk te houden, zullen we maar beginnen met een inhoudsopgave:
  1. Inleiding
  2. Voorbeeld met Burnside's lemma
  3. Bewijs-idee voor Burnside's lemma
  4. Toelichting op de matlab-routines
  5. Downloaden van de matlab-routines
  6. Enkele resultaten

Inleiding

Ik begin met te formuleren hoe ik nu jouw vraag begrijp. Je begint met het maken van vierkanten van 4 bij 4 vakjes met patronen van de volgende vorm (dit zijn maar een paar voorbeelden):

////
////
////
////
/\//
\///
/\\/
/\/\
\\\\
\\\\
\\\\
\\\\
\\//
\\//
//\\
//\\

enzovoorts..., waarbij je de eerste en de derde als hetzelfde wilt beschouwen omdat ze door draaiing in elkaar overgaan. Zoals je zegt is het niet erg handig om alle 216 mogelijkheden te gaan teken. Vervolgens breidt je dit patroon periodiek uit over het hele platte vlak en wil je ook patronen die dan door verschuiving in elkaar overgaan als gelijk beschouwen.

Voorbeeld met Burnside's lemma, zonder verschuivingen

Dit is een typisch geval waarin de formule van Pslya goed te gebruiken is. Dat is een formule uit de groepentheorie. Voor een bewijs verwijs ik graag naar de website http://homepage2.nifty.com/PAF00305/math_e/polya/, waarin de formule die ik als Pslya's formule heb geleerd overigens onder de naam (not) Burnside's lemma voorkomt. Daar wordt ook de benodigde terminologie uit de groepentheorie besproken. Onderaan de pagina heb ik geprobeert om een makkelijker begrijpbare uitleg te geven.

Nu zal ik eerst (not) Burnside's lemma gebruiken om het aantal onafhankelijke patronen te bepalen, zonder rekening te houden met verschuivingen. Met verschuivingen wordt het ook met behulp van Burnside's lemma nog heel wat werk. Inmiddels heb ik echter een matlab-routine geschreven die Burnside's lemma gebruikt om het aantal onafhankelijke patronen te bepalen (wel rekening houdend met verschuivingen) startend met willekeurige m bij n vakjes. In dit probleem moeten we kijken naar de groep G van draaiingen en spiegelingen van het vierkant. Die bestaat uit de volgende elementen:
e = de identiteit, die alles op z'n plek laat.
s = spiegeling in verticale as.
d = draaiing kwartslag rechtsom.
d2 = 2 keer kwartslag rechtsom draaien, dus puntspiegeling.
d3 = 3 keer kwartslag rechtsom draaien = kwartslag linksom.
sd = spiegeling in dalende diagonaal.
sd2 = spiegeling in horizontale as.
sd3 = spiegeling in stijgende diagonaal.

Burnside's lemma zegt nu dat:
|banen| = 1/|G| ågÎG |Xg|,

|banen| = het aantal onafhankelijke patronen.
|G| = het aantal elementen van de groep G.
|Xg| = het aantal vaste punten van de transformatie gÎG, dat wil zeggen, het aantal patronen dat symmetrisch is onder g.

Nu hoeven we dus alleen voor elk van de spiegelingen en draaiingen te bepalen hoeveel patronen er zijn met die symmetrie:
Xe: alle patronen blijven op hun plek als je er niets mee doet, ® 216
Xs: patronen die symmetrisch zijn onder spiegeling in de verticale as worden bepaald door de linkerhelft te kennen, ® 28
Xsd2: idem voor spiegeling in horizontale as, alleen dan met de onderste helft, ® 28
Xsd: patronen die symmetrisch zijn onder spiegeling in de (dalende) diagonaal worden bepaald door de
elementen op de bovenhelft (6 vierkantjes) en zijn op de diagonaal (4 vierkantjes) nog vrij te kiezen, ® 210
Xsd3: idem voor spiegeling in stijgende diagonaal, ® 210
Xd: patronen die onder draaiing over een kwart slag in zichzelf overgaan worden bepaald door één kwadrant te kennen, ® 24
Xd3: idem voor draaiing linksom, ® 24
Xd2: puntsymmetrische patronen worden bepaald door één helft te kennen, ® 28

Tenslotte is het gemiddelde hiervan het aantal onafhankelijke patronen, 8548 dus.
Met vriendelijke groet,

Guido Terra

P.S. Als je alleen zou eisen dat de patronen niet door draaiingen in elkaar over mogen gaan en spiegelingen dus
niet toestaat, dan moet je gewoon de spiegelingen uit het bovenstaande rijtje weglaten: dat levert 16456 onafhankelijke patronen.

Het idee achter het bewijs van Burnside's lemma

P.P.S. De afgelopen dagen heb ik nog lopen nadenken of ik niet een intuitief (lees: voor leken begrijpbaar) bewijs kon bedenken voor Burnside's lemma, zodat je niet in de groepentheorie hoeft te duiken om dit te begrijpen. Eergisteravond kwam ik voor het slapen gaan inderdaad tot de volgende uitleg. Het woord "baan" blijf ik wel gebruiken, omdat het zo lekker kort is. Het is gewoon de groepentheoretische naam voor een verzameling van patronen die "in feite hetzelfde zijn" omdat ze door draaiing/spiegeling in elkaar over te voeren zijn:

Stel je voor dat we op de volgende (omslachtige) wijze het totaal aantal patronen (zonder rekening te houden met draaiingen en spiegelingen) proberen uit te tellen: uit elke baan kiezen we één patroon en bekijken alle draaiingen en spiegelingen daarvan. Op die manier krijg je inderdaad alle mogelijke patronen, maar bij symmetrische patronen tel je dubbel omdat de gedraaide/gespiegelde weer hetzelfde patroon is. Dit leidt tot de volgende berekening: neem het aantal onafhankelijke patronen (=banen), vermenigvuldig dat met het aantal draaiingen en spiegelingen die je kunt doen (inclusief de identiteit = niets doen) en trek daar dan de dubbeltellingen vanaf. Oftewel:

alle patronen = banen · alle symmetrieën - symmetrische patronen (voor elke niet-triviale symmetrie apart meetellen).

Pslya's formule is nu niets anders dan een omschrijving van bovenstaande tot een formule voor het aantal banen, waarbij je even moet bedenken dat "alle patronen" de symmetrische patronen voor de triviale symmetrie (de identiteit = niets doen) zijn.

Nadat ik me deze intuitieve uitleg gerealiseerd had, kwam ik tot de conclusie dat het bewijs van Burnside's lemma, zoals dat in de groepentheorie gegeven wordt, precies op hetzelfde neerkomt:

|banen| · |symmetrieën| = åBÎbanen |symmetrieën| = åBÎbanen |B| · |symmetrieën van B| = åPÎpatronen |symmetrieën van P| = ågÎsymmetrieën g-symmetrische patronen.

De eerste gelijkheid is gewoon de definitie van vermenigvuldiging als herhaalde sommatie. Bij de tweede gelijkheid wordt gezegd dat het aantal elementen van een baan |B| gelijk is aan alle draaiingen/spiegelingen van het patroon gedeel door de dubbeltellingen. Voor de vierde vergelijking gebruiken we dat het aantal symmetrieën van elk patroon in een baan hetzelfde is. Bij de laatste gelijkheid draaien we de manier van tellen om: in plaats van per patroon de symmetrieën te bepalen, tellen we voor elke symmetrie de patronen die daaronder symmetrisch zijn. De essentiele stappen in dit bewijs zijn dus de tweede ongelijkheid, waarbij we de dubbeltellingen meenemen en de laatste gelijkheid waarbij we de manier van tellen eenvoudiger maken. Meestal is namelijk het aantal symmetrieën veel kleiner dan het aantal mogelijke patronen.

Toeliching op de matlab-routine's


Naar aanleiding van ons nadere email-contact ben ik ook de aantallen startend met m bij n vakjes na gaan rekenen, nu wel rekening houdend met verschuivingen. Zelfs als je gebruik maakt van Burnside's lemma is dat veel werk, waarbij makkelijk fouten gemaakt kunnen worden, omdat het aantal elementen van de transformatie-groep flink toeneemt door de extra verschuivingen die bekeken moeten worden. Gelukkig heb je een goede check als je het via Burnside's lemma doet: het resultaat moet natuurlijk wel een geheel getal zijn. Na met de hand tot 3x4 te zijn gekomen, werd het mij wat te veel toen ik na ruim een uur rekenen op de situatie voor 4x4 geen geheel getal kreeg en dus ergens een rekenfout had gemaakt.
Dus begon ik aan een matlab-routine die dat werk zou doen. Daarmee werd echter alleen het aantal onafhankelijke patronen bepaald, dus omdat ik dacht dat je ook wel geinteresseerd zou zijn welke patronen dat dan zijn, besloot ik ook nog een routine te schrijven die alle onafhankelijke patronen zou genereren. Vervolgens bedacht ik me dat deze routine's ook goed uit te breiden waren naar algemenere situatie's: als je de vierkanten niet vult met diagonalen, maar met verticale/horizontale strepen. Omdat die symmetrisch zijn onder spiegeling in een verticale as, levert dit andere patronen op. Ook zou het interessant zijn om bepaalde transformaties (bijvoorbeeld de spiegelingen) uit te kunnen zetten. Om een en ander goed te kunnen debuggen schreef ik vervolgens nog routines die de equivalentie van verschillende patronen kon onderzoeken.
In de komende sectie's zal ik de theorie en methodiek achter de verschillende matlab-routine's nog verder toelichten. Je kunt de routine's downloaden onderaan deze pagina.

Algemene opmerkingen en patronendemo

Binnen al deze routines gaat het dus op patronen die worden opgebouwd door tekens te plaatsen in een rechthoek van m bij n vakjes. Dit woord vervolgens periodiek voortgezet tot een patroon op het hele platte vlak. Dus m en n zijn in feite de periode van het patroon in verticale resp. horizontale richting. Tenslotte wil je patronen equivalent noemen als ze in elkaar overgaan onder draaiingen, spiegelingen of verschuivingen. Al deze transformatie's vormen een groep, waarvan je de voortbrengers kunt bepalen: een verschuiving x van een stapje naar boven, een verschuiving y van een stapje naar rechts, de spiegeling s in de verticale as en de draaiing d over een kwartslag rechtsom. Met deze 4 transformatie's kun je alle andere mogelijke transformatie's maken. Zo is spiegeling in de horizontale as te schrijven als sd2 = eerst twee keer een kwartslag draaien (dus 180 graden, oftewel puntspiegeling) en dan spiegelen in de verticale as. In mijn routines kun je voor een belangrijk deel zelf bepalen welke voortbrengers er gebruikt worden. Ook de afmetingen m en n zijn in te stellen, alsook de basiselementen waaruit de patronen worden opgebouwd.
Wat betreft de afmetingen m en n moet nog worden opgemerkt dat de situatie met m ongelijk aan n anders is dan wanneer m=n. Draaiing over een kwartslag is in dat geval niet goed meer gedefinieerd, omdat de rechthoek van m bij n dan niet in zichzelf overgaat, maar in een rechthoek van n bij m vakjes. Voor het uitgebreide patroon betekent dit dat het eerst verticaal periode m en horizontaal periode n had, maar na draaiing is dat omgekeerd. Er zijn echter ook "dubbel-periodieke" patronen waarvoor het wel goed gaat. Die hebben horizontaal en verticaal zowel periode m als periode n. In dat geval moet ook p=ggd(m,n) een periode zijn. In feite zijn het deze dubbelperiodieke patronen dus patronen op p bij p vakjes. Daarop kan d dan wel worden losgelaten, maar op de niet-dubbelperiodieke patronen mag d niets doen. Hetzelfde geldt voor spiegeling in een diagonaal. Ik heb de routines nu zo ingericht dat, als je draaiing d als voortbrenger opgeeft, dan wordt d alleen op dubbel-periodieke patronen toegepast, terwijl op de niet-dubbelperiodieke d2, puntspiegeling nog wel mogelijk is. Geef je echter d3 (draaiing over kwartslag 3x rechtsom = 1x linksom) op als voortbrenger, dan wordt ook puntspiegeling niet meegenomen op niet-dubbelperiodieke patronen.
Er zijn 6 mogelijke soorten basiselementen die je als vulling van de patronen kunt opgeven (voor zover ik het kan overzien dekt dit alle mogelijke locale symmetrie-eigenschappen, m.a.w. er zijn geen echt andere basiselementen meer mogelijk, tenminste als je je beperkt tot tweetallen basiselementen). Standaard zijn de diagonalen \ en / uit de oorspronkelijke vraag. Verder heb je de horizontaal/verticaal -|, kruizen en plussen x+ die symmetrisch zijn onder zowel s als d en vulling aangeduid met sz. De laatste gaan in elkaar over onder spiegeling s, maar zijn symmetrisch onder draaiing d. Dat laatste is niet waar voor s en z, maar wel voor een patroon met s (of z) en een kwartslag gedraaide s (of z) dwars door elkaar. Zonder hier enige politieke bijbedoelingen mee te hebben vrees ik dat een hakenkruis het bekendste voorbeeld is, maar je kunt ook denken aan een vierkant van vier aansluitende pijlen. Aan elke transformatie kun je een teken toekennen dat bepaalt of hij de basiselementen hetzelfde laat, of in zijn tegenhanger overvoert. De tekens van de voortbrengers van de groep van transformatie's worden dus bepaald door de keuze voor de basiselementen.
Tenslotte kun je ook < en > of M en W als basiselementen opgeven. Als je deze een kwarslag draait of spiegelt in een diagonaal, dan krijg je weer een andere vorm. Daarom mag je in mijn routines deze patronen alleen puntspiegelen en verticaal of horizontaal spiegelen. Waar de eerdere 4 basiselementen allemaal symmetrisch waren onder puntspiegeling, gaan deze in elkaar over onder puntspiegeling.

P.S. ik bedenk me nu dat ik nog een soort basiselement ben vergeten: degene die in elkaar overgaan onder diagonaalspiegeling, maar waarbij je niet horizontaal/verticaal mag spiegelen. Zoiets als J en G, of L en Ø. Ik denk dat ik dat nog ga toevoegen. Merk overigens op dat M/W op m bij n vakjes tot hetzelfde leidt als >/< op n bij m vakjes.

De patronen worden voorgesteld door getallen waarvan de binaire ontwikkeling het patroon bepaalt: een 0 in de ontwikkeling duidt op het ene basiselement, een 1 op de andere. Vervolgens worden de elementen op matlab's standaard-volgorde over de matrix van m bij n vakjes verdeeld (d.w.z. per kolom van boven naar beneden, beginnend bij de linker kolom).

Met de set aan routine's die er nu ligt kun je heel veel uitrekenen, maar dan is het wel handig om te weten hoe je ze aan moet roepen. Eerst wilde ik gewoon een scriptje schrijven dat voor een aantal voorbeelden laat zien hoe het werkt. Later bedacht ik me dat het mooier zou zijn om een menu-structuur te bieden waarmee de verschillende optie zouden worden aangestuurd. Daarbij zou ik dan aangeven welke programmas worden gebruikt en hoe. Ik had nog nooit eerder een Graphical User Interface geprogrammeerd, dus dit was een mooie aanleiding om het te leren. De demo, patronendemo (aan te roepen vanuit matlab's command-line met "patronendemo") biedt toegang tot bijna alle mogelijkheden van de routine's en schrijft telkens naar het Command Window wat de belangrijkste commando's zijn die hij gebruikt. Er zijn wel enkele beperkingen waarvan de belangrijkste zijn: de afmetingen zijn beperkt tot maximaal 10 bij 10 vakjes en bij (diag)equivpatronen kan je niet twee groepen patronen in een keer vergelijken. Bovendien is werken via de command-line sneller en je krijgt minder gauw geheugen-problemen. Door te kijken naar de commando's die patronendemo bij het uitvoeren van de verschillende taken uitvoert, zul je waarschijnlijk zelf wel kunnen uitvinden hoe je de routine's vanaf de command-line kunt gebruiken. Kijk anders ook naar het commentaar aan het begin van elke routine. Overigens hoef je vanaf de command-line niet altijd alle invoer-parameters op te geven. Er is veelvuldig sprake van default-waarden (overeenkomend met de vraag zoals die oorspronkelijk gesteld was).

aantalpatronen, bepaalcykels en cykellengtes

De routine aantalpatronen gebruikt Burnside's lemma om het aantal patronen uit te rekenen. Hij moet dus bij elke transformatie het aantal vaste punten (symmetrische patronen) uitrekenen. Dit doet hij door allereerst te bepalen op welke manier de vakjes verplaatst worden door de transformatie. Dan bepaalt hij hoeveel cykels deze permutatie heeft (vakjes die opeenvolgend in elkaar overgaan). Op elke cykel is de vulling van elk vakje bepaalt als je die van eentje weet. Het aantal symmetrische patronen is dus 2 tot de macht het aantal cykels. Daarbij is er nog een complicatie wanneer de transformatie een negatief teken heeft en een van de cykels een oneven is: in dat geval moet een vakje in die cykel zowel het ene basiselement zijn, als zijn tegenhanger; dat kan niet, dus in dat geval zijn er geen symmetrische patronen. De routine's bepaalcykels en cykellengtes worden door aantalpatronen gebruikt om de cykels (en hun lengte) te bepalen.
Een groot voordeel van Burnside's is dat, hoewel rekenfouten nog steeds kunnen voorkomen, er een goede check bestaat of je antwoord goed is: rekenfouten leiden meestal tot niet gehele antwoorden, dan weet je direct dat je je berekeningen nog eens na moet kijken.

bepaalpatronen en bepaalallebanen

Dit zijn de routine's waarmee alle onafhankelijke patronen worden bepaald. Bij bepaalallebanen wordt een lange lijst gemaakt met alle 2mn mogelijke patronen (als getallen weergegeven). Vervolgens loopt hij elk patroon in deze lijst af en transformeert deze. Het getransformeerde patroon wordt in de lijst vervangen door het patroon waaruit hij gemaakt is, zodat je na afloop een lijst hebt waaruit je voor elk mogelijk patroon precies kunt aflezen aan welk ander patroon (met een kleiner getal als representant) hij gelijk is. Dit is overigens precies hetzelfde als wat bepaalbanen doet beginnend met een willekeurige lijst van patronen. Als je alle dubbeltellingen eruit weggooit (met het matlab-commando "unique") hou je dus alle onafhankelijke patronen over. De tussenstap van het maken van een lijst met alle 2mn patronen kost echter heel veel geheugen en het gaat ook niet bepaald snel. Op mijn werk liep de computer al vast bij m=n=4, op mijn net nieuwe labtop, kon hij zelfs m=4, n=5 nog aan, maar het duurde wel erg lang. Als je alleen alle onafhankelijke patronen een keer wilt vinden, dan is bepaalpatronen een routine die veel minder geheugen kost en ook veel sneller is. Nog steeds is hij even bezig voor m=n=5, maar hij komt er nu wel uit...

tekenpatroon, patroongetal en schrijfpatronen

Je wilt natuurlijk ook weten hoe de patronen, gerepresenteerd door getallen, eruit zien. Daarvoor dient de routine tekenpatroon. Hier voer je een vector getallen in, en vermeld ook even wat de afmetingen m en n moeten zijn (anders weet hij niet hoe hij de getallen moet interpreteren) en de uitvoer is een string-array die de patronen weergeeft. Je hebt ook de optie om aan te geven dat hij een aantal kopieen van het basis-gebied van m bij n vakjes moet maken. De routine patroongetal doet precies het omgekeerde. Hier voer je een string-array van het patroon in en hij vertelt je welk getal je moet gebruiken om dat patroon te representeren. Als je hier de uitvoer van tekenpatroon in stopt dan krijg je dus de oorspronkelijke patroongetallen weer terug. De routine schrijfpatronen tenslotte bepaalt alle onafhankelijke patronen (met behulp van bepaalpatronen) en schrijft deze op een overzichtelijke manier weg naar het schem, of naar desgewenst naar het bestand dat je opgeeft. Als het bestand al bestaat dan vraagt hij je of je de uitvoer wilt toevoegen achter aan het bestaand bestand of dat je het wilt vervangen, of wilt afzien van uitvoer naar een bestand. Je kunt je antwoord op eventuele vragen van die strekking ook in code meegeven voorafgaand aan de bestandsnaam, zodat je matlab in stilte de resultaten een heleboel gevallen kunt laten uitvoeren, zonder dat je je er telkens mee moet bemoeien.

equivpatronen, diagequivpatronen en bepaalbanen

Deze routines testen of verschillende patronen feitelijk aan elkaar gelijk zijn. Bij (diag)equivpatronen geef je twee lijsten met patroongetallen en hij kijkt dan voor elk patroon in de eerste lijst of er een patroon is in de tweede lijst waaraan hij effectief gelijk is. De uitvoer is een logical array die vertelt of er een gelijkenis gevonden is en zo ja, met welk patroon uit de tweede lijst en welke transformatie je moet uitvoeren om van dat patroon uit de tweede lijst naar het patroon uit de eerste lijst te komen. Als er meerdere patronen in de tweede lijst zijn waaraan het patroon uit de eerste lijst gelijk is, dan wordt er toch maar één gegeven. Daarom maakt het uit in welke volgorde je de lijsten invoert. De routine equivpatronen is de basis die het daadwerkelijke werk doet, met diagequivpatronen kun je precies dezelfde uitvoer krijgen, maar hij geeft bovendien uitvoer naar het scherm.
Hiermee kun je nog niet zo makkelijk testen of er binnen een gegeven set van patronen ook nog equivalentie's voorkomen. Daartoe dient bepaalbanen. Hier voer je één lijst van patronen in. Hij vervangt dan elk patroon door het eerste patroon uit de lijst waaraan hij gelijk is. Als je daarna alle gelijke getallen schrapt (met het matlab-commando "unique") dan hou je dus de onafhankelijke patronen over. Merk op dat bepaalallebanen in feite precies ditzelfde doet, waarbij met de lijst met alle mogelijke patronen wordt begonnen. Bij bepaalbanen wordt er echter geen gebruik gemaakt van de wetenschap dat je met een geordende lijst van alle patronen begint, zodat het nog langzamer en geheugen-vretend is wanneer je deze procedure via bepaalbanen zou doen.

Downloaden van de matlab-routine's

Hieronder volgen de matlab-routines om te downloaden. De meeste routine's, waaronder aantalpatronen, bepaalpatronen en bepaalbanen zouden ook onder MATLAB Release 12 moeten werken. Ik weet echter dat equivpatronen ergens een optie gebruikt die pas onder Release 13 beschikbaar is. Daar valt overigens eventueel nog wel wat aan te doen.
Verder heb ik overal de volgende copyright notice aan toegevoegd:

% ============================================================
% Copyright notice:
% These MATLAB-routines have been developed by Guido Terra in answer to a question by Robert Nottrot raised through "www.wisfaq.nl".
% You are free to use, reproduce and distribute them for non-commercial use as long as this copyright notice is included verbatim.
% If you want to modify the code, send a copy of your changes to the author at "terra@nioz.nl".
% Moreover, you are strongly encouraged to contact me to report any bugs, mistakes and other errors.
% The routines have been written for MATLAB-release 13; at least one error is known to occur when using release 12.
% A complete set of files would contain the following 13 files:
% aantalpatronen.m, bepaalcykels.m, cykellengtes.m, bepaalpatronen.m, bepaalallebanen.m, bepaalbanen.m
% equivpatronen.m, diagequivpatronen.m, tekenpatroon.m, patroongetal.m, schrijfpatronen.m
% patronendemo.m, patronendemo.fig
% This ends the copyright notice.
% ============================================================

Met andere woorden: je mag deze routine's gebruiken, verspreiden en bewerken, maar hou mij daar dan wel van op de hoogte. Bovendien mag je de hierboven vermelde copyright notice niet verwijderen. Je kunt de bestanden afzonderlijk downloaden, of in een keer alles in een zip-file (slecht 83 Kb).

Berekenen van het aantal patronen met aantalpatronen en benodigdheden:

Bepalen van alle onafhankelijke patronen:

Uitvoer van de patronen en omrekening tussen patroongetal en het bijbehorende patroon:

Zoeken naar equivalentie tussen patronen:

De Graphical User Interface om alles op een eenvoudige manier te kunnen gebruiken:

Alles in een keer met de zipfile:

vierkantpatronen.zip

Enkele resultaten


Voor mensen die geen beschikking hebben over matlab om bovenstaande routine's te gebruiken, heb ik een aantal resultaten die met de programma's gevonden kunnen worden uitgevoerd in de volgende tekst-bestanden:
  • "patronen_diag_xysd.txt": De patronen bestaande uit diagonalen \ en /.
  • "patronen_horvert_xysd.txt": De patronen bestaande uit assen - en |.
  • "patronenkeerplus_xysd.txt": De patronen bestaande uit kruizen en plussen x en +.
  • "patronen_sz_xysd.txt": De patronen bestaande uit "hakenkruizen" s en z.
  • "patronen_linksrechts_xysd.txt": De patronen bestaande uit de elementen < en >.
  • "patronen_bovenonder_xysd.txt": De patronen bestaande uit de elementen M en W.

Als losse bestanden kon ik ze niet op de site plaatsen (waarschijnlijk omdat ze te groot zijn (een halve tot een hele Mb per stuk), dus heb ik alle zes bestanden samengevoegd in een enkele zip-file (die is nog maar 192 Kb groot):

resultaten.zip

Ik hoop dat je er veel plezier aan zult beleven.
Met vriendelijke groet,

Guido Terra

gt
Vragen naar aanleiding van dit antwoord? Klik rechts..!
dinsdag 9 maart 2004



home |  vandaag |  bijzonder |  gastenboek |  statistieken |  wie is wie? |  verhalen |  colofon

©2001-2024 WisFaq - versie 3