19.08.2013 Aufrufe

Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc

Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc

Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Der</strong> <strong>Ch<strong>in</strong>esische</strong> <strong>Restsatz</strong> <strong>und</strong> <strong>se<strong>in</strong>e</strong><br />

<strong>Anwendung</strong> <strong>in</strong> Computer-Algebra-Systemen<br />

Stefan Heller Markus Hohenwarter Michael Huber<br />

Rudolf Schürer<br />

12. Dezember 2001<br />

1 <strong>Der</strong> <strong>Ch<strong>in</strong>esische</strong> <strong>Restsatz</strong> 1<br />

<strong>Der</strong> <strong>Ch<strong>in</strong>esische</strong> <strong>Restsatz</strong> beschreibt die Lösung e<strong>in</strong>es Systems von Kongruenzen<br />

der Form<br />

x ≡<br />

.<br />

.<br />

a1 (mod m1)<br />

x ≡ an (mod mn).<br />

<strong>Anwendung</strong>en ergeben sich dabei e<strong>in</strong>erseits für das Rechnen mit großen Zahlen<br />

(Modular-Arithmetik <strong>in</strong> Abschnitt 1.3), für das Rechnen mit Polynomen<br />

(siehe Abschnitt 3), wie auch <strong>in</strong> anderen Gebieten.<br />

1.1 Satz <strong>und</strong> Beweis<br />

Satz 1 (<strong>Ch<strong>in</strong>esische</strong> <strong>Restsatz</strong>) Seien m1,...,mn ∈<br />

gcd(mi,mj) =1 für i = j.<br />

, paarweise relativ prim, d. h.<br />

Sei m = m1m2 ···mn <strong>und</strong> seien a1,...,an ∈ ¡ . Dann gibt es genau e<strong>in</strong> x ∈ ¡ mit<br />

0 ≤ x


e<strong>in</strong>e Lösung von (1), da für j =1,...,n<br />

<br />

n<br />

<br />

x ≡<br />

mod m (mod mj)<br />

≡<br />

i=1<br />

aiNiMi<br />

n<br />

aiNiMi (mod mj)<br />

i=1<br />

≡ aj NjMj<br />

<br />

≡1<br />

+<br />

n<br />

i=1<br />

i=j<br />

≡ aj (mod mj).<br />

aiNi Mi<br />

<br />

≡0<br />

(mod mj)<br />

Das stimmt, da für i = jMi e<strong>in</strong> Vielfaches von mj ist <strong>und</strong> daher Mi ≡ 0<br />

(mod mj). NjMj ≡ 1(modmj), daNj ja gerade als Inverses zu Mj modulo<br />

mj def<strong>in</strong>iert war. Aufgr<strong>und</strong> der mod-Operation <strong>in</strong> (2) ist x auch im Bereich<br />

0 ≤ x


E<strong>in</strong>e andere möglich Wahl, die zwar den Zahlenbereich verkle<strong>in</strong>ert, andererseits<br />

aber e<strong>in</strong>ige arithmetische Operationen vere<strong>in</strong>facht, ist mi =2 ei −1. Dabei<br />

ist e1 die Wortlänge, <strong>und</strong> für alle weiteren ei wird die jeweils nächstmögliche<br />

kle<strong>in</strong>ere Zahl gewählt, unter der Voraussetzung, daß der resultierende Modul<br />

relativ prim zu allen vorhergehenden ist. Auf e<strong>in</strong>er 32-bit Masch<strong>in</strong>e <strong>und</strong><br />

für 4 Residuen ergibt das m1 =2 32 −1,m2 =2 31 −1,m3 =2 29 −1,m4 =2 27 −1<br />

<strong>und</strong> damit m ≈ 2 119 .<br />

Arithmetik<br />

Viele wichtige Arithmetische Operationen lassen sich <strong>in</strong> Modular-Arithmetik<br />

e<strong>in</strong>fach dadurch ausführen, daß die entsprechende Operation auf die Residuen<br />

ai modulo mi angewandt wird. Dazu zählen unter anderem:<br />

• Addition <strong>und</strong> Subtraktion<br />

• Multiplikation<br />

