Algorithmen zur Berechnung der Smith-Normalform und deren ...
Algorithmen zur Berechnung der Smith-Normalform und deren ...
Algorithmen zur Berechnung der Smith-Normalform und deren ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Algorithmen</strong> <strong>zur</strong> <strong>Berechnung</strong> <strong>der</strong><br />
<strong>Smith</strong>-<strong>Normalform</strong> <strong>und</strong> <strong>der</strong>en Implementation<br />
auf Parallelrechnern<br />
Gerold Jäger<br />
Institut für Experimentelle Mathematik<br />
Ellernstraße 29<br />
45326 Essen<br />
27. Juli 2001
1 Einführung<br />
Sei R im folgenden entwe<strong>der</strong> <strong>der</strong> Ring <strong>der</strong> ganzen Zahlen Z<br />
o<strong>der</strong> ein Polynomring F[x] über einem Körper.<br />
Für R = Z ist<br />
<strong>und</strong> für R = F[x]<br />
R := N0<br />
R := Normierte Polynome über F[x]<br />
ein Repräsentantensystem bzgl. <strong>der</strong> Äquivalenzrelation<br />
Assoziiertheit.<br />
1
1.1 Hermite-<strong>Normalform</strong><br />
Definition 1.1.1 Eine Matrix A ∈ R m,n ist in Hermite-<br />
<strong>Normalform</strong> (HNF), wenn gilt:<br />
a) Die Matrix ist in unterer Treppenform.<br />
b) Die Pseudodiagonalelemente liegen in R \ {0}.<br />
c) Die Elemente links von den Pseudodiagonalelementen<br />
liegen in N0 <strong>und</strong> sind kleiner als das entsprechende<br />
Pseudodiagonalelement (R = Z) bzw. <strong>der</strong>en Grad ist<br />
kleiner als <strong>der</strong> Grad des entsprechenden Pseudodiagonalelements<br />
(R = F[x]).<br />
Die Matrix A ist in Zeilen-Hermite-<strong>Normalform</strong><br />
(LHNF), wenn ihre Transponierte A T in HNF ist.<br />
Beispiele:<br />
⎛<br />
⎜<br />
⎝<br />
R = Z<br />
⎞<br />
4 0 0 0<br />
⎟<br />
5 6 0 0 ⎟<br />
−3 2 0 0 ⎠<br />
R = F3[x]<br />
⎛<br />
x<br />
⎜<br />
⎝<br />
3 4 7 0<br />
2 + 1 0 0<br />
2x<br />
0<br />
2 + x x3 + 1 0<br />
2x<br />
0<br />
4 x5 + 2 x6 + x2 0<br />
x2 x + 1 2 x5 + x<br />
2<br />
⎞<br />
⎟<br />
⎠
Satz 1.1.2 (Hermite) Sei A ∈ R m,n . Dann gibt es eine<br />
Matrix V ∈ GLn(R), so daß H = AV in HNF ist. Die<br />
Matrix H ist durch A eindeutig bestimmt.<br />
Satz 1.1.3 (Chou, Collins)<br />
Sei A ∈ Rm,n <strong>und</strong> p = max{m, n}. Dann gibt es einen<br />
HNF-Algorithmus, <strong>der</strong><br />
a) für R = Z O(p6 log 2 2(p�A�∞)) Bitoperationen benötigt.<br />
b) für R = F[x] O(p6⌈A⌉2 deg ) Körperoperationen benötigt.<br />
3
1.2 <strong>Smith</strong>-<strong>Normalform</strong><br />
Definition 1.2.1 Eine Matrix A ∈ R m,n mit Rang r ist<br />
in <strong>Smith</strong>-<strong>Normalform</strong> (SNF), wenn gilt:<br />
a) A ist eine Diagonalmatrix.<br />
b) Ai,i ∈ R \ {0} für 1 ≤ i ≤ r.<br />
c) Ai,i | Ai+1,i+1 für 1 ≤ i ≤ r − 1.<br />
d) Ai,i = 0 für r + 1 ≤ i ≤ min{m, n}.<br />
Satz 1.2.2 Sei A ∈ R m,n . Dann gibt es Matrizen U ∈<br />
GLm(R) <strong>und</strong> V ∈ GLn(R), so daß C = UAV in SNF<br />
ist. Die Matrix C ist durch A eindeutig bestimmt.<br />
Definition 1.2.3 a) Die Diagonalelemente d1, · · · , dr<br />
von C heißen die Elementarteiler.<br />
b) Die Matrizen U, V heißen die linke <strong>und</strong> die rechte<br />
Transformationsmatrix <strong>zur</strong> <strong>Smith</strong>-<strong>Normalform</strong>.<br />
4
2 <strong>Algorithmen</strong> <strong>zur</strong> <strong>Berechnung</strong><br />
<strong>der</strong> <strong>Smith</strong>-<strong>Normalform</strong><br />
Das folgende bekannte Lemma ermöglicht es, einen beliebigen<br />
Eintrag einer Matrix zu Null zu machen.<br />
Lemma 2.0.1 Seien a, b ∈ R, nicht beide Null. Sei d =<br />
ggT (a, b) ∈ R, u, v ∈ R mit d = au+bv, s = a<br />
d<br />
Sei weiter<br />
Dann gilt:<br />
a) V ∈ GL2(R).<br />
b) (a, b) V = (d, 0).<br />
V =<br />
� u −t<br />
v s<br />
5<br />
�<br />
<strong>und</strong> t = b<br />
d .
2.1 Algorithmus von Havas, Holt <strong>und</strong><br />
Rees<br />
Schritt 1: Sei A ∈ R m,n . Für 1 ≤ l ≤ min{m, n} seien die<br />
ersten l−1 Zeilen <strong>und</strong> Spalten schon in Diagonalform. Transformiere<br />
die Matrix, so daß in <strong>der</strong> l-ten Zeile die Einträge<br />
ab Spalte l + 1 Null sind. Dann transformiere die Matrix so,<br />
daß in <strong>der</strong> l-ten Spalte die Einträge ab Zeile l + 1 Null sind.<br />
Führe diese beiden Schritte durch, bis auch die l-te Zeile <strong>und</strong><br />
Spalte in Diagonalform ist.<br />
Schritt 2: Wandle die Diagonalform mit einem elementaren<br />
Algorithmus in die <strong>Smith</strong>-<strong>Normalform</strong> um.<br />
6
Beschreibung von Schritt 1 am Beispiel einer<br />
(4 × 4)-Matrix<br />
⎛<br />
⎞ ⎛<br />
⎞<br />
18 12 24 42<br />
⎜<br />
⎟<br />
⎜ 7 9 7 3 ⎟<br />
⎜<br />
⎟<br />
⎝ 10 12 7 10 ⎠<br />
⇒<br />
6<br />
⎜ −2<br />
⎜<br />
⎝ −2<br />
0<br />
13<br />
16<br />
0<br />
15<br />
15<br />
0<br />
17<br />
24<br />
⎟<br />
⎠<br />
4 −6 9 10<br />
10 −26 −31 −60<br />
⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
2 −13 −15 −17<br />
0 39 45 51<br />
0 3 0 7<br />
0 39 44 25<br />
1 0 0 0<br />
0 78 −540 −612<br />
0 6 −45 −44<br />
0 78 −541 −638<br />
⎞<br />
⎟<br />
⎠ ⇒<br />
⎞<br />
⎟<br />
⎠<br />
⎛<br />
⎜<br />
⎝<br />
⇒ · · ·<br />
7<br />
1 0 0 0<br />
−39 78 −540 −612<br />
−3 6 −45 −44<br />
−39 78 −541 −638<br />
⎛<br />
⎜<br />
⎝<br />
1 0 0 0<br />
0 1 0 0<br />
0 0 2 0<br />
0 0 0 3630<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠ ⇒
2.2 Algorithmus von Kannan <strong>und</strong> Bachem<br />
Schritt 1: Führe an <strong>der</strong> Matrix solange abwechselnd HNF<strong>und</strong><br />
LHNF-<strong>Berechnung</strong>en durch, bis die Matrix in Diagonalform<br />
ist.<br />
Schritt 2: Wandle die Diagonalform mit einem elementaren<br />
Algorithmus in die <strong>Smith</strong>-<strong>Normalform</strong> um.<br />
8
Beschreibung von Schritt 1 am Beispiel einer<br />
(4 × 4)-Matrix<br />
⎛<br />
⎞<br />
2100 −2100 6300 4200<br />
⎜<br />
⎟<br />
⎜ 600 630 570 −30 ⎟<br />
⎜<br />
⎟<br />
⎝ 420 −376 1216 796 ⎠<br />
90 −60 42 51<br />
⇒<br />
⎛<br />
⎞<br />
2100<br />
⎜ 600<br />
⎜<br />
⎝ 420<br />
0<br />
1230<br />
44<br />
0<br />
0<br />
0<br />
0<br />
⎟<br />
0 ⎟<br />
0 ⎠<br />
90 30 99 0<br />
⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
30 0 693 0<br />
0 2 594 0<br />
0 0 990 0<br />
0 0 0 0<br />
3 0 0 0<br />
0 2 0 0<br />
0 0 9900 0<br />
0 0 0 0<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
9<br />
⇒<br />
⎛<br />
⎜<br />
⎝<br />
3 0 0 0<br />
0 2 0 0<br />
990 0 9900 0<br />
0 0 0 0<br />
⎞<br />
⎟<br />
⎠ ⇒
2.3 Dreiecksbandmatrix-Algorithmus<br />
Schritt 1: Führe an <strong>der</strong> Matrix A ∈ R m,n mit Rang r eine<br />
HNF-<strong>Berechnung</strong> durch.<br />
Schritt 2: Transformiere A, so daß die (r × r)-Teilmatrix<br />
(Ai,j)1≤i,j≤r vollen Rang hat, <strong>und</strong> alle Einträge außerhalb<br />
dieser Teilmatrix Null sind. Die Einträge außerhalb dieser<br />
Teilmatrix bleiben auch im Rest des Algorithmus Null.<br />
Schritt 3: Wandle die Matrix in eine obere Dreiecksbandmatrix<br />
um.<br />
Schritt 4: Wandle die obere Dreiecksbandmatrix in eine<br />
Diagonalform um.<br />
Schritt 5: Wandle die Diagonalform mit einem elementaren<br />
Algorithmus in die <strong>Smith</strong>-<strong>Normalform</strong> um.<br />
10
Beschreibung <strong>der</strong> Schritte 1 <strong>und</strong> 2 am Beispiel<br />
einer (4 × 4)-Matrix<br />
⎛<br />
⎞ ⎛<br />
⎞<br />
7 7 28 21<br />
⎜<br />
⎟<br />
⎜ 31 −29 34 3 ⎟<br />
⎜<br />
⎟<br />
⎝ 23 −25 20 −3 ⎠<br />
Schritt 1<br />
⇒<br />
7 0 0 0<br />
⎜<br />
⎟<br />
⎜ 1 30 0 0 ⎟<br />
⎜<br />
⎟<br />
⎝ −1 24 0 0 ⎠<br />
5 3 22 12<br />
4 1 5 0<br />
⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
7 0 0 0<br />
1 30 0 0<br />
4 1 5 0<br />
−1 24 0 0<br />
1 0 0 0<br />
2 6 0 0<br />
4 1 5 0<br />
0 0 0 0<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⇒<br />
11<br />
⎛<br />
⎜<br />
⎝<br />
7 0 0 0<br />
2 6 0 0<br />
4 1 5 0<br />
−9 0 0 0<br />
⎞<br />
⎟<br />
⎠ ⇒
Beschreibung von Schritt 3 am Beispiel einer<br />
(4 × 4)-Matrix<br />
⎛<br />
⎞<br />
3 0 0<br />
⎜ 8 12 0<br />
⎜<br />
⎝ 12 10 16<br />
0<br />
⎟<br />
0 ⎟<br />
0 ⎠<br />
18 8 2 20<br />
⇒<br />
⎛<br />
⎞<br />
3<br />
⎜ 8<br />
⎜<br />
⎝ 6<br />
0 0 0<br />
⎟<br />
12 0 0 ⎟<br />
−2 −14 20 ⎠<br />
0 −14 −44 40<br />
⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
3 0 0 0<br />
8 12 0 0<br />
6 −2 2 0<br />
0 −14 52 160<br />
3 0 0 0<br />
2 2 0 0<br />
0 −8 12 0<br />
0 −52 350 160<br />
⎞<br />
1 −2 0 0<br />
0 2 −2 0<br />
0 0 2 −960<br />
0 0 0 2880<br />
⎟<br />
⎠ ⇒<br />
⎞<br />
⎟<br />
⎠ ⇒<br />
⎞<br />
⎟<br />
⎠<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
12<br />
3 0 0 0<br />
2 14 −2 0<br />
0 −44 8 0<br />
0 −14 52 160<br />
1 −2 0 0<br />
0 6 0 0<br />
0 −8 12 0<br />
0 −52 350 160<br />
⎞<br />
⎟<br />
⎠ ⇒<br />
⎞<br />
⎟<br />
⎠<br />
⇒ · · ·
Beschreibung von Schritt 4 am Beispiel einer<br />
(4 × 4)-Matrix<br />
⎛<br />
⎞<br />
14 21<br />
⎜ 0 12<br />
⎜<br />
⎝ 0 0<br />
0<br />
8<br />
16<br />
0<br />
0<br />
5<br />
⎟<br />
⎠<br />
0 0 0 20<br />
⇒<br />
⎛<br />
⎞<br />
7 0<br />
⎜ 12 24<br />
⎜<br />
⎝ 0 0<br />
0<br />
8<br />
16<br />
0<br />
0<br />
5<br />
⎟<br />
⎠<br />
⇒<br />
0 0 0 20<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
7 0 0 0<br />
12 8 0 0<br />
0 16 48 5<br />
0 0 0 20<br />
⎞<br />
1 24 0 0<br />
0 8 −3 0<br />
0 0 1 2880<br />
0 0 0 6720<br />
1 0 0 0<br />
0 1 0 0<br />
0 −3 8 0<br />
0 0 0 6720<br />
⎟<br />
⎠ ⇒<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠ ⇒<br />
⇒ · · ·<br />
13<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
7 0 0 0<br />
12 8 0 0<br />
0 16 1 0<br />
0 0 −380 960<br />
1 0 0 0<br />
0 1 0 0<br />
0 0 8 0<br />
0 0 0 6720<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⇒ · · ·
Komplexitätsabschätzung<br />
Satz 2.3.1 Sei A ∈ R m,n mit p = max{m, n}. Dann gilt:<br />
a) Für R = Z benötigt <strong>der</strong> Dreiecksbandmatrix-Algorithmus<br />
O(p 4 log 2 2(p�A�∞) max{p 2 , log 2(�A�∞)}) Bitoperationen.<br />
b) Für R = F[x] benötigt <strong>der</strong> Dreiecksbandmatrix-<br />
Algorithmus O(p 4 ⌈A⌉ 2 deg max{p2 , ⌈A⌉deg}) Körperoperationen.<br />
Bemerkung 2.3.2 a) Für eine (100 × 100)-Matrix über<br />
Z müßte <strong>der</strong> maximale Absolutbetrag <strong>der</strong> Eingabematrix<br />
größer als 2 10.000 sein, damit max{p 2 , log 2(�A�∞)} �= p 2<br />
gilt.<br />
b) Für eine (100×100)-Matrix über F[x] müßte <strong>der</strong> maximale<br />
Grad <strong>der</strong> Eingabematrix größer als 10.000 sein, damit<br />
max{p 2 , ⌈A⌉deg} �= p 2 gilt.<br />
Wir erhalten im wesentlichen dieselbe Komplexitätsabschätzung<br />
bei dem benutzten HNF-Algorithmus.<br />
14
Vergleich mit dem Kannan-Bachem-Algorithmus<br />
Satz 2.3.3 Sei A ∈ Rm,n mit p = max{m, n}. Dann gilt:<br />
a) Für R = Z benötigt <strong>der</strong> Kannan-Bachem-Algorithmus<br />
O(p10 log 3 2(p�A�∞)) Bitoperationen.<br />
b) Für R = F[x] benötigt <strong>der</strong> Kannan-Bachem-<br />
Algorithmus O(p10⌈A⌉3 deg ) Körperoperationen.<br />
15
2.4 Laufzeitvergleiche<br />
Matrix HNF-Alg. KB-Alg. DBM-Alg. HHR-Alg. MAGMA<br />
(R = Z) \ HNF \ HNF<br />
53 × 53 00:00:02 00:00:00 00:00:00 00:00:04 00:00:06<br />
101 × 101 00:00:23 00:00:03 00:00:03 00:01:56 00:02:29<br />
149 × 149 00:02:59 00:00:05 00:00:02 00:23:19 00:17:58<br />
199 × 199 00:10:27 00:00:16 00:00:17 20:16:03 01:10:42<br />
251 × 251 00:40:10 00:00:19 00:00:11 04:32:10<br />
293 × 293 01:16:24 00:00:36 00:00:18 08:45:28<br />
349 × 349 02:49:42 00:01:14 00:05:30 20:47:38<br />
401 × 401 05:09:53 00:05:14 00:42:24<br />
449 × 449 09:50:35 00:07:43 00:08:14<br />
499 × 499 18:58:11 00:01:39 00:00:52<br />
Matrix HNF-Alg. KB-Alg. DBM-Alg. HHR-Alg. MAGMA<br />
(R = F2[x]) \ HNF \ HNF<br />
50 × 50 00:00:03 00:00:00 00:00:00 00:00:03 01:37:12<br />
100 × 100 00:00:27 00:00:00 00:00:00 00:00:27<br />
150 × 150 00:01:40 00:00:06 00:00:01 00:02:08<br />
200 × 200 00:04:27 00:00:06 00:00:03 00:04:31<br />
250 × 250 00:08:57 00:00:02 00:00:02 00:08:28<br />
300 × 300 00:15:38 00:00:20 00:00:18 00:17:10<br />
350 × 350 00:25:35 00:01:11 00:02:41 00:26:50<br />
400 × 400 00:39:09 00:02:44 00:00:37 01:08:21<br />
450 × 450 00:54:50 00:03:10 00:00:14 02:08:07<br />
500 × 500 01:34:01 00:01:22 00:00:09 07:34:21<br />
16
3 Parallele Versionen <strong>der</strong> <strong>Smith</strong>-<br />
<strong>Normalform</strong>-<strong>Algorithmen</strong><br />
Ein paralleles Programm ist eine Menge von unabhängigen<br />
Prozessen, wobei Daten zwischen den Prozessen ausgetauscht<br />
werden.<br />
3.1 Idee <strong>der</strong> Parallelisierung<br />
Beispiel: Algorithmus von Havas, Holt <strong>und</strong> Rees<br />
⎛<br />
⎞ ⎛<br />
4 7 3 −3 2<br />
1 0 0 0<br />
⎜ 3 11 2 5 8<br />
⎟ ⎜<br />
⎟ ⎜ −5 23 17 −10<br />
⎜<br />
⎟ ⎜<br />
⎜ 7 −3 0 4 3 ⎟ ⎜ 17 −61 −51 55<br />
⎜<br />
⎟ ⇒ ⎜<br />
⎜ 1 5 2 3 9 ⎟ ⎜ −3 13 11 −6<br />
⎜<br />
⎟ ⎜<br />
⎝ 7 8 1 −4 5 ⎠ ⎝ 6 −17 −17 14<br />
0<br />
18<br />
−31<br />
15<br />
−7<br />
1 −2 −4 7 −3 4 −15 −16 19 −11<br />
Parallelisierung auf 4 Prozesse<br />
Schritt 1: Die Zeilen werden auf die 4 Prozesse verteilt.<br />
� � �<br />
4 7 3 −3 2 3 11 2 5 8<br />
�<br />
7 8 1 −4 5 1 −2 −4 7 −3<br />
Prozeß 1 Prozeß 2<br />
� 7 −3 0 4 3 � � 1 5 2 3 9 �<br />
Prozeß 3 Prozeß 4<br />
17<br />
⎞<br />
⎟<br />
⎠
Schritt 2: Die Zeile, die für die Transformation maßgeblich<br />
ist, wird von dem Prozeß, auf dem sie liegt, an alle an<strong>der</strong>en<br />
Prozesse geschickt <strong>und</strong> über allen nicht bearbeiteten Zeilen<br />
eingefügt. Den Prozeß, <strong>der</strong> an die an<strong>der</strong>en schickt, bezeichnen<br />
wir als Master.<br />
� 4 7 3 −3 2<br />
7 8 1 −4 5<br />
� ⎛<br />
⎝<br />
4 7 3 −3 2<br />
3 11 2 5 8<br />
1 −2 −4 7 −3<br />
Prozeß 1 Prozeß 2<br />
�<br />
4 7<br />
�<br />
3 −3 2<br />
� �<br />
4 7 3 −3 2<br />
7 −3 0 4 3 1 5 2 3 9<br />
Prozeß 3 Prozeß 4<br />
Schritt 3: Auf allen Prozessen werden dieselben Operationen<br />
wie im Original-Algorithmus durchgeführt.<br />
� 1 0 0 0 0<br />
6 −17 −17 14 −7<br />
� ⎛<br />
⎝<br />
⎞<br />
⎠<br />
1 0 0 0 0<br />
−5 23 17 −10 18<br />
4 −15 −16 19 −11<br />
Prozeß 1 Prozeß 2<br />
�<br />
1 0 0 0 0<br />
� �<br />
1 0 0 0 0<br />
�<br />
17 −61 −51 55 −31 −3 13 11 −6 15<br />
Prozeß 3 Prozeß 4<br />
18<br />
⎞<br />
⎠
Schritt 4: Auf allen Prozessen außer dem Master wird die<br />
verschickte Zeile wie<strong>der</strong> entfernt.<br />
�<br />
1 0 0 0 0<br />
� �<br />
−5 23 17 −10 18<br />
�<br />
6 −17 −17 14 −7 4 −15 −16 19 −11<br />
Prozeß 1 Prozeß 2<br />
� 17 −61 −51 55 −31 � � −3 13 11 −6 15 �<br />
Prozeß 3 Prozeß 4<br />
Bei Spaltenoperationen ist die Matrix immer zeilenverteilt<br />
<strong>und</strong> bei Zeilenoperationen immer spaltenverteilt. Gegebenenfalls<br />
wird zwischen beiden Verteilungen gewechselt.<br />
19
3.2 Laufzeitvergleiche<br />
Effizienz<br />
Matrix Prozesse HNF-Alg. KB-Alg. DBM-Alg.<br />
(R = Z) \ HNF \ HNF<br />
389 × 389 1 05:46:46 00:03:26 00:01:43<br />
389 × 389 2 02:54:28 00:02:33 00:01:15<br />
389 × 389 4 01:29:07 00:02:14 00:01:00<br />
389 × 389 8 00:47:15 00:02:11 00:00:56<br />
389 × 389 16 00:25:12 00:02:10 00:01:02<br />
389 × 389 32 00:14:48 00:02:17 00:01:10<br />
389 × 389 64 00:09:34 00:02:31 00:01:22<br />
Matrix Prozesse HNF-Alg. KB-Alg. DBM-Alg. HHR-Alg.<br />
(R = F2[x]) \ HNF \ HNF<br />
400 × 400 1 10:49:17 00:02:22 00:01:03 06:10:55<br />
400 × 400 2 05:35:44 00:01:18 00:00:36 03:04:36<br />
400 × 400 4 02:54:15 00:01:06 00:00:28 01:33:14<br />
400 × 400 8 01:30:00 00:01:08 00:00:29 00:47:24<br />
400 × 400 16 00:47:20 00:01:18 00:00:36 00:24:49<br />
400 × 400 32 00:26:26 00:01:22 00:00:38 00:13:51<br />
400 × 400 64 00:16:23 00:01:38 00:00:50 00:08:34<br />
20
Große Beispielmatrizen<br />
Matrix Prozesse HNF-Alg. KB-Alg. DBM-Alg.<br />
(R = Z) \ HNF \ HNF<br />
967 × 967 64 09:07:00 00:37:41 00:06:32<br />
983 × 983 64 10:31:53 00:36:16 00:02:09<br />
997 × 997 64 10:21:51 00:39:56 00:20:08<br />
1013 × 1013 64 11:12:28 00:39:41 00:17:04<br />
1117 × 1117 64 17:16:10 00:59:04 00:33:52<br />
1223 × 1223 64 29:37:55 01:06:36 00:07:34<br />
Matrix Prozesse HHR-Alg.<br />
(R = F2[x])<br />
1792 × 1792 (max. Grad 1) 64 01:25:50<br />
1792 × 1792 (max. Grad 1) 64 01:04:38<br />
1792 × 1792 (max. Grad 1) 64 01:31:30<br />
1792 × 1792 (max. Grad 1) 64 01:25:41<br />
1024 × 1024 (max. Grad 9) 64 07:04:31<br />
21
4 Algorithmus <strong>zur</strong> Verkleinerung<br />
<strong>der</strong> Einträge <strong>der</strong> Transformationsmatrizen<br />
über den ganzen Zahlen<br />
Wir betrachten im folgenden den Ring R = Z <strong>und</strong> die Euklidische<br />
Norm.<br />
4.1 Gitterbasenreduktion<br />
Für linear unabhängige Vektoren b1, · · · , bn ∈ Rm heißt die<br />
Menge<br />
�<br />
n�<br />
�<br />
�<br />
�<br />
L(b1, · · · , bn) := � ti ∈ Z ⊂ R m<br />
i=1<br />
ti · bi<br />
ein Gitter mit Gitterbasis b1, · · · , bn <strong>und</strong> Rang n.<br />
Satz 4.1.1 Sei L = L(b1, · · · , bn) ein Gitter <strong>und</strong><br />
¯ b1, · · · , ¯ bn ∈ R m . Dann ist ¯ b1, · · · , ¯ bn genau dann eine<br />
Gitterbasis von L, wenn es eine Matrix T ∈ GLn(Z) gibt<br />
mit [ ¯ b1, · · · , ¯ bn] = [b1, · · · , bn] · T .<br />
Die Gitterbasenreduktion versucht, eine Gitterbasis in eine<br />
an<strong>der</strong>e mit kürzeren Vektoren zu transformieren.<br />
22
Wir benutzen folgende Reduktionstechniken:<br />
• Längenreduktion<br />
– verän<strong>der</strong>t einen Vektor bi <strong>der</strong> Gitterbasis durch<br />
bi := bi +<br />
�i−1<br />
j=1<br />
tjbj, tj ∈ Z<br />
– benutzt das Gram-Schmidt’sche Orthogonalisierungsverfahren<br />
• LLL-Reduktion (Lenstra, Lenstra, Lovász)<br />
– kann alle Vektoren einer Gitterbasis verän<strong>der</strong>n<br />
– führt Längenreduktionsschritte <strong>und</strong> Vertauschungen<br />
<strong>der</strong> Basisvektoren durch<br />
– ist eine stärkere Reduktion als die Längenreduktion<br />
23
4.2 Idee des Algorithmus<br />
Man erhält in einem beliebigen SNF-Algorithmus die Transformationsmatrix<br />
U ∈ GLm(Z), indem man alle Zeilenoperationen<br />
nacheinan<strong>der</strong> an <strong>der</strong> Einheitsmatrix Em durchführt.<br />
Die Transformationsmatrix V ∈ GLn(Z) erhält man, indem<br />
man alle Spaltenoperationen nacheinan<strong>der</strong> an <strong>der</strong> Einheitsmatrix<br />
En durchführt.<br />
Wir betrachten folgendes Problem:<br />
• Geg.: A ∈ Z m,n <strong>und</strong> U ∈ GLm(Z), V ∈ GLn(Z), so<br />
daß C = UAV in SNF ist.<br />
• Ges.: Suche U ∈ GLm(Z) <strong>und</strong> V ∈ GLn(Z) mit kleinem<br />
�U� 2 + �V � 2 , so daß C = UAV in SNF ist.<br />
Sei A ∈ Zm,n <strong>und</strong> U = [u1, · · · , um] T , V = [v1, · · · , vn].<br />
Seien d1, · · · , dr die nichttrivialen Elementarteiler von C.<br />
C hat folgende Form:<br />
⎛<br />
d1<br />
⎜ 0<br />
⎜ .<br />
⎜ 0<br />
⎜<br />
0<br />
⎝ .<br />
0<br />
...<br />
...<br />
· · ·<br />
· · ·<br />
· · ·<br />
...<br />
ds<br />
...<br />
dt<br />
...<br />
0<br />
0<br />
.<br />
0<br />
dr<br />
0<br />
.<br />
0<br />
.<br />
0<br />
0<br />
.<br />
· · ·<br />
· · ·<br />
· · ·<br />
0<br />
. ⎟<br />
0 ⎟<br />
0 ⎟<br />
. ⎠<br />
�<br />
0 · · ·<br />
��<br />
0 0<br />
� �<br />
· · ·<br />
��<br />
0<br />
�<br />
r Spalten<br />
n − r Spalten<br />
24<br />
⎞<br />
⎫<br />
⎪⎬<br />
r Zeilen<br />
⎪⎭<br />
⎫<br />
⎬<br />
⎭<br />
m − r<br />
Zeilen
Folgende Schritte verän<strong>der</strong>n die Transformationsmatrizen<br />
U, V , wobei weiterhin C = UAV gilt.<br />
• LLL-reduziere die Gitterbasis ur+1, · · · , um.<br />
• LLL-reduziere die Gitterbasis vr+1, · · · , vn.<br />
• Für l = 1, · · · , r längenreduziere ul in <strong>der</strong> Gitterbasis<br />
ur+1, · · · , um, ul.<br />
• Für l = 1, · · · , r längenreduziere vl in <strong>der</strong> Gitterbasis<br />
vr+1, · · · , vn, vl.<br />
• Für 1 ≤ s < t ≤ r führe folgende Schritte gleichzeitig<br />
durch:<br />
Minimiere<br />
us = us + k · ut<br />
vt = vt − k · dt<br />
ds vs<br />
f(k) = �us + k · ut�2 + �vt − k · dt<br />
ds<br />
= k 2<br />
�<br />
�ut� 2 + d2 �<br />
t<br />
f ′<br />
(k) =<br />
d2�vs� s<br />
2<br />
vs� 2<br />
�<br />
+k 2 −2 dt<br />
ds + �us�2 + �vt�2 �<br />
k<br />
�<br />
2�ut�2 + 2 d2t d2 2 �vs�<br />
s<br />
+2 −2 dt<br />
ds <br />
f ′′<br />
(k) = 2�ut� 2 + 2 d2 t<br />
d 2 s �vs� 2 > 0<br />
Somit ist das absolute ganzzahlige Minimum<br />
⎡<br />
dt<br />
k0 = ⎢ ds<br />
⎢<br />
− ⎥<br />
⎦<br />
�ut�2 + d2t d2�vs�2 s<br />
25
4.3 Experimente mit dem Algorithmus<br />
Testmatrizen mit kleinem Rang<br />
Matrix Rang Bits (�U� 2 + �V � 2 ) Zeit<br />
alt neu<br />
50 × 50 3 36 10 00:00:06<br />
100 × 100 3 43 12 00:00:43<br />
150 × 150 3 47 13 00:02:22<br />
200 × 200 3 50 13 00:05:43<br />
250 × 250 3 53 14 00:11:17<br />
300 × 300 3 54 14 00:19:37<br />
350 × 350 3 56 15 00:31:19<br />
400 × 400 3 57 15 00:47:01<br />
450 × 450 3 59 15 01:07:15<br />
500 × 500 3 60 16 01:32:45<br />
26
Testmatrizen mit mittlerem Rang<br />
Matrix Rang Bits (�U� 2 + �V � 2 ) Zeit<br />
alt neu<br />
50 × 50 19 59 16 00:00:05<br />
100 × 100 22 39 24 00:00:58<br />
148 × 148 38 4663 147 00:06:41<br />
201 × 201 67 18822 400 02:54:47<br />
248 × 248 33 2260 156 00:34:45<br />
298 × 298 149 5737 862 08:44:40<br />
345 × 345 45 1636 142 02:33:20<br />
396 × 396 32 419 28 03:00:15<br />
450 × 450 57 206 21 04:00:19<br />
496 × 496 62 4694 189 11:50:42<br />
27
Testmatrizen mit vollem Rang<br />
Matrix Rang Bits (�U� 2 + �V � 2 ) Zeit<br />
alt neu<br />
50 × 50 50 1524 1379 00:16:07<br />
100 × 100 100 4596 2686 01:11:30<br />
150 × 150 150 9571 5176 06:14:28<br />
200 × 200 200 16097 7843 17:43:22<br />
250 × 250 250 22283 9592 25:38:42<br />
300 × 300 300 31792 22934 29:23:56<br />
350 × 350 350 40324 27382 44:11:10<br />
400 × 400 400 51250 29698 107:12:14<br />
28
Matrix Rang Bits (�U� 2 + �V � 2 ) Zeit<br />
alt neu<br />
53 × 53 53 416 312 00:03:55<br />
101 × 101 101 1042 843 00:17:45<br />
149 × 149 149 1889 1503 00:39:28<br />
199 × 199 199 2723 2569 02:20:59<br />
251 × 251 251 3799 3246 02:34:05<br />
293 × 293 293 4998 4964 07:59:31<br />
349 × 349 349 4895 4149 08:59:50<br />
401 × 401 401 5629 5345 19:46:23<br />
29