@@ -3,5 +3,237 @@ Python Lattice Library<br>
3
3
This is a python library to use lattices on python.<br >
4
4
This library has algorithms to lattice reduce, solve SVP, solve CVP, and other many operation for lattices.
5
5
6
- # What Functions are Available?
7
- Available functions in this library are below:
6
+ ## How to Use?
7
+ ### Initialization
8
+ If you want to use ``` A = numpy.array([[123, 0, 0], [234, 1, 0], [345, 0, 1]]) ``` as lattice basis matrix, you can do like below:
9
+
10
+ ``` Python
11
+ import PythonLatticeLibrary as PLL
12
+ import numpy as np
13
+
14
+ A = np.array([[123 , 0 , 0 ], [234 , 1 , 0 ], [345 , 0 , 1 ]])
15
+ b = PLL .lattice(A)
16
+ b.print()
17
+ ```
18
+ Output is below.
19
+
20
+ ```
21
+ Basis =
22
+ [[123 0 0]
23
+ [234 1 0]
24
+ [345 0 1]]
25
+ Rank = 3
26
+ Volume = 122.99999999999994
27
+ ```
28
+
29
+ Not only numpy.array but list is available for argument of `` PLL.lattice() `` :
30
+
31
+ ``` Python
32
+ import PythonLatticeLibrary as PLL
33
+ import numpy as np
34
+
35
+ A = [[123 , 0 , 0 ], [234 , 1 , 0 ], [345 , 0 , 1 ]]
36
+ b = PLL .lattice(A)
37
+ b.print()
38
+ ```
39
+ Output is below.
40
+
41
+ ```
42
+ Basis =
43
+ [[123 0 0]
44
+ [234 1 0]
45
+ [345 0 1]]
46
+ Rank = 3
47
+ Volume = 122.99999999999994
48
+ ```
49
+
50
+ You can generates a random lattice like below:
51
+
52
+ ``` Python
53
+ import PythonLatticeLibrary as PLL
54
+
55
+ b = PLL .random_lattice(5 ) # Generates 5-dimensional lattice basis.
56
+ b.print()
57
+ ```
58
+
59
+ Output is below:
60
+
61
+ ```
62
+ Basis =
63
+ [[875 0 0 0 0]
64
+ [932 1 0 0 0]
65
+ [951 0 1 0 0]
66
+ [801 0 0 1 0]
67
+ [754 0 0 0 1]]
68
+ Rank = 5
69
+ Volume = 875.0000000044823
70
+ ```
71
+
72
+ You can reduce lattice basis(e.g. LLL-reduction, Deep-LLL-reduction, etc.) like below:
73
+
74
+ ``` Python
75
+ import PythonLatticeLibrary as PLL
76
+
77
+ b = PLL .random_lattice(5 )
78
+ b.print()
79
+ b.basis = b.LLL() # LLL-reduction
80
+ b.print()
81
+ ```
82
+
83
+ Output is below.
84
+
85
+ ```
86
+ Basis =
87
+ [[711 0 0 0 0]
88
+ [940 1 0 0 0]
89
+ [500 0 1 0 0]
90
+ [592 0 0 1 0]
91
+ [555 0 0 0 1]]
92
+ Rank = 5
93
+ Volume = 710.9999999597205
94
+ Basis =
95
+ [[ 0 1 2 1 -2]
96
+ [-1 2 2 -1 1]
97
+ [ 1 -3 2 0 2]
98
+ [ 0 2 -1 3 2]
99
+ [-4 -1 1 1 1]]
100
+ Rank = 5
101
+ Volume = 710.9999999999999
102
+ ```
103
+
104
+ You can select reduction parameter:
105
+
106
+ ``` Python
107
+ import PythonLatticeLibrary as PLL
108
+
109
+ b = PLL .random_lattice(5 )
110
+ b.print()
111
+ b.basis = b.LLL(delta = 0.5 ) # LLL-reduction
112
+ b.print()
113
+ ```
114
+
115
+ Output is below:
116
+
117
+ ```
118
+ Basis =
119
+ [[814 0 0 0 0]
120
+ [659 1 0 0 0]
121
+ [723 0 1 0 0]
122
+ [912 0 0 1 0]
123
+ [781 0 0 0 1]]
124
+ Rank = 5
125
+ Volume = 813.9999999534335
126
+ Basis =
127
+ [[ 1 1 -1 1 1]
128
+ [-2 -1 1 0 2]
129
+ [ 2 -4 0 2 0]
130
+ [-2 -2 -3 2 -1]
131
+ [-1 2 2 4 -3]]
132
+ Rank = 5
133
+ Volume = 813.9999999999997
134
+ ```
135
+
136
+ You can use other functions for lattice reduction like LLL. Below is the examples.
137
+
138
+ ``` Python
139
+ import PythonLatticeLibrary as PLL
140
+
141
+ b = PLL .random_lattice(5 )
142
+ b.print()
143
+ b.basis = b.DeepLLL() # Deep-LLL-reduction
144
+ b.print()
145
+ ```
146
+
147
+ Output is below:
148
+
149
+ ```
150
+ Basis =
151
+ [[726 0 0 0 0]
152
+ [952 1 0 0 0]
153
+ [676 0 1 0 0]
154
+ [655 0 0 1 0]
155
+ [900 0 0 0 1]]
156
+ Rank = 5
157
+ Volume = 726.0000000397084
158
+ Basis =
159
+ [[-2 -1 -1 0 1]
160
+ [ 1 -1 1 1 2]
161
+ [ 0 -2 2 0 -1]
162
+ [-3 3 4 -1 1]
163
+ [ 0 -1 -2 6 -1]]
164
+ Rank = 5
165
+ Volume = 725.9999999999999
166
+ ```
167
+
168
+ You can solve SVP using function `` ENUM_SVP() `` :
169
+
170
+ ``` Python
171
+ import PythonLatticeLibrary as PLL
172
+
173
+ b = PLL .random_lattice(7 )
174
+ b.print()
175
+ b.basis = b.LLL() # LLL-reduction
176
+ v = b.ENUM_SVP()
177
+ print (v)
178
+ ```
179
+
180
+ Output is below:
181
+
182
+ ```
183
+ Basis =
184
+ [[924 0 0 0 0 0 0]
185
+ [719 1 0 0 0 0 0]
186
+ [552 0 1 0 0 0 0]
187
+ [723 0 0 1 0 0 0]
188
+ [608 0 0 0 1 0 0]
189
+ [834 0 0 0 0 1 0]
190
+ [995 0 0 0 0 0 1]]
191
+ Rank = 7
192
+ Volume = 924.000000001688
193
+ [ 0 -1 0 -1 1 1 0]
194
+ ```
195
+
196
+ As same as solving an SVP, you can solve CVP to target t using `` ENUM_CVP(t) `` :
197
+
198
+ ``` Python
199
+ import PythonLatticeLibrary as PLL
200
+ import numpy as np
201
+
202
+ b = PLL .random_lattice(7 )
203
+ t = np.random.randint(1 , 20 , size = 7 )
204
+ b.print()
205
+ print (t)
206
+ b.basis = b.LLL() # LLL-reduction
207
+ v = b.ENUM_CVP(t)
208
+ print (v)
209
+ ```
210
+
211
+ Output is below:
212
+
213
+ ```
214
+ Basis =
215
+ [[885 0 0 0 0 0 0]
216
+ [799 1 0 0 0 0 0]
217
+ [566 0 1 0 0 0 0]
218
+ [766 0 0 1 0 0 0]
219
+ [650 0 0 0 1 0 0]
220
+ [654 0 0 0 0 1 0]
221
+ [541 0 0 0 0 0 1]]
222
+ Rank = 7
223
+ Volume = 884.9999999999998
224
+ [18 1 4 17 18 9 15]
225
+ [17 2 5 17 18 8 15]
226
+ ```
227
+
228
+ ## What Functions are Available?
229
+ Available functions in this library are below:
230
+ - ``` vol() ``` : Computes volume of the lattice.
231
+ - ``` GSO() ``` : Computes Gram-Schmidt information of the lattice basis.
232
+ - ``` potential() ``` : Computes potential of the lattice basis.
233
+ - ``` size() ``` : Size-reduces the lattice basis.
234
+ - ``` Gauss() ``` : Gauss-reduces the 2-dimensional lattice basis.
235
+ - ``` LLL(delta) ``` : LLL-reduces the lattice basis.
236
+ - ``` DeepLLL(delta) ``` : Deep-LLL-reduces the lattice basis.
237
+ - ``` ENUM_SVP() ``` : Enumerates the shortest vector on the lattice.
238
+ - ```` Babai(t) ```` : Computes an approximate solution of CVP to target t on the lattice with Babai's nearest plane algorithm.
239
+ - ``` ENUM_CVP(t) ``` : Enumerates the closest vector to target t on the lattice.
0 commit comments