• ggT <strong>und</strong> kgV<br />

Dabei ist bemerkenswert, daß auch bei der Multiplikation die Rechenzeit nur<br />

mit O(n) ansteigt, e<strong>in</strong> Resultat, das bei Zifferndarstellung nur mit aufwendigen<br />

Algorithmen erzielt werden kann. Aber selbst bei Addition <strong>und</strong> Subtraktion<br />

hat Modular-Arithmetik Vorteile: Da im Gegensatz zur ziffernweisen Addition/Subtraktion<br />

ke<strong>in</strong> Übertrag berücksichtigt werden muß, lassen sich die n<br />

Operationen auf den Residuen unabhängig, <strong>und</strong> dadurch zum Beispiel auch<br />

effizient parallel durchführen.<br />

Leider gibt es auch e<strong>in</strong> Reihe von Operationen, die <strong>in</strong> Modular-Arithmetik<br />

nicht möglich s<strong>in</strong>d. Dazu zählen unter anderem:<br />

• Division<br />

• Größenvergleich zweier Zahlen<br />

• Überprüfen, ob bei Addition/Subtraktion/Multiplikation e<strong>in</strong> Überlauf<br />

aufgetreten ist<br />

Für diese Operationen ist <strong>in</strong> der Regel e<strong>in</strong> Transformation <strong>in</strong> Zifferndarstellung<br />

samt anschließender Rücktransformation nötig. Nur <strong>in</strong> E<strong>in</strong>zelfällen (z. B.<br />

Größenvergleich) existieren effizientere Algorithmen.<br />

Transformation Ziffern → Modular<br />

Natürlich kann der Rest ai = x mod mi durch Division von x bestimmt werden.<br />

Man muß dabei aber berücksichtigen, daß x <strong>in</strong> der Regel nicht <strong>in</strong> e<strong>in</strong><br />

Masch<strong>in</strong>en-Wort paßt, <strong>und</strong> daher e<strong>in</strong>e entsprechende Divisions-Rout<strong>in</strong>e verwendet<br />

werden muß.<br />

Daher ist es oft e<strong>in</strong>facher ai durch Auswertung des folgenden Polynoms zu<br />

berechnen (xmxm−1 ...x0 seien dabei die Ziffern von x zur Basis b)<br />

ai =(...(xmb + xm−1)b + ...)b + x0,<br />

wobei alle Operationen modulo mi ausgeführt werden können (Horner’s method).<br />

3


Transformation Modular → Ziffern<br />

Die Rücktransformation kann basierend auf dem konstruktiven Existenzbeweis<br />

des <strong>Ch<strong>in</strong>esische</strong>n <strong>Restsatz</strong>es erfolgen. Dazu werden die Zahlen Ci =<br />

NiMi für i =1,...,n e<strong>in</strong>malig vorberechnet, <strong>und</strong> bei der eigentlichen Transformation<br />

die L<strong>in</strong>earkomb<strong>in</strong>ation<br />

<br />

n<br />

<br />

x =<br />

mod m<br />

i=1<br />

aiCi<br />

gebildet. Auch hier ist man wieder mit dem Problem konfrontiert, daß die Zahlen<br />

Ci sowie alle Zwischenergebnisse groß s<strong>in</strong>d. Es existieren bessere Algorithmen,<br />

die die Transformation großteils basierend auf Berechnungen modulo mi<br />

durchführen können.<br />

2 Befehle <strong>in</strong> Mathematica <strong>und</strong> <strong>Der</strong>ive 4<br />

Im Folgenden werden zunächst die Syntax <strong>und</strong> danach die Implementierungen<br />

der <strong>in</strong> Mathematica (Version 4) <strong>und</strong> <strong>Der</strong>ive (Version 5) zur Verfügung stehenden<br />

Befehle zur Lösung des <strong>Ch<strong>in</strong>esische</strong>n <strong>Restsatz</strong> Problems (CRP) vorgestellt.<br />

2.1 Syntax<br />

Zur Erklärung der Syntax wollen wir folgendes e<strong>in</strong>fache System von Kongruenzen<br />

