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