Arithmetik • Grundlegende Tatsachen über den Ring Z • Euklidischer

Werbung
Grundlegende Tatsachen über den Ring Z
• hZ; +, · i ist ein nullteilerfreier Ring
• Divisionseigenschaft
∀a ∈ Z, b ∈ Z>0 ∃q, r ∈ Z : a = b · q + r, 0 ≤ r < b
Arithmetik
• Bezeichnungen
• Grundlegende Tatsachen über den Ring Z
a
q = b c = (a div b)
b
a
r = a − b c · b = (a mod b)
b
• Euklidischer Algorithmus
• Lösung ganzzahliger Gleichungssysteme
: Quotient
: Rest
• Teilbarkeit
• Binärer euklidischer Algorithmus
b teilt a : b|a ⇔ (a mod |b|) = 0
1
• grösster gemeinsamer Teiler für (a, b) ∈ Z × Z, (a, b) 6= (0, 0)
ist d ∈ Z>0 mit
d|a ∧ d|b ∧ ( ∀c ∈ Z>0 : c|a ∧ c|b ⇒ c|d )
Bezeichnung: d = ggT(a, b)
Tatsache: d = ggT(a, b) = max{c ∈ Z>0 ; c|a ∧ c|b}
Konvention (GA): ggT(0, 0) = 0
• kleinstes gemeinsames Vielfaches für (a, b) ∈ Z × Z, (a, b) 6= (0, 0)
ist m ∈ Z>0 mit
a|m ∧ b|m ∧ ( ∀c ∈ Z>0 : a|c ∧ b|c ⇒ m|c )
Bezeichnung: m = kgV(a, b)
Tatsache: m = kgV(a, b) = min{c ∈ Z>0 ; a|c ∧ b|c}
2
• p ∈ Z>1 ist Primzahl, wenn gilt
∀a ∈ [1..p] : (a|p ⇒ a = 1 ∨ a = p)
• Euklid:
p Primzahl ⇒
∀a, b ∈ Z : p|(a · b) ⇒ p|a ∨ p|b
• Euklid: es gibt unendlich viele Primzahlen
• Fundamentalsatz der Arithmetik (Gauss, GA Theorem 7.21)
Die Zerlegung natürlicher Zahlen in ihre Primteiler (mit Vielfachheiten)
ist eindeutig, d.h.
zu jeder natürlichen Zahl n > 1 gibt es eindeutig bestimmte
Primzahlen p1 < p2 < . . . < pk und Exponenten e1 , e2 , . . . , ek ∈ N>0
mit
n = pe11 · pe22 · · · pekk
• Die Berechnung dieser Darstellung (Faktorisierung) ist mutmasslich ein
algorithmisch sehr aufwendiges Problem.
3
4
• Sind a, b ∈ Z>0 mit
Euklidischer Algorithmus — Grundalgorithmus
β1
β2
βk
αk
α2
1
a = pα
1 · p 2 · · · p k , b = p 1 · p2 · · · pk
mit Primzahlen p1 < p2 < . . . < pk und Exponenten
α1 , α2 , . . . , αk , β1 , β2 , . . . , βk ≥ 0, so gilt
ggT(a, b) =
min{α1 ,β1 } min{α2 ,β2 }
p2
p1
min{αk ,βk }
· · · pk
max{α1 ,β1 } max{α2 ,β2 }
p2
kgV(a, b) = p1
max{αk ,βk }
· · · pk
ggT und kgV ganzer Zahlen lassen sich also prinzipiell mittels Faktorisierung
berechnen — das ist aber keine effiziente Methode!
Von Euklid stammt ein effizientes Verfahren zur ggT-Berechnungs mittels
iterierter Division mit Rest:
rekursive Version:
Euclid-rek (int a,int b)
iterative Version:
Euclid-iter (int a,int b)
if b = 0 then
return(a)
else
return(Euclid-rek(b, a mod b))
end if
• ggT(a, b) · kgV(a, b) = a · b
basierend auf
• Ganze Zahlen a, b heissen teilerfremd (relativ prim), wenn ggT(a, b) = 1.
Theorem (GA, Thm. 7.19)
α := a, β := b
while β 6= 0 do
(α, β) := (β, α mod β)
end while
return(α)
∀a, b ∈ Z : ggT(a, b) = ggT(b, a mod b)
5
6
Schema der Ausführung von Euklids Algorithmus
Beispiel: a = 57, b = 33
a0
:= a
a1
:= b
a0
=
a1 · q0 + a2
(q0 ∈ Z, 0 < a2 < a1 )
57 = 33 · 1 + 24
a1
=
a2 · q1 + a3
(q1 ∈ N+ , 0 < a3 < a2 )
33 = 24 · 1 + 9
a2
=
..
.
a3 · q2 + a4
(q2 ∈ N+ , 0 < a4 < a3 )
24 = 9 · 2 + 6
an−2
=
an−1 · qn−2 + an
an−1
=
an · qn−1
9=6·1+3
(qn−2 ∈ N+ , 0 < an < an−1 )
(qn−1 ≥ 2, an+1 = 0)
6=3·2
Quotientenfolge: hq0 , q1 , . . . , q4 i = h1, 1, 2, 1, 2i
Restefolge: ha0 , a1 , a2 , . . . , a6 i = h57, 33, 24, 9, 6, 3, 0i
hq0 , q1 , q2 , . . . , qn−1 i : Quotientenfolge
ha0 , a1 , a2 , . . . , an , 0i : Restefolge
7
8
• Terminierung
Effizienz wird gesichert durch den Satz von Lamé (1845):
a0 ≥ a1 > a2 > · · · > an > an+1 = 0 für ein n ≥ 1
• Korrektheit
ggT(a, b) = ggT(a0 , a1 )
Wenn die Berechnung von ggT(a, b) für a > b > 0 genau k Aufrufe der
Prozedur Euclid-rek (bzw. k Schleifendurchläufe der while-Schleife in
Euclid-iter) erfordert, dann gilt a ≥ fk und b ≥ fk−1 , wobei fi die
i-te Fibonacci-Zahl ist.
= ggT(a1 , a2 )
Aus den bekannten Aussagen über die Fibonacci-Zahlen ergibt sich:
= ggT(a2 , a3 )
Sind a, b ∈ N mit a ≥ b, dann ist die Zahl der Divisionschritte im
Euklidischen Algorithmus für a, b ≤ 4.8 · log10 (a) + 2.
= · · · = ggT(an , an+1 ) = ggT(an , 0) = an
10
9
Ausgehend von a = a0 ≥ a1 = b ergibt sich
Eine alternative Betrachtung:
Euklids Algorithmus für (a, b) = (a0 , a1 ) erzeugt zu der Folge
ai = ai+1 · qi + ai+2
≤ qn
(0 ≤ i ≤ n)
von Divisionsschritten eine Quotientenfolge hq0 , q1 , . . . , qn i mit
qi ≥ 1 (0 ≤ i < n)
2n+1
und qn ≥ 2
n−1
Y
i=0
=
n−1
an Y ai
a0 · · · an
≤
an+1 i=0 ai+2
a2 · · · an+1 an+1
2
a
≤
ggT(a, b)
(qi + 1) <
a0 a1
an+1 an+1
• Theorem : Für a, b ∈ N benötigt die Berechnung von ggT(a,b) höchstens
b2 · log2 max(a, b)c + 1 Divisionsschritte
Es gilt
ai+2 · (qi + 1) < ai+1 · qi + ai+2 = ai (0 ≤ i < n)
(Linearität in der Problemgrösse)
und somit
qi + 1 < ai /ai+2 (0 ≤ i < n) und qn = an /an+1 .
11
12
Euklidischer Algorithmus — erweiterte Form
Untersuchung im logarithmischen Komplexitätsmodell:
Eine fundamental wichtige Eigenschaft des ggT für ganze Zahlen ist:
`β (a) : Grösse (Länge) von a bei der Darstellungen in Basis β
Jeder Divisionschritt ai = ai+1 · qi + ai+2 erfordert `β (ai+1 ) · `β (qi ) Operationen
in β-Arithmetik.
der ggT(a, b) lässt sich als Linearkombination von a und b mit
ganzzahligen Koeffizienten darstellen ( Bézout-Beziehung)
∀a, b ∈ Z ∃s, t ∈ Z : a · s + b · t = ggT(a, b)
Gesamtaufwand, gemessen in Basis-β-Operationen für Euklids Algorithmus (a, b):
n
X
Tatsächlich ist ggT(a, b) die kleinste positive Zahl ∈ Z, die sich als
Linearkombination von a und b darstellen lässt.
`β (ai+1 ) · `β (qi )
i=0
und dies ist, unter der Annahme a ≥ b, beschränkt durch
!
n−1
n−1
X
Y
`β (a1 ) ·
`β (qi + 1) + `β (qn ) ∼ `β (b) · `β (qn ·
(qi + 1))
i=0
i=0
≤ 2 `β (b) · (`β (a) − `β (ggT(a, b)) + 1)
13
14
Die algebraische Sicht:
• Für a, b ∈ Z ist
Ha,b = { a · u + b · v ; u, v ∈ Z }
eine Untergruppe (sogar ein “Ideal”) von Z,
d.h. x, y ∈ Ha,b ⇒ x − y ∈ Ha,b (und u · x ∈ Ha,b für alle u ∈ Z)
Extended Euclid (int a, int b)
{
/* returns (d, s, t), where d = gcd(a, b) = as + bt */
if (b == 0) return (a, 1, 0);
else
• Divisionseigenschaft von Z ⇒ ist H 6= {0} eine Untergruppe von Z, so gilt
{
H = k · Z = {k · u ; u ∈ Z }
(d0 , s0 , t0 ) = Extended Euclid(b, a mod b);
s = t0 ;
wobei k = min{h ∈ H ; h > 0}
t = s0 − t0 · (a div b);
• Für a, b ∈ Z mit (a, b) 6= (0, 0) gilt Ha,b = k · Z mit k = a · s + b · t und es ist
k = ggT(a, b), denn
– a ∈ Ha,b ⇒ k | a und b ∈ Ha,b ⇒ k | b
return (d0 , s, t);
}
}
– c|a ∧ c | b ⇒ c | (a · s + b · t) = k
• Das liefert noch kein algorithmisches Verfahren zur Berechnung von (s, t)
15
16
Beispiel a = 57, b = 33
α(0) = h1, 0, 57i
α(1) = h0, 1, 33i
Iterative Version des erweiterten Euklidischen Algorithmus:
seien a ≥ b > 0
für i = 0, 1, 2, . . . seien α(i) = hsi , ti , ai i ∈ Z3 und qi ∈ N+ definiert durch
α(0) := h1, 0, ai
α(1) := h0, 1, bi
i := 1
while ai 6= 0 do
qi−1 := bai−1 /ai c
α(i+1) := α(i−1) − qi−1 · α(i)
i := i + 1
end while
(2)
α
(0)
=α
(1)
− q0 · α
= h1, −1, 24i
q0 = b57/33c = 1
q1 = b33/24c = 1
α(3) = α(1) − q1 · α(2) = h−1, 2, 9i
q2 = b24/9c = 2
α(4) = α(2) − q2 · α(3) = h3, −5, 6i
q3 = b9/6c = 1
(5)
α
(3)
=α
(4)
− q3 · α
= h−4, 7, 3i
q4 = b6/3c = 2
α(6) = α(4) − q4 · α(5) = h11, −19, 0i
Bézout-Beziehung
57 · (−4) + 33 · 7 = 3 = ggT(57, 33)
Notabene
57 · 11 − 33 · (−19) = 0, 11 =
17
57
33
, 19 =
ggT(57, 33)
ggT(57, 33)
18
Es ist



0
1
1 0 a

=
···


1 −qi−1
1 −q0
0 1 b
α(i+1)

Die Eigenschaften des erweiterten Euklidischen Algorithmus ergeben sich leicht
aus einer Darstellung in Matrizenschreibweise
α = hα1 , α2 , α3 i := h1, 0, ai
β = hβ1 , β2 , β3 i := h0, 1, bi
while β3 6= 0 do
α(i)


0
1

für 0 ≤ i ≤ n;
daher ist
q := α3 div β3
 

 
α
0 1
α
  := 
 
β
1 −q
β
 
  a
 
α  
0
  b  =  
 
β
0
−1
eine Schleifeninvariante.
Mit α(i) = hsi , ti , ai i ist
end while
hs, t, di := hα1 , α2 , α3 i
a · si + b · ti = ai für 0 ≤ i ≤ n + 1
19
20
Beweis (Induktion über Anzahl der Divisionen im EA)
beachte: ist hq0 , q1 , . . . , qn−1 i die Quotientenfolge für EA(a0 , a1 ), so ist
hq1 , q2 , . . . , qn−1 i die Quotientenfolge für EA(a1 , a2 ), wobei
ggt(a0 , a1 ) = ggt(a1 , a2 ), daher
Daraus ergibt sich die Bézout-Beziehung:
0
a · sn + b · tn = an = ggT(a, b)
@
sn
tn
sn+1
tn+1
1
A=@
sowie
a · sn+1 + b · tn+1 = an+1 = 0
mit
sn+1 = (−1)n+1
0
b
a
und tn+1 = (−1)n
ggt(a, b)
ggt(a, b)
0
1
1
0
A···@
0
1
10
0
1
1
A@
A
1 −q1
1 −q0
0
10
1 0
s0n−1 t0n−1
0
1
s0
A@
A = @ n−1
=@
(−1)n a2
s0n
t0n
1 −q0
ggt(a1 ,a2 )
0
1
t0n−1
s0n−1 − q0 t0n−1
A
= @ (−1)n+1 a
n+1
(−1)n a2
a1
1
− q0 (−1)
ggt(a0 ,a1 )
ggt(a0 ,a1 )
ggt(a0 ,a1 )
0
1
t0n−1
s0n−1 − q0 t0n−1
A
=@
n+1
n
1
−qn
(−1)
a1
ggt(a0 ,a1 )
21
t0n−1
(−1)n+1 a1
ggt(a1 ,a2 )
10
A@
0
1
1
−q0
(−1) a0
ggt(a0 ,a1 )
22
Beispiel a = 57, b = 33:
Euklids Algorithmus (in der erweiterten Form von Bézout) behandelt ein
fundamentales Problem:
Quotientenfolge : hq0 , . . . , q4 i = h1, 1, 2, 1, 2i
Lösen linearer Gleichungen in Z

0

1


0 1
0


1 −2
1

0

1

1
0

−1
1

1
0

−1
1

0

1

1
0

−2
1

1
0

−2
1

1
0

−2
1
23

0
1

−1
1

1
0

−1
1

1
0

−1
1

1
0

−1
1
1


1
=
−1
−1
 
1
−1
=
−1
3
 
1
3
=
−1
−4
 
1
−4
=
−1
11

−1

2

2

−5

−5

7

7

−19
denn es gilt für a, b, c ∈ Z mit (a, b) 6= (0, 0):
∃ u, v ∈ Z : a · u + b · v = c ⇔ ggT(a, b) | c
und wenn diese Bedingung erfüllt ist, ist die Menge der ganzzahligen Lösungen
der Geradengleichung
a·x+b·y =c
gegeben durch
c
k
· (s, t) + · (−b, a) (k ∈ Z)
d
d
wobei s, t Bézout-Koeffizienten für (a, b) und d = ggT(a, b) sind, d.h.,
a·s+b·t=d
(x, y) =
24
1
A
Zum Beweis:
• es gilt
Ha,b = { a · u + b · v ; u, v ∈ Z } = ggT(a, b) · Z
daher ist a · x + b · y = c in Z lösbar ⇔ c ∈ Ha,b (d.h. ggT(a, b) | c)
• falls Lösbarkeit gegeben und d = ggT(a, b)
a·x+b·y =c⇔
a
b
c
·x+ ·y =
d
d
d
wobei nun ggT(a/d, b/d) = 1, d.h. es genügt, den Fall ggT(a, b) = 1 zu betrachten
• mit Bézout-Koeffizienten s, t, d.h. a · s + b · t = 1 gilt
a · (c · s) + b · (c · t) = c
d.h. (x0 , y0 ) = (c · s, c · t) ist spezielle Lösung von a · x + b · y = c
• (x, y) = (x0 + X, y0 + Y ) ist genau dann Lösung von a · x + b · y = c, wenn (X, Y )
Lösung von a · X + b · Y = 0
• die Lösungen von a · X + b · Y = 0 sind genau die (k · b, −k · a) mit k ∈ Z —
hierfür benötigt man ggT(a, b) = 1
25
Beispiel
• 57 · x + 33 · y = −9
Lösungsmenge:
k
−9
· (−4, 7) + · (−33, 57)
3
3
= (12 − 11 · k, −21 + 19 · k) (k ∈ Z)
(x, y) =
• 57 · x + 33 · y = −8
Lösungsmenge: ∅
Wichtige Bemerkung:
man kann diese Idee ausbauen zu einem Verfahren, um die Menge der
ganzzahligen Lösungen von linearen Gleichungssysteme mit ganzzahligen
Koeffizienten zu berechnen.
27
26
(1)
57x + 33y
=
−9
(2)
x+y
=
z
(3)
24x + 33z
=
−9
(4)
x+z
=
u
(5)
24u + 9z
=
−9
(6)
2u + z
=
v
(7)
6u + 9v
=
−9
(8)
u+v
=
w
(9)
6w + 3v
=
−9
(7) − 6 · (8)
(10)
2w + v
=
−3
Division mit min{3, 6} = 3
(11)
v
=
−3 − 2w
(12)
u
=
3w + 3
aus (11) und (8)
(13)
z
=
−9 − 8w
aus (12) und (6)
(14)
x
=
11w + 12
aus (13) und (4)
(15)
y
=
−21 − 19w
aus (14) und (2)
die zu lösende Gleichung
Division mit 33 = min{57, 33}, neue Variable z
(1) − 33 · (2)
Division mit 24 = min{24, 33}, neue Variable u
(3) − 24 · (4)
Division mit 9 = min{24, 9}, neue Variable v
(5) − 9 · (6)
Division mit 6 = min{6, 9}, neue Variable w
aus (10)
28
Die ganzzahlige Lösungsmenge der Gleichung 57x + 33y = −9 ist also
(x, y) = (12, −21) + w · (11, −19) mit w ∈ Z
30
29
Das Verfahren funktioniert auch für Gleichungen mit mehreren Variablen
(1)
8x − 7y − 5z
=
2
zu lösende Gleichung
(2)
x−y−z
=
u
Division mit 5, neue Variable u
(3)
3x − 2y + 5u
=
2
(1) − 5 · (2)
(4)
x − y + 2u
=
v
Division mit 2, neue Variable v
(5)
x + 2v + u
=
2
(3) − 2 · (4)
(6)
x
=
2 − u − 2v
aus (5)
(7)
y
=
2 + u − 3v
aus (6) und (4)
(8)
z
=
−3u + v
aus (7) und (2)
Die ganzzahlige Lösungsmenge der Gleichung 8x − 7y − 5z = 2 ist also
  

 
x
−1 −2  
2
 u
 
  
y  =  1 −3   + 2 u, v ∈ Z
  

 
v
z
−3 1
0
31
Zur Lösung linearer Gleichungen über Z
Gesucht ganzzahlige Lösungsmenge von
(∗) a1 · x1 + a2 · x2 + · · · + an · xn = b
wobei a1 , · · · , an , b ∈ Z, nicht alle ai = 0
– ohne Einschränkung sei a1 > 0 und a1 = min1≤i≤n {|ai | ; ai 6= 0}
– Fall 1: a1 = 1
dann ist die allgemeine Lösung von (*) gegeben durch
(b − a2 · x2 − · · · − an · xn , x2 , . . . , xn ) mit (x2 , . . . , xn ) ∈ Zn−1
– Fall 2a: a1 > 1, alle ai durch a1 teilbar
dann ist (*) lösbar ⇔ a1 | b und Lösung ergibt sich aus
a1
a2
an
b
· x1 +
· x2 + · · ·
· xn =
a1
a1
a1
a1
→ Fall 1.
32
Daher
– Fall 2a: a1 > 1, nicht alle ai durch a1 teilbar
a • x = a1 · (a ÷ a1 ) • x +(a mod a1 ) • x
{z
}
|
Bezeichnungen (÷ = ganzzahlige Division)
y
a = ha1 , a2 , . . . , an i
Betrachte y als neue Variable mit
x = hx1 , x2 , . . . , xn i
(∗∗) y = x1 + b
(a ÷ a1 ) = ha1 ÷ a1 , a2 ÷ a1 , . . . , an ÷ a1 i
| {z }
Mit
=1
(a mod a1 ) = ha1 mod a1 , a2 mod a1 , . . . , an mod a1 i
| {z } |
{z
}
=0
e = ha1 , a2 mod a1 , . . . , an mod a1 i
a
e = hy, x2 , . . . , xn i
x
nicht alle =0
gilt: die Lösungen hx1 , x2 , . . . , xn i von (∗) entsprechen ein-eindeutig den
Lösungen hy, x2 , . . . , xn i von
e•x
e=b
a
Zu lösende Gleichung (• = Skalarprodukt)
a•x=b
(∗)
a2
an
c · x2 + · · · + b c · xn
a1
a1
vermöge (∗∗).
Divisionsbeziehung
Wichtig (für die Terminierung):
a = a1 · (a ÷ a1 ) + (a mod a1 )
min{a1 , a2 mod a1 , . . . , an mod a1 } < a1
33
34
Das Verfahren lässt sich für die Bestimmung der ganzzahligen Lösungen
ganzzahliger Gleichungssysteme verwenden.
4. Elimination von x durch Einführung einer neuen Variablen t2
Beispiel (vgl. Knuth, TAOCP, Abschnitt 4.5.2)
1. zu lösendes System
10w
6w
+
3x +
3y
− 7x
+
8z
=
1
− 5z
=
2
+ x +
y
+
2z
= t1
w
+
3t1
+
2z
=
18t1
+
35
7x +
4t1
+
x +
7t2
+
2z
= t2
3z
=
4
5z
=
2
17z
=
4
t1
+
2t2
+
z
t1
+
t2
+
3t3
= t3
=
4
6. Auflösen nach t2 und Rückwaärtseinsetzen liefert
=
17
−
5t1
− 14t3
x =
20
−
5t1
− 17t3
y
= −55 +
19t1
+
45t3
z
=
t1
+
7t3
w
1
3. Elimination von w aus zweiter Gleichung
6(1 − 3t1 − 2z) − 7x −
+
5. Elimination von z durch Einführung einer neuen Variablen t3
2. Elimination von y mittels der ersten Gleichung und Einführung einer neuen
Variablen t1
3w
2t1
−8
+
36
Der binäre Euklidische Algorithmus
macht sich die Binärdarstellung der Zahlen zu Nutze und realisiert die Berechnung
des ggT mittels Subtraktion und Division durch Zweierpotenzen (= shift).
Er benützt die (offensichtlichen) Beziehungen
ggT(2a, 2b) = 2 · ggT(a, b)
(a, b ∈ N)
(a, b ∈ N, b ungerade)
ggT(2a, b) = ggT(a, b)
ggT(a, b) = ggT(a − b, b)
37
Binary Euclid (int a, int b)
{ /* returns gcd(a, b) provided that a, b ∈ N */
int d = 1;
while ((a mod 2 == 0) && (b mod 2 == 0))
{
a = a/2; b = b/2; d = 2 · d;
}
while (a 6= 0)
{
/* a or b is odd */
while (a mod 2 == 0) a = a/2;
while (b mod 2 == 0) b = b/2;
/* a and b are odd */
if (a < b) swap(a, b)
a = a − b;
}
return (b · d);
}
39
(a, b ∈ N, a ≥ b, beide ungerade)
38
Beispiel: a = 40902, b = 24140
a
40902
b →
a
24140 → 20451
b
12770 ⇒ d = 2
20451 12770 → 20451
6035
14416
6035 →
901
6035
5134
901 →
2567
901
1666
901 →
833
901
68
833 →
17
833
816
17 →
51
17
34
17 →
17
17
0
17 →
⇒ ggT(40902, 24140) = 2 · 17 = 34
40
• Termination und Korrektheit von Binary Euclid ergeben sich aus den drei
verwendeten Gleichungen für den ggT
• Bei jedem Durchlauf der äusseren while-Schleife wird mindestens eines der
beiden Argumente halbiert ⇒ O(log(a + b)) Schleifendurchläufe
• Jeder Schleifendurchlauf erfordert Operationen (Vergleiche, Zuweisungen,
Divisionen durch 2, Subtraktion), die sich insgesamt in O(log(a + b))
Bit-Operationen ausführen lassen
• Binary Euclid berechnet den ggT von natürlichen Zahlen mit
O(log2 (a + b)) Bit-Operationen
(Heun, Grundlegende Algorithmen, Abschnitt 7.1; siehe auch Knuth, The
Art of Computer Programing, vol. 2, Seminumerical Algorihtms, Abschnitt
4.5.2, und Bach/Shallit, Algorithmic Number Theory, vol.1 Efficient
Algorithms, Kapitel 4)
Binary Extended Euclid (int a, int b)
{ /* returns (d, s, t), where d = gcd(a, b) = a · s + b · t */
(d, s, t) = (a, 1, 0);
(d0 , s0 , t0 ) = (b, 0, 1);
while (d0 6= 0)
{
if (d0 < d) swap((d, s, t), (d0 , s0 , t0 ))
0
c = 1 << max(`(d0 ) − `(d) − 1, 0); /*c = 2max(`(d )−`(d)−1,0) */
(d0 , s0 , t0 ) = (d0 , s0 , t0 ) − c(d, s, t);
}
return (d, s, t);
}
41
42
a
• die wesentliche Änderung gegenüber der iterativen Version der Euklidischen
Algorithmus
– an Stelle der exakten Quotienten bd0 /dc wird mit den angenäherten
Quotienten
0
c = 2max(`(d )−`(d)−1,0)
1023
b
15
`(a)−`(b)−1
x=b∗2
480
c=a−x
543
`(c)−`(b)−1
y =b∗2
480
d=c−y
63
`(d)−`(b)−1
z =b∗2
gerechnet (→ shift-Operationen). Dabei gilt
0
1
· bd0 /dc ≤ 2max(`(d )−`(d)−1,0) ≤ bd0 /dc
4
• Konsequenz für die Bit-Komplexität: auch Binary Extended Euclid
verwendet nur O(log2 (a + b)) Bit-Operationen.
e=d−z
u=b∗2
30
f =e−u
3
`(b)−`(f )−1
v =f ∗2
g =b−v
43
1
1
1
1
1
1
1
1
1
`(b) = 4
0
0
0
0
0
0
1
1
1
1
0
1
1
1
1
0
0
0
0
0
1
0
0
0
0
1
1
1
1
1
0
1
1
1
1
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
1
1
1
0
`(e) = 6
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
1
1
1
0
`(f ) = 2
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
1
1
`(c) = 10
`(d) = 6
6
9
`(g)−`(f )−1
1
30
33
`(e)−`(b)−1
`(a) = 10
w =f ∗2
6
h=g−w
3
`(g) = 4
`(h) = 2
44
Herunterladen