als Beispiel des CRP <strong>in</strong> Mathematica <strong>und</strong> <strong>Der</strong>ive lösen.<br />

Mathematica<br />

r ≡ 0 (mod 4)<br />

r ≡ 1 (mod 9)<br />

r ≡ 2 (mod 121)<br />

In Mathematica gibt es den Befehl Ch<strong>in</strong>eseRema<strong>in</strong>der, der jedoch erst nach<br />

Laden des folgenden Pakets zur Verfügung steht:<br />

< < NumberTheory‘NumberTheoryFunctions‘<br />

Mittels ?Ch<strong>in</strong>eseRema<strong>in</strong>der <strong>in</strong>formieren wir uns über die Syntax:<br />

Ch<strong>in</strong>eseRema<strong>in</strong>der[list1, list 2] gives the m<strong>in</strong>imal<br />

nonnegative <strong>in</strong>teger solution of Mod[r, list 2] == list 1.<br />

The solution is unique modulo the LCM of list 2.<br />

Die Argumente der Funktion s<strong>in</strong>d also e<strong>in</strong>e Liste von Resten (list 1) <strong>und</strong> e<strong>in</strong>e<br />

Liste von Moduln (list 2). Unser Beispiel lässt sich damit wie folgt lösen:<br />

Ch<strong>in</strong>eseRema<strong>in</strong>der[{0, 1, 2}, {4, 9, 121}]<br />

Als Ergebnis erhalten wir 244.<br />

4 Von Markus Hohenwarter<br />

4


<strong>Der</strong>ive<br />

In <strong>Der</strong>ive heißt der entsprechende Befehl CRT (Ch<strong>in</strong>ese Rema<strong>in</strong>der Theorem).<br />

Er ist im Paket NUMBER.MTH (Number Theory Functions) def<strong>in</strong>iert, welches<br />

automatisch bei Verwendung e<strong>in</strong>es ihrer Befehle geladen wird.<br />

Die Syntax entspricht jener von Mathematica. Auch hier werden der Funktion<br />

die Listen der Reste <strong>und</strong> Moduln übergeben:<br />

CRT([0,1,2], [4,9,121])<br />

<strong>Der</strong>ive liefert ebenfalls die Lösung 244.<br />

2.2 Implementierung<br />

Sowohl Mathematica als auch <strong>Der</strong>ive erlauben es uns, e<strong>in</strong>en Blick auf die Implementierung<br />

der Befehle Ch<strong>in</strong>eseRema<strong>in</strong>der bzw. CRT zu werfen, da die<br />

entsprechenden Quelltexte den Distributionen beiliegen.<br />

Mathematica<br />

Im Folgenden ist die Implementierung von Ch<strong>in</strong>eseRema<strong>in</strong>der im Paket<br />

NumberTheory‘NumberTheoryFunctions‘ abgedruckt.<br />

Mathematica verwendet zwei verschiedene Algorithmen. Wenn alle Moduln<br />

paarweise relativ prim <strong>und</strong> nicht zu groß s<strong>in</strong>d (< 3000000), wird der<br />

Algorithmus von Lagrange (vergleiche [4, Kapitel 3.1, Seite 54f]) verwendet<br />

(CRTStandard).<br />

Ansonsten kommt der rekursive Algorithmus von Newton (vergleiche [4,<br />

Kapitel 3.1, Seite 55f]) zum E<strong>in</strong>satz (CRTlist). Hierbei wird das Problem auf<br />

e<strong>in</strong> System von zwei Kongruenzen zurückgeführt (CRTPair). Solange mehr<br />

als 16 Kongruenzen vorliegen, geschieht dies <strong>in</strong> Mathematica tatsächlich rekursiv,<br />

danach iterativ (CRTlist).<br />

(* Ch<strong>in</strong>ese Rema<strong>in</strong>der code is by Stan Wagon, Macalester College,<br />

and Daniel Lichtblau, Wolfram Research, Inc.<br />

It is based <strong>in</strong> part on earlier code by Mike McGeachie and<br />

Craig Ortner (students at Macalester College).<br />

January 1998. *)<br />

Ch<strong>in</strong>eseRema<strong>in</strong>der[a_List, m_List] :=<br />

