Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc
Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc
Der Chinesische Restsatz und seine Anwendung in ... - SwissEduc
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