Ruote cifranti - Dipartimento di Matematica
Transcript
Ruote cifranti - Dipartimento di Matematica
Ruote cifranti Ottavio G. Rizzo Sommario 1.2 Nel seguito supporremo di avere a nostra disposizione un terminale su una macchina Unix e una versione recente di texlive (almeno quella del 2007). Se i nostri comandi sono raccolti in un file di nome pippo.mp, invochiamo METAPOST col comando mpost pippo. Per default, METAPOST crea dei file chiamati pippo.1, pippo.2, ecc. Il formato di questi file è, come detto, Postscript incapsulato, ma non possono essere visualizzati direttamente1 . Se stiamo utilizzando LATEX per creare un .dvi, possiamo includere direttamente le immagini utilizzando il pacchetto graphics ed il comando \includegraphics{pippo.1} Purtroppo, se stiamo usando pdftex, non possiamo includere direttamente un file con questo nome, per cui dobbiamo ribattezzare pippo.1 in pippo-1.mps2 per poterlo inserire col comando \includegraphics{pippo-1}3 Fortunatamente, le versioni più recenti di METAPOST permettono di scegliere il nome dei file creati; le prime righe del nostro programma METAPOST saranno dunque: Mostriamo come grazie alla programmabilità di METAPOST è possibili creare facilmente semplici figure. 1 Introduzione Esistono molti programmi per creare immagini vettoriali, la maggior parte di questi interattivi: l’utente dispone, idealmente usando una tavoletta grafica, dei punti all’interno di una finestra, li collega creando delle linee curve, li sposta finché non ottiene l’effetto desiderato. Nelle mani adatte, un simile strumento può creare qualsiasi immagine; ma l’interattività rende complicato creare figure che dipendono dalla scelta di alcuni parametri. METAPOST è un linguaggio di programmazione — e in quanto tale rende facile creare oggetti parametrizzati — specializzato nella creazione di immagini: creato da John Hobby (1992), è basato su METAFONT, il linguaggio creato da Donald Knuth (1986) per disegnare caratteri tipografici, ma invece di creare un file di caratteri bitmap, emette una serie di file in Postscript incapsulato (Adobe System Inc., 1999). 1.1 Dettagli pratici if known mpversion: filenametemplate "%j-%c.mps"; 3fi 1 2 Leon Battista Alberti Nella storia della crittografia, Leon Battista Alberti (1404-1472) occupa un posto di rilievo: fu il primo, infatti, a proporre l’uso di più chiavi di cifratura all’interno dello stesso messaggio (Kahn, 1996). L’Alberti creò una «macchina cifrante» composta da due ruote concentriche: fissata una posizione iniziale, si fa corrispondere un carattere sulla ruota esterna ad uno sulla ruota interna (una semplice cifratura per sostituzione); dopo un numero fissato di caratteri, però, si fa ruotare la ruota esterna di una posizione; in questo modo ogni parte di messaggio viene cifrata con una chiave diversa, rendendo più ardua l’interpretazione del messaggio cifrato. Queste ruote sono state utilizzate in un laboratorio di crittografia che l’autore ha tenuto in alcuni licei milanesi all’interno del progetto Lauree Scientifiche (Rizzo, 2007); le stesse ruote possono anche essere utilizzate per spiegare l’aritmetica modulare (volgarmente detta «dell’orologio»). Lo scopo di questo articolo è spiegare come realizzare concretamente delle ruote usando METAPOST. 2 Disegniamo la prima ruota Incominciamo col disegnare direttamente una ruota con le 26 lettere dell’alfabeto. Ogni immagine è delimitata dalla coppia beginfig/endfig; l’argomento della prima istruzione è un numero compreso fra 1 e 255.4 Non è necessario dichiarare le variabili numeriche. 4 beginfig(1); 1. Il punto è che non includono i font che utilizzano, quindi sono utilizzabili direttamente solo da un programma, come dvips o pdftex, che sappia dove andarli a trovare. Se digitiamo mptopdf pippo.1 otteniamo un file di nome pippo-1.pdf che possiamo visualizzare facilmente: vedi anche Henderson (2005) 2. Usiamo l’estensione .mps e non .eps perché in realtà pdftex non è in grado di gestire un generico file in Postscript incapsulato, anche se può comprendere il particolare sottoinsieme del linguaggio generato da METAPOST. 3. A questo punto, però, se TEX è in modalità .dvi non è più in grado di riconoscere l’estensione .mps: occorre o specificare il nome completo pippo-1.mps, oppure utilizzare opportunamente il comando DeclareGraphicsExtensions: se qualcuno pensa che la situazione è confusa. . . ha perfettamente ragione! 4. Questo numero sostituisce l’espressione %c della riga 2. 1 ArsTEXnica Nº 0, Dicembre 2099 5 6 Ruote cifranti theta = −360/26; r1 = 2.5cm; r2 = 3.5cm; 19 Ora arriviamo al nucleo della figura: per prima cosa disegniamo due cerchi di diametro 2r1 e 2r2 – notiamo che METAPOST interpreta correttamente il prodotto – ed un disco pieno nel centro5 : 7 8 9 def disco(expr r, R, n)(text t) = draw fullcircle scaled 2r; 20 draw fullcircle scaled 2R; 21 fill fullcircle scaled 2mm; 22 begingroup 23 save line, theta; 24 path line; 25 line = (0,R)--(0,r); 26 theta = −360/n; 27 for i = 0 upto n−1: 28 draw line 29 rotated ((i+1/2)∗theta); 30 label(t(i), (0,.5[r,R])) 31 rotated (i∗theta); 32 endfor 33 endgroup 34enddef; 18 draw fullcircle scaled 2r1; draw fullcircle scaled 2r2; fill fullcircle scaled 2mm; Disegniamo infine le ventisei caselle: l’espressione draw ((0,r1)--(0,r2)) disegna il segmento di estremità (0, r1 ) e (0, r2 ), ruotato dell’angolo opportuno; l’etichetta viene composta dall’istruzione label che richiede due argomenti: l’etichetta stessa6 ed il punto in qui va messa. L’espressione .5[r1,r2] rappresenta il punto medio del segmento r1 r2 : in generale t[r1,r2] sta per il punto r1 + t(r2 − r1 ). Notiamo infine che l’intera etichetta è stata ruotata: cosa succederebbe a ruotare il solo punto? Nella riga 18 definiamo gli argomenti della funzione disco, tre di tipo expr ed uno di tipo text; mentre i primi sono delle espressioni valutate nel momento in cui vengono passate alla funzione, l’ultimo viene passato senza essere espanso. L’istruzione save definisce line e theta come variabili locali al gruppo definito dalla coppia begingroup/endgroup. Definiamo ora due funzioni asc e Asc, dove la coppia btex/etex delimita un argomento che viene composto da TEX.7 for i = 0 upto 25: draw ((0,r1)--(0,r2)) 12 rotated ((i+1/2)∗theta); 13 label(char(ASCII"A" + i mod 26), 14 (0, .5[r1,r2])) 15 rotated (i∗theta); 16 endfor 17endfig; 10 11 def asc(expr i) = if i = 0: 37 btex $\sin x \over x$ etex 38 else: 39 char(ASCII"a" + i − 1) 40 fi 41enddef; 42def Asc(expr j, i) = 43 if (i + j) mod 27 = 0: 44 btex $\forall$ etex 45 else: 46 char(ASCII"A" + (i+j−1 ) mod 27) 47 fi 48enddef; 35 Y Z A 36 B C F U E V D W X T G R S H J Q I K L Possiamo ora definire due cerchi concentrici: la riga 51 garantisce che il cerchio interno sia contiguo a quello esterno e dello stesso spessore. Nella riga 52 la funzione compare come Asc(4): nell’espansione della macro disco alla riga 30 comparirà Asc(4)(i) al posto di t(i); ma questa espressione è equivalente a Asc(4,i) per cui METAPOST disegnerà l’ultima rotella ruotata di quattro posizioni. M N O P Figura 1: alberti-1 3 Macro È ora di creare una macro per disegnare le prossime ruote: decidiamo di usare come parametri il raggio interno ed esterno, la quantità di caselle, ed una funzione che disegni la casella. beginfig(2) disco(r1, r2, 26)(asc); 51 r1 = .5[r2,r0]; 5. In realtà anche l’espressione r1 = 2.5cm nasconde un 52 disco(r0, r1, 13)(Asc(4)); prodotto, dove cm sta per 28.34645: l’unità di misura di 53endfig METAPOST è il punto PostScript 72bp = 1in. 49 50 6. Il lettore attento noterà che la sintassi, per quanto ovvia, è lievemente diversa da quella dei linguaggi moderni: il capitolo 8 di Knuth (1986) è il riferimento definitivo. 7. È possibile istruire METAPOST ad usare qualsiasi altro programma, da LATEX a groff. 2 ArsTEXnica Nº 0, Dicembre 2099 Ruote cifranti z y t u ∀ X Y Z V W h U g s f r e I J K L M N i j O k P Q R S l m n T o q d H p La stretta integrazione con TEX offerta dalla costruzione btex/etex è una delle caratteristiche più importanti di METAPOST; purtroppo, però, il testo così delimitato viene passato verbatim a TEX, rendendo impossibile usare variabili o macro. Un modo per risolvere questo inconveniente è offerto dal pacchetto latexmp: l’argomento di textext viene salvato su disco e poi incluso. Il processo è totalmente trasparente per l’utente, tranne il fatto di dover eseguire due volte METAPOST. input latexmp; setupLaTeXMP(packages = 56"fourier[oldstyle],amsmath"); 57def modulare(expr n, i) = 58 textext("$" & decimal(i mod n) & 59 "\bmod " & decimal(n) & "$") 60enddef; 61beginfig(3) 62 disco(r0,r1,10)(modulare(5)); 63 disco(r1,r2,10)(modulare(10)); 64endfig; 54 55 66 Creaimo ora due rotelle separate: beginfig(4) disco(r1, r2, 24)(Alberti); 88 z1 = (r2+r1)∗dir 70; 89 currentpicture := currentpicture 90 shifted z1; 91 disco(r1, r0, 24)(alberti); 92endfig; 86 87 od 1m Queste rotelle vanno stampate (preferibilmente su cartoncino), tagliate, bucate nel mezzo, e unite con un fermacampione. Oltre ad essere un valido strumento didattico, possono anche essere un buon metodo per tenere buoni per un pomeriggio dei bambini (sperimentato su due bimbe seienni molto vivavi). 7 mod 10 10 2 mod 10 3 m 10 od 10 5 2 mod 5 3 m od 5 od 1m 0 0 mo d 10 od 1 9m 0 od 5 mod 5 4m 8m od 10 5 2 mod 5 3 m od od 5 1m vardef Alberti(expr i) = begingroup 67 save j; 68 j := i 69 if i > 6: +1 fi 70 if i > 7: +2 fi 71 if i > 17: +2 fi 72 if i > 18: +1 fi; 73 char( 74 if i <20: ASCII"A" + j 75 else: ASCII"1" + i −20 76 fi 77 ) infont "pzcmi8r" 78 endgroup 79enddef; 80string s; 81s = "&bmdgpfznxyutoskerlhaiqc"; 82def alberti(expr i) = 83 substring(i, i+1) of s 84 infont "pzcmi8t" 85enddef; 65 Figura 2: alberti-2 od 5 4m Riferimenti bibliografici Adobe System Inc. (1999). postscript Language Reference. Addison-Wesley, Reading, Mass., 3ª edizione. URL http://partners.adobe. com/public/developer/en/ps/PLRM.pdf. 0 5 mo d 10 od 1 4m 0m od 5 od 6m Terminiamo mostrando come creare le ruote originali di Alberti. Per prima cosa definiamo le due macro che compongono le etichette: poiché l’alfabeto in chiaro dell’Alberti include quattro cifre (usate per codificare un cifrario), sono state eliminate una serie di lettere «inutili»; in questo codice usiamo pesantemente il fatto che le espressioni condizionali vengano espanse nelle «bocca» di METAPOST. L’istruzione infont nella riga 77 impone l’uso di un carattere diverso da quello predefinito: l’argomento dev’essere un file in formato .tfm. b B C D E F A G v a c w x sin x x Henderson, T. (2005). «Embedding fonts in metapost output». TUGboat, 26 (3), pp. 250–252. Figura 3: alberti-3 3 ArsTEXnica Nº 0, Dicembre 2099 A 4 3 B 2 Ruote cifranti C E Z 1 D I T G U X F S L M O R Q P c & b m d a q N i h g l p r f n k e z x y u t o s Figura 4: alberti-4 Hobby, J. D. (1992). «A user’s manual for MetaPost». Computing Science Technical Report no. 162, AT&T Bell Laboratories, Murray Hill, New Jersey. URL doc/metapost/base/mpman. pdf. Kahn, D. (1996). The Codebreakers. Scribner, New York, 2ª edizione. Knuth, D. E. (1986). The METAFONTbook. Addison Wesley, Reading, Massachusetts. Volume C of Computers and Typesetting. Rizzo, O. G. (2007). «Progetto lauree scientifiche. crittografia». URL http://www.mat.unimi.it/ ~labls/. . Ottavio G. Rizzo Dipartimento di matematica, Università di Milano, Via Saldini 50, 20133 Milano, Italia [email protected] 4