If[ Max[m] < 3000000 && LCM @@ m == Times @@ m,<br />

CRTStandard[a, m],<br />

Catch[First[CRTlist[a, m, 1, Length[a]]]]<br />

] /; Length[a] == Length[m]<br />

CRTStandard[a_, m_] :=<br />

Module[{mm = Times @@ m, m1},<br />

m1 = mm/m;<br />

Mod[a.(m1*PowerMod[m1, -1, m]), mm]<br />

]<br />

CRTpair[{a1_, a2_}, {m1_, m2_}] :=<br />

Block[{mm, d = GCD[m1, m2]},<br />

If[Mod[a1 - a2, d] == 0,<br />

5


<strong>Der</strong>ive<br />

]<br />

]<br />

mm = m1/d;<br />

{ Mod[a1+(a2-a1)*mm*PowerMod[mm, -1, m2/d], mm*m2],<br />

mm*m2 },<br />

Throw[{}]<br />

CRTlist[a_, m_, first_, last_] /; last - first


¢<br />

¢<br />

Da<br />

p(a) =b.<br />

[x] e<strong>in</strong> euklidischer Bereich ist, garantiert der Euklidische Algorithmus<br />

die Existenz von e<strong>in</strong>deutigen Polynomen q, r ∈ [x], sodaß<br />

p(x) =q(x)(x − ai)+r<br />

<strong>und</strong> r vom Grad 0, also e<strong>in</strong> Konstante unabhäng<strong>in</strong>g von x ist. Für x = a erhalten<br />

wir dann<br />

p(a) =q(a)(a − a)+r,<br />

woraus sich r = p(a) =b ergibt. Es muß also für jede Lösung p(a) =b die<br />

Kongruenz<br />

p(a) ≡ b (mod x − a)<br />

gelten.<br />

Umgekehrt folgt aus<br />

sofort<br />

p(x) ≡ b (mod x − a)<br />

p(x) =q(x)(x − a)+b<br />

<strong>und</strong> damit<br />

p(a) =q(a)(a − a)+b,<br />

woraus sich die Lösung p(a) =b ergibt.<br />

Insgesamt erhalten wir also<br />

p(a) =b ⇐⇒ p(x) ≡ b (mod x − a).<br />

Daher ist obige Problemstellung äquivalent mit e<strong>in</strong>em System von Kongruenzen,<br />

welches mit dem <strong>Ch<strong>in</strong>esische</strong>n <strong>Restsatz</strong> lösbar ist.<br />

Bemerkung: <strong>Der</strong> <strong>Ch<strong>in</strong>esische</strong> <strong>Restsatz</strong> liefert e<strong>in</strong> Polynom mit m<strong>in</strong>imalem<br />

Grad.<br />

3.2 Realisierung <strong>in</strong> Mathematica<br />

<strong>Der</strong> Befehl Ch<strong>in</strong>eseRema<strong>in</strong>der funktioniert nicht mit Polynomen. Den mathematisch<br />

geübten Benutzer h<strong>in</strong>dert dies allerd<strong>in</strong>gs nicht an <strong>se<strong>in</strong>e</strong>m Tun. Mit<br />

e<strong>in</strong>igen wenigen Änderungen wird die Funktion Ch<strong>in</strong>eseRema<strong>in</strong>der auf unsere<br />

Anforderungen h<strong>in</strong> adaptiert. Dabei genügt es, sich auf relativ prime Moduln<br />

zu beschränken.<br />

Zur Er<strong>in</strong>nerung hier noch e<strong>in</strong>mal die entscheidende Passage aus der aus<br />

Abschnitt 2.2 bekannten Implementierung für relativ prime Moduln:<br />

CRTStandard[a_List, m_List] :=<br />

Module[{mm = Times @@ m, m1},<br />

m1 = mm / m;<br />

Mod[a . (m1 * PowerMod[m1, -1, m]), mm]<br />

]<br />

7


<strong>Der</strong> Algorithmus bleibt im Pr<strong>in</strong>zip der Gleiche. In der 4. Zeile wird der Befehl<br />

