> with(linalg):

LLL Gitterreduktion, Blatt 2, Aufgabe 4

Prozedur GSO

Eingabe: Gitterbasis B

Ausgabe: Gram-Schmidt orthogonalisierte Basis B* sowie Koeffizienten

> GSO:=proc(B,n)

> local i,j,mu,Bs:

> Bs:=[seq(B[i],i=1..n)]:

> mu:=array(1..n,1..n,sparse):

> for i from 2 to n do

> for j from i-1 by -1 to 1 do

> mu[i,j]:=innerprod(B[i],Bs[j])/innerprod(Bs[j],Bs[j]):

> Bs[i]:=evalm(Bs[i]-mu[i,j]*Bs[j]):

> od:

> od:

> return([Bs,evalm(mu)]):

> end:

Prozedur schwach

Eingabe: Basis B, GSO B*, Dimension n

Ausgabe: Schwach reduzierte Gitterbasis

> schwach:=proc(B,Bs,n)

> local i,j,m,Bneu:

> Bneu:=[seq(B[i],i=1..n)]:

> for i from 2 to n do

> for j from i-1 by -1 to 1 do

> m:=round(innerprod(Bneu[i],Bs[j])/innerprod(Bs[j],Bs[j])):

> Bneu[i]:=evalm(Bneu[i]-m*Bneu[j]):

> od:

> od:

> return(Bneu):

> end:

Prozedur Lovasz

Eingabe: GSO B*

Ausgabe: Neue Basis, wobei der erste Index vertauscht wurden, der die Lovasz Bedingung verletzt

> Lovasz:=proc(Bw,Bs,n)

> local L,i,a,b,D,B:

> B:=[seq(Bw[i],i=1..n)]:

> L:=false: i:=2:

> while (L=false and i<=n) do

(Benutze schwache Version der Lovasz Bedingung)

> a:=innerprod(Bs[i-1],Bs[i-1])/2:

> b:=innerprod(Bs[i],Bs[i]):

> if a>b then

> D:=B[i]: B[i]:=B[i-1]: B[i-1]:=evalm(D):

> L:=true:

> fi:

> i:=i+1:

> od:

> return([B,L]):

> end:

Prozedur LLL

Eingabe: Basis B, Dimension n

Ausgabe: Reduzierte Basis B*

> LLL:=proc(B,n)

> local L,C,i,Bw,Bs,Bneu,D:

> L:=true:

> Bneu:=[seq(B[i],i=1..n)]:

> while (L=true) do

> D:=GSO(Bneu,n):

> Bs:=D[1]:

> Bw:=schwach(Bneu,Bs,n):

> C:=Lovasz(Bw,Bs,n):

> Bneu:=C[1]:

> L:=C[2]:

> od:

> return(Bneu):

> end:

Teste das Geschehen

> Eingabe:=[vector([5,4,1]),vector([6,7,2]),vector([2,3,1])];

Eingabe := [vector([5, 4, 1]), vector([6, 7, 2]), v...

> Red:=GSO(Eingabe,3);

Red := [[vector([5, 4, 1]), vector([-8/7, 9/7, 4/7]...

> sred:=schwach(Eingabe,vector(Red[1]),3);

sred := [vector([5, 4, 1]), vector([1, 3, 1]), vect...

> Lovasz(vector(sred),vector(Red[1]),3);

[[vector([1, 3, 1]), vector([5, 4, 1]), vector([1, ...

> debug(LLL):

> LLL(Eingabe,3);

{--> enter LLL, args = [array(1 .. 3,[(1)=5,(2)=4,(3)=1]), array(1 .. 3,[(1)=6,(2)=7,(3)=2]), array(1 .. 3,[(1)=2,(2)=3,(3)=1])], 3

L := true

Bneu := [vector([5, 4, 1]), vector([6, 7, 2]), vect...

D := [[vector([5, 4, 1]), vector([-8/7, 9/7, 4/7]),...

Bs := [vector([5, 4, 1]), vector([-8/7, 9/7, 4/7]),...

Bw := [vector([5, 4, 1]), vector([1, 3, 1]), vector...

C := [[vector([1, 3, 1]), vector([5, 4, 1]), vector...

Bneu := [vector([1, 3, 1]), vector([5, 4, 1]), vect...

L := true

D := [[vector([1, 3, 1]), vector([37/11, -10/11, -7...

Bs := [vector([1, 3, 1]), vector([37/11, -10/11, -7...

Bw := [vector([1, 3, 1]), vector([3, -2, -1]), vect...

C := [[vector([1, 3, 1]), vector([1, 0, 0]), vector...

Bneu := [vector([1, 3, 1]), vector([1, 0, 0]), vect...

L := true

D := [[vector([1, 3, 1]), vector([10/11, -3/11, -1/...

Bs := [vector([1, 3, 1]), vector([10/11, -3/11, -1/...

Bw := [vector([1, 3, 1]), vector([1, 0, 0]), vector...

C := [[vector([1, 0, 0]), vector([1, 3, 1]), vector...

Bneu := [vector([1, 0, 0]), vector([1, 3, 1]), vect...

L := true

D := [[vector([1, 0, 0]), vector([0, 3, 1]), vector...

Bs := [vector([1, 0, 0]), vector([0, 3, 1]), vector...

Bw := [vector([1, 0, 0]), vector([0, 3, 1]), vector...

C := [[vector([1, 0, 0]), vector([0, 1, 0]), vector...

Bneu := [vector([1, 0, 0]), vector([0, 1, 0]), vect...

L := true

D := [[vector([1, 0, 0]), vector([0, 1, 0]), vector...

Bs := [vector([1, 0, 0]), vector([0, 1, 0]), vector...

Bw := [vector([1, 0, 0]), vector([0, 1, 0]), vector...

C := [[vector([1, 0, 0]), vector([0, 1, 0]), vector...

Bneu := [vector([1, 0, 0]), vector([0, 1, 0]), vect...

L := false

<-- exit LLL (now at top level) = [array(1 .. 3,[(1)=1,(2)=0,(3)=0]), array(1 .. 3,[(1)=0,(2)=1,(3)=0]), array(1 .. 3,[(1)=0,(2)=0,(3)=1])]}

[vector([1, 0, 0]), vector([0, 1, 0]), vector([0, 0...

>