I NUMERI
1
2 Capitolo 1. I numeri
b cifre
2 01
8 01234567
16 0123456789ABCDEF
Quindi, generalizzando, un numero a ∈ R può essere espresso in base
b nella forma
n
X
a = ± (an an−1 an−2 . . . a1 a0 . a−1 a−2 . . .)b = ± ai bi
i=−∞
Secondo numero:
µ ¶ µ ¶ µ ¶
AE − A A4 41
0.AE16 = = =
F0 16 F0 16 60 10
Caso b2 = 10
Numero finito: Vi sono due possibili algoritmi per calcolare il valore
decimale (che potrebbe non essere finito) di un numero reale (finito)
espresso in base qualsiasi b1 :
1.1. Basi di numerazione 5
Vediamo un esempio:
110110.0012 =
= 54.12510
Numero periodico: Supponiamo ora che il numero espresso in base
b1 abbia parte frazionaria periodica. Come possiamo procedere per cal-
colare la parte frazionaria decimale, visto che essendo illimitata la parte
frazionaria in base b1 , non possiamo utilizzare nè la notazione posizionale
nè l’algoritmo di Horner? Possiamo far uso della regola di determinazione
della frazione generatrice decimale di un numero periodico in base qual-
siasi precedentemente indicata.
Vediamo qualche esempio:
Esempio 1
Convertiamo il numero 0.14 in base b2 = 10:
µ ¶ µ ¶ µ ¶
1 1 3
0.14 = = = = 0.310
3 4 3 10 9 10
Esempio 2
Convertiamo il numero 0.2D16 in base b2 = 10:
µ ¶ µ ¶ µ ¶
2D − 2 2B 43
0.2D16 = = = = 0.1791610
F0 16 F0 16 240 10
Esempio 3
Convertiamo il numero 4.315 in base b2 = 10:
µ ¶ µ ¶ µ ¶
431 − 43 333 93
4.315 = = = = 4.6510
40 5 40 5 20 10
Caso b1 = 10
Numero finito: Sia dato un numero decimale finito che si vuole con-
vertire in base b2 (e in tale base potrebbe essere non finito). Bisogna
anzitutto distinguere la parte intera dalla parte frazionaria ed operare in
modo differente:
1.1. Basi di numerazione 7
contigue indicano che tali cifre formeranno il periodo del numero con-
vertito; l’eventuale periodo viene individuato quando si trova un valore
da moltiplicare che sia già stato considerato e i due valori coincidenti
vengono indicati da un simbolo ◦ che li precede.
Esempio 1
Convertiamo il numero 967.7812510 in base b2 = 16:
Divisioni Quozienti Resti
967 ÷ 16 60 710 = 716 6
60 ÷ 16 3 1210 = C16
3 ÷ 16 0 310 = 316
Quindi
967.7812510 = 3C7.C816 = 3.C7C816 × 162
Esempio 2
Convertiamo il numero 93.62510 in base b2 = 2:
Divisioni Quozienti Resti
93 ÷ 2 46 1 6
46 ÷ 2 23 0
23 ÷ 2 11 1
11 ÷ 2 5 1
5÷2 2 1
2÷2 1 0
1÷2 0 1
Moltiplicazione Parti intere
0.625 ×2 = 1.25 1
0.25 ×2 = 0.5 0
0.5 ×2 = 1.0 1?
0.0
Quindi si ottiene
Esempio 3
Convertiamo il numero 20.02510 in base b2 = 2:
Esempio 4
Convertiamo il numero 7.7610 in base b2 = 7:
Caso generale
Non vi sono algoritmi particolari qualora b1 o b2 non siano uguali a 10.
In tale caso la conversione deve essere fatta in due tappe, passando at-
traverso la base 10 (ovvero b1 → 10 → b2 ).
La base 2 e le sue potenze sono molto utilizzate in informatica. Nel
caso in cui si debba passare dalla base 2 alla base 2k (o viceversa) esiste
una procedura pressochè immediata (senza dover passare per la base 10).
Quando la base considerata è 2k , per rappresentare le sue 2k −1 cifre sono
necessarie, in base 2, delle k-uple di cifre binarie. Ad esempio se b = 4 =
22 le cifre 0, 1, 2, 3 in tale base sono rappresentabili dalle 4 coppie binarie
(00)2 , (01)2 , (10)2 e (11)2 . Se b = 16 = 24 le cifre in tale base sono rappre-
sentabili dalle 16 quaterne binarie (0000)2 , (0001)2 , (0010)2 , . . . , (1110)2 e
(1111)2 .
Dato quindi un numero in base 2, per trasformarlo in base 2k è suffi-
ciente, a partire dal punto di radice, verso sinistra per la parte intera e
verso destra per la parte frazionaria (aggiungendo eventualmente gli zeri
necessari), raggruppare delle k-uple di cifre binarie e poi sostituire ad
esse la corrispondente cifra nella nuova base.
Ad esempio:
Convertiamo il numero 10001.1101110112 in base b2 = 16 = 24 :
|{z} 0001
0001 |{z} . 1101
|{z} 1101
|{z} 1000
|{z}
↓ ↓ ↓ ↓ ↓
1 1 . D D 8
e si ha
10001.1101110112 = 11.DD816 = 0.11DD816 × 162
Il procedimento inverso di passaggio da una base 2k alla base 2 è simi-
lare, ma in tal caso si costruiscono, a partire dalle cifre della base 2k , le
k-uple di cifre binarie.
Ad esempio:
Convertiamo il numero 21.6738 in base b2 = 2:
2 1 . 6 7 3
↓ ↓ ↓ ↓ ↓
z}|{ z}|{ z}|{ z}|{ z}|{
010 001 . 110 111 011
e si ottiene
21.6738 = 10001.1101110112 = 0.10001110111011 × 25
12 Capitolo 1. I numeri
e quindi
con a1 6= 0.
e viene detto esponente o caratteristica ed m viene detta mantissa.
1.1. Basi di numerazione 13
Sia a che a∗ sono valori molto grandi. Guardando gli errori assoluti
(che sono grandi), sembrerebbe che entrambe le approssimazioni non
fossero buone. L’errore relativo (ed il logaritmo), invece, mostrano come
la prima approssimazione sia accettabile. Si noti anche che gli errori
relativi di questo esempio coincidono esattamente con quelli dell’esempio
precedente.
Se consideriamo come approssimazione a∗ il valore ottenuto per tron-
camento o arrotondamento a t cifre della mantissa normalizzata si hanno
le seguenti relazioni
Errore assoluto:
εa = |a − a∗ | ≤ c × be−t
Errore relativo:
|a − a∗ |
εr = ≤ c × b1−t
|a|
1
con c = se si lavora per arrotondamento e c = 1 se si lavora per
2
troncamento.
1.2 Algoritmi
1.2.1 Conversione da base 10 a base b di un numero intero
Siano dati a ∈ Z (in base 10) e b ≥ 2. Si desidera convertire in base b il
valore assoluto di a. Applichiamo il procedimento delle divisioni ripetute
ad |a| ed otteniamo il seguente algoritmo.
16 Capitolo 1. I numeri
read a ∈ Z
read b ≥ 2
a = |a|
while a j6= 0k do
a
q=
b
r =a−q×b
print r
a=q
end while
¹ º
x
dove indica la parte intera della divisione tra x ed y. I resti in-
y
teri stampati, presi nell’ordine inverso (sostituendo eventualmente il cor-
rispondente simbolo per le basi b > 10), danno le cifre del numero con-
vertito in base b.
ed un punto x̄. Si vuole valutare P (x̄) ovvero il valore del polinomio nel
punto x̄.
Possiamo applicare l’espressione (1.1) ovvero calcolare
Xn
P (x̄) = αi x̄n−i
i=0
1.3 Esercizi
Esercizio 1.1 Si scriva un algoritmo per la conversione da base 10 a
base b della parte frazionaria di un numero.
Esercizio 1.2 Si scriva un algoritmo per la conversione da base b a base
10 della parte frazionaria di un numero, con l’algoritmo di Horner.
Esercizio 1.3 Sapendo che se P (x) = Q(x)(x − x̄) + r, allora P 0 (x) =
Q0 (x)(x − x̄) + Q(x) e quindi P 0 (x̄) = Q(x̄) si scriva un algoritmo che
calcoli il valore della derivata prima del polinomio P (x) nel punto x̄.
18 Capitolo 1. I numeri
Capitolo 2
19
20 Capitolo 2. Aritmetica del computer
± esponente mantissa
con b ≥ 2, 0 ≤ ai ≤ b − 1, a1 6= 0, L ≤ e ≤ U ed m∗b = a1 a2 a3 . . . at .
Quindi all’interno di un computer noi memorizziamo solamente i numeri
± e m∗b
zoom
Errore relativo:
|a − fl(a)| 1
εr = ≤ × b1−t = eps. (2.1)
|a| 2
Si ha anche
fl(a) = a (1 + ε2 )
con |ε2 | = εr ≤ eps.
± e∗ m∗
∗
con a∗ = ±(1.m∗ )2 × 2e −(2 −1) .
r−1
Per quanto riguarda il rango dei numeri reali normalizzati, presi in va-
lore assoluto, rappresentabili con tale standard, esso è compreso tra un
minimo amin = 2L ed un massimo amax = 2U (2 − 2−t ), dove L < 0 è
2.3. Rappresentazione IEEE 754 25
a∗ = ±(0.m∗ )2 × 2L
che sono, in valore assoluto, minori di amin .
Il numero reale denormalizzato più piccolo rappresentabile in valore as-
soluto diventa quindi 2L−t (in semplice precisione 1.40129846 × 10−45 ed,
in doppia precisione, 4.9406564584124654 × 10−324 ). Si veda ancora la
figura 2.1.
Relativamente alla precisione di macchina si ha
byte bit eps
4 32 fl(2−23 ) ' 1.19209290 × 10−7
8 64 fl(2−52 ) ' 2.2204460492503131 × 10−16
Nell’agosto del 2008 è stata pubblicata una revisione dello standard
IEEE 754-1985, chiamata IEEE 754-2008, che estende, completa e sosti-
tuisce la precedente versione.
2.4.1 Proprietà
Le operazioni su F non godono di tutte le proprietà delle corrispondenti
operazioni su R.
L’unica proprietà che resta valida è la proprietà commutativa ovvero
x⊕y = y⊕x
x⊗y = y⊗x
La proprietà associativa e la distributiva non sono più valide! Si ha infatti
x ⊕ (y ⊕ z) 6 = (x ⊕ y) ⊕ z
x ⊗ (y ⊗ z) 6= (x ⊗ y) ⊗ z
x ⊗ (y ⊕ z) 6 = (x ⊗ y) ⊕ (x ⊗ z)
x ⊗ (y ª z) 6 = (x ⊗ y) ª (x ⊗ z)
Anche altre proprietà risultano non più valide
(x ⊗ y) ® y =
6 x
(x ® y) ⊗ y = 6 x
(x ⊗ y) ® z = 6 (x ® z) ⊗ y
Relazione anomala. Un’altra violazione importante è data dalla cosid-
detta relazione anomala che sancisce la non unicità dell’elemento neutro
dell’addizione e della sottrazione (ovvero dello zero). Tale relazione può
essere cosı̀ espressa:
|fl(y)|
Se < eps, allora x ⊕ y = fl(x)
|fl(x)|
x ª y = fl(x).
Ciò accade quando x ed y hanno ordini di grandezza molto diversi.
28 Capitolo 2. Aritmetica del computer
1.5
((x+y)−x)/y
1
0.5
(x + y) − x
(2.2)
y
y + (x − x)
,
y
2.4.2 Errori
Consideriamo ora l’errore relativo, e cambiamo leggermente notazione.
Indichiamo
|x − fl(x)|
εr (x) =
|x|
per ogni x ∈ R.
Sia
|(x + y) − (x ⊕ y)|
ε⊕
r (x, y) = , con x, y ∈ R,
|x + y|
l’errore commesso nel calcolo della somma di due numeri. In modo simi-
lare si possono definire εª ⊗ ®
r (x, y), εr (x, y), εr (x, y).
È possibile dimostrare che solamente le operazioni macchina ⊗ e ® sono
stabili rispetto agli errori di arrotondamento, ovvero se εr (x) e εr (y) sono
piccoli, allora lo sono anche ε⊗ ®
r (x, y) ed εr (x, y). Un’operazione macchina
si dice stabile quando
Esempio 1
Sia x = 0.27531012 × 10−2 ed y = 0.35720021 × 104 .
Memoria Accumulatore
fl(x) = 0.27531012 × 10−2 → 0.2753101200000000 × 10−2 ×
fl(y) = 0.35720021 × 104 → 0.3572002100000000 × 104
fl(z) = 0.98340833 × 101 ← 0.0983408326791252 × 102
Esempio 2
Sia x = 0.57203146 × 10−1 ed y = 0.27001052 × 102 .
Memoria Accumulatore
fl(x) = 0.57203146 × 10−1 → 0.5720314600000000 × 10−1 /
fl(y) = 0.27001052 × 102 → 0.2700105200000000 × 102
fl(z) = 0.21185525 × 10−2 ← 2.118552491954754 × 10−3
2.4. Operazioni aritmetiche floating-point 31
Esempio 1
Sia x = 0.23487757 × 103 ed y = 0.56799442.
Memoria Accumulatore
fl(x) = 0.23487757 × 103 → 0.2348775700000000 × 103 +
fl(y) = 0.56799442 × 100 → 0.0005679944200000 × 103
fl(z) = 0.23544556 × 103 ← 0.2354455644200000 × 103
Memoria Accumulatore
fl(x) = 0.10000000 × 101 → 0.1000000000000000 × 101 +
fl(y) = 0.50000000 × 10−7 → 0.0000000050000000 × 101
fl(z) = 0.10000001 × 101 ← 0.1000000050000000 × 101
Esempio 4
Memoria Accumulatore
fl(x) = 0.56543287 × 100 → 0.5654328700000000 × 100 +
fl(y) = −0.56543285 × 100 → −0.5654328500000000 × 100
fl(z) = 0.20000000 × 10−7 ← 0.0000000200000000 × 100
semplice precisione
x y xªy x⊕y
123456789.0 123456788.0 8.0 246913568.0
123456789.0 123456790.0 0.0 246913584.0
0.56543451×106 0.21554623×10−4 565434.5 565434.5
1.0 0.5 × 10−6 0.999999523 1.00000048
0.5654328749876 0.5654328510104 0.0 1.13086569
0.3333333333 0.1111111111 0.222222239 0.444444448
doppia precisione
x y xªy x⊕y
123456789.0 123456788.0 1.0 246913577.0
123456789.0 123456790.0 −1.0 246913579.0
0.56543451×106 0.21554623×10−4 565434.509978 565434.510022
1.0 0.5 × 10−6 0.9999995 1.0000005
0.5654328749876 0.5654328510104 0.239772000032×10 −7 1.130865726
0.3333333333 0.1111111111 0.2222222222 0.4444444444
x10 -5
9
5
x_2
0
-6 -5.5 -5 -4.5 -4 -3.5 -3 -2.5 -2 -1.5 -1
valore di c x10 -5
Formule alternative
Vediamo ora alcuni esempi di espressioni che potenzialmente potrebbero
essere affette dall’errore di cancellazione. Semplici modifiche di tipo alge-
brico, ci permettono di considerare delle espressioni equivalenti che non
presentano tale problema.
Esempio 1
Sia |δ| << |x|.
√ √ δ
x+δ− x= √ √
x+δ+ x
Esempio 2
Sia |δ| << |x|.
µ ¶
δ δ
cos(x + δ) − cos(x) = −2 sin sin x +
2 2
Esempio 3
Sia |x| grande.
1 1 1
− =
x x+1 x(x + 1)
x = 100.0
y = −57.71428571 . . .
x = 125.0
y = −72.71428571 . . .
k∆rk k∆dk
≤ cond(P) ,
krk kdk
38 Capitolo 2. Aritmetica del computer
Z 1
1
In = xn ex dx con n ≥ 0
e 0
2.5. Stabilità e condizionamento 39
n I0n n I0n
2 2.6424110 × 10−1 12 −4.3109741 × 100
3 2.0727670 × 10−1 13 5.7042664 × 101
4 1.7089319 × 10−1 14 −7.9759729 × 102
5 1.4553404 × 10−1 15 1.1964959 × 104
6 1.2679577 × 10−1 16 −1.9143834 × 105
7 1.1242962 × 10−1 17 3.2544528 × 106
8 1.0056305 × 10−1 18 −5.8580148 × 107
9 9.4932556 × 10−2 19 1.1130228 × 109
10 5.0674438 × 10−2 20 −2.2260457 × 1010
11 4.4258118 × 10−1 21 4.6746960 × 1011
Diamo ora l’algoritmo stabile (noto come algoritmo di Miller) che co-
struisce la famiglia di integrali in senso regressivo, ovvero facendo de-
crescere gli indici.
Si fissa un indice N ∈ N (anche non troppo grande) con N > n, si pone
IN uguale ad un valore arbitrario qualsiasi, oppure a zero (commettendo
certamente un errore εN ) e si considera il seguente algoritmo ricorsivo
(
IN = a
1
Ii−1 = (1 − Ii ) , i = N, N − 1, . . . , 2
i
con a ∈ R arbitrario.
Si ha I00i = Ii + εi , e I00i−1 = Ii−1 + εi−1 . Quindi, dalla formula ricorsiva,
1
Ii−1 + εi−1 = (1 − Ii − εi ) ovvero
i
1
εi−1 = − εi
i
che è la relazione che lega l’errore per l’indice (i − 1), rispetto all’errore
per l’indice i.
Supponendo di aver commesso (assegnando il valore di partenza IN = a)
un errore εN = I00N − IN , avremo
1
εN −1 = − εN
N
1 (−1)2
εN −2 = − εN −1 = εN
N −1 N (N − 1)
.. ..
. .
(−1)N −1
ε1 = εN
N!
2.6. Analisi degli errori 41
i I00i i I00i
12 −7.6846153 × 101 6 1.2668674 × 10−1
11 6.4871793 × 100 5 1.4555222 × 10−1
10 −4.9883449 × 10−1 4 1.7088956 × 10−1
9 1.4988345 × 10−1 3 2.0727761 × 10−1
8 9.4457395 × 10−2 2 2.6424080 × 10−1
7 1.1319283 × 10−1 1 3.6787960 × 10−1
con |I01 − I001 | = 1.4901161 × 10−7 (I01 è l’approssimazione del valore esatto
I1 = e−1 ). Come si vede, pur partendo da un valore iniziale completa-
mente arbitrario, l’integrale I001 (approssimazione di I1 ) risulta essere ac-
curato per almeno 6 cifre significative decimali. Qualora l’errore |I01 − I001 |
fosse stato troppo elevato, ovvero maggiore di una certa tolleranza toll
prefissata, si aumenta il valore di N e si ripete il procedimento sino ad
ottenere la precisione desiderata.
Naturalmente i primi integrali calcolati, rispetto agli integrali esatti,
saranno affetti da un errore non trascurabile. Nella tabella precedente si
vede, ad esempio, che l’effetto di diminuzione dell’errore inizia solamente
nel calcolo di I008 . Ripetiamo il procedimento prendendo N = 20 ed ancora
I20 = 1000 e mostrando solo gli integrali a partire da I0012 .
i I00i i I00i
12 7.1773447 × 10−2 6 1.2680236 × 10−1
11 7.7352211 × 10−2 5 1.4553294 × 10−1
10 8.3877072 × 10−2 4 1.7089342 × 10−1
9 9.1612294 × 10−2 3 2.0727664 × 10−1
8 1.0093196 × 10−1 2 2.6424113 × 10−1
7 1.1238351 × 10−1 1 3.6787945 × 10−1
esponenziale
se εn ' cn ε0
2.7 Esempi
In questa sezione vogliamo fornire alcuni esempi tratti dalla letteratura
per illustrare maggiormente le varie problematiche, soprattutto quelle
relative alla precisione finita dell’aritmetica del computer.
2.7.1 Esempio 1
Spesso si ritiene che se un risultato calcolato con precisioni diverse resta
invariato, è obbligatoriamente ben calcolato. Questo esempio mostra che
tale convinzione è errata.
Sia da calcolare il valore di
a
333.75b6 + a2 (11a2 b2 − b6 − 121b4 − 2) + 5.5b8 + . (2.6)
2b
Per a2 − 1 = 11b2 /2 l’espressione vale analiticamente −2 + a/2b.
Consideriamo i valori a = 77617.0 e b = 33096.0 tali che a2 − 1 = 11b2 /2.
Calcolando numericamente l’espressione (2.6) si ottiene
Semplice precisione Doppia precisione Precisione estesa
0.5764607×1018 0.5764607523034235×1018 0.57646075230342350345×1018
Tuttavia il risultato con tali valori dovrebbe essere
−2 + a/2b = −0.82739605994682 . . .
I risultati in tale problema dipendono fortemente anche dal computer su
cui si lavora e dal modo in cui si programma la formula. Infatti, su di un
altro computer si è ottenuto circa −9.87 × 1029 in semplice precisione, e
circa −1.18 × 1021 in doppia precisione!
2.7.2 Esempio 2
Consideriamo il polinomio
x3 − 111x2 + 1130x − 3000.
Le sue radici sono 5, 6 e 100. È possibile dimostrare che la successione
1130 3000
xn+1 = 111 − + , n = 0, 1, . . .
xn xn xn−1
converge a 6 se si prendono come valori iniziali
11 61
x−1 = = 5.5 e x0 = = 5.54
2 11
44 Capitolo 2. Aritmetica del computer
200
100
n −100
−200
x
−300
−400
−500
−600
0 5 10 15 20 25
n
1130 3000
Figura 2.4: xn+1 = 111 − +
xn xn xn−1
2.7.3 Esempio 3
Consideriamo la seguente successione che converge al valore x = 1
x0 = 1.510005072136258
3x4n − 20x3n + 35x2n − 24
xn+1 = , n = 0, 1, . . .
4x3n − 30x2n + 70xn − 50
A seconda del numero di cifre decimali k utilizzate nei calcoli, si otten-
gono risultati molto diversi.
2.7. Esempi 45
k Valore di convergenza
10 4.000000033
12 1.00000000000
14 3.0000000000000
16 4.000000000000033
18 1.00000000000000000
2.7.4 Esempio 4
Si consideri il seguente schema iterativo
x0 passegnato
y0 = 1 − x20
t0 = x20 + y02 = 1
xn+1 = 2xn yn
yn+1 = x2n − yn2 per n = 0, 1, . . .
tn+1 = x2n+1 + yn+1
2
2.7.5 Esempio 5
Consideriamo la successione {xn } calcolata come
xn+1 = 2.25 xn − 0.5 xn−1 , n = 2, 3, . . . (2.7)
con x1 e x2 assegnati. La teoria delle equazioni alle differenze lineari
omogenee, a coefficienti costanti, ci dice che
xn = a 0.25n + b 2n , n = 1, 2, . . . (2.8)
dove a e b sono delle costanti i cui valori sono determinati da x1 e x2 .
Se noi prendiamo x1 = 1/3 e x2 = 1/12, si ha a = 4/3 et b = 0. Di
46 Capitolo 2. Aritmetica del computer
2.4
2.2
1.8
1.6
t_n
1.4
1.2
0.8
0.6
0 5 10 15 20 25
10 9
10 6
10 3
10 0
10 -3
10 -6
10 -9
10 -12
0 10 20 30 40 50 60 70
2.8 Algoritmi
2.8.1 Stima di eps
Un semplice algoritmo (dovuto a Cleve Moler) per la stima del valore
eps è il seguente:
x = 4.0/3.0
y = x − 1.0
z =y+y+y
eps = |z − 1.0|
if a = 0 then
if b = 0 then
if c = 0 then
print Equazione indeterminata
else
print Equazione impossibile
end if
else
x1 = −c/b
print Equazione di grado 1 (unica soluzione x1 )
end if
else
∆ = b2 − 4ac
if ∆ < 0 then
print Nessuna soluzione reale
else if ∆ = 0 then
print Due soluzioni coincidenti (x1 = x2 )
x1 = −b/(2a)
x2 = x1
else
print Due soluzioni
√ distinte (x1 6= x2 )
x1 = (−b − √∆)/(2a)
x2 = (−b + ∆)/(2a)
end if
end if
2.9. Esercizi 49
2.9 Esercizi
Esercizio 2.1 Si scriva un algoritmo ed il relativo programma che, dati
amin e amax , calcoli il primo numero positivo a ∈ F che sia maggiore di
amin , ed il primo numero positivo a ∈ F che sia minore di amax , sia in
semplice che in doppia precisione..
for i = 1, . . . , n
read xi
end for
somma = x1
for i = 2, . . . , n
somma = somma + xi
end for
print somma
Esercizio 2.3 Si scriva un algoritmo per il calcolo del valore reale della
seguente espressione (algebricamente uguale ad 1 per ogni valore di n),
senza effettuare alcuna semplificazione:
Ãs !2
n n−1 n − (n − 2) n − (n − 1)
× × ··· × ×
n−1 n−2 n − (n − 1) 1
n−1 n−2 n − (n − 1) 1
× × × ··· × × .
n n−1 n − (n − 2) n − (n − 1)