Mod verwendet, der wieder nicht mit Polynomen arbeitet. Mathematica bietet<br />

dafür die Funktion PolynomialRema<strong>in</strong>der[p, q, x],diewieMod arbeitet,<br />

nur mit Polynomen im Parameter x.<br />

Das Inverse zu m1 modulo m berechnet sich mit dem erweiterten euklidischen<br />

Algorithmus: Sei m1,m teilerfremd, dann gibt es r <strong>und</strong> s so daß 1=<br />

rm1 + sm. Damit haben wir rm1 =1(modm), worausfolgt,daßr <strong>in</strong>vers zu<br />

m1 modulo m ist.<br />

In Mathematica wird dafür die Funktion PolynomialExtendedGCD[p1,<br />

p2] im Paket Algebra’PolynomialExtendedGCD’ verwendet. Als Ergebnis<br />

wird die Liste {gcd, {r, s}} geliefert.<br />

Da PolynomialExtendedGCD nicht mit Listen arbeitet, wird die Funktion<br />

MapThread verwendet. MapThread[f, {{a1,a2,...}, {b1,b2,...},...}]<br />

liefert {f[a1,b1,...], f[a2,b2,...],...}.<br />

Mit diesen Überlegungen wird aus CRTStandard{aList, mList] die erweiterte<br />

Funktion PolynomialCRT[aList, mList, x] :<br />

PolynomialCRT[a_List, m_List, x_] :=<br />

Module<br />

[<br />

{mm = Times @@ m, m1},<br />

m1 = mm / m;<br />

PolynomialRema<strong>in</strong>der[<br />

a . (m1 * MapThread[PolynomialExtendedGCD, {m1, m}]<br />

[[All, 2]][[All, 1]]),<br />

mm, x]<br />

]<br />

3.3 Beispiel <strong>Anwendung</strong><br />

Gegeben s<strong>in</strong>d die Punkte (1, 1), (2, −4), (3, 0), (4, −1). Gesucht sei e<strong>in</strong> Polynom,<br />

das diese Punkte als Lösungen besitzt.<br />

Also benötigen wir die Lösung von diesem System von Kongruenzen:<br />

p(x) ≡ 1 (mod x − 1)<br />

p(x) ≡ −4 (mod x − 2)<br />

p(x) ≡ 0 (mod x − 3)<br />

p(x) ≡ −1 (mod x − 4)<br />

Abbildung 1 enthält die nötigen Mathematica Befehle zum Berechnen des<br />

Interpolationspolynoms. Abbildung 2 zeigt die resultierende Mathematica Grafik.<br />

8


Algebra‘PolynomialExtendedGCD‘<br />

PolynomialCRT[a_List, m_List, x_] :=<br />

Module<br />

[<br />

{mm = Times @@ m, m1},<br />

m1 = mm / m;<br />

PolynomialRema<strong>in</strong>der[<br />

a . (m1 * MapThread[PolynomialExtendedGCD, {m1, m}]<br />

[[All, 2]][[All, 1]]),<br />

mm, x]<br />

]<br />

PolynomialCRT[{1, -4, 0, -1}, {x - 1, x - 2, x - 3, x - 4}, x]<br />

-1\6 (-4 + x)(-3 + x)(-2 + x) - 2 (-4 + x)(-3 + x)(-1 + x)<br />

- 1\6 (-3 + x)(-2 + x)(-1 + x)<br />

Simplify[%]<br />

29 - 265 x \ 6 + 37 x^2 \ 2 - 7 x^3 \ 3<br />

poly = Plot[%, {x, 0, 5}, DisplayFunction -> Identity];<br />

punkte = ListPlot[{1, -4, 0, -1}, PlotStyle -> Po<strong>in</strong>tSize[.03],<br />

DisplayFunction -> Identity];<br />

Show[{poly, punkte}, DisplayFunction -> $DisplayFunction]<br />

Abbildung 1: Interpolation mittels des <strong>Ch<strong>in</strong>esische</strong>n <strong>Restsatz</strong>es<br />

5<br />

-5<br />

-10<br />

1 2 3 4 5<br />

Abbildung 2: Das berechnete Interpolationspolynom<br />

9

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!