|
en.wikipedia.org/wiki/Lattice_reduction
kconrad.math.uconn.edu/blurbs/grouptheory/SL(2,Z).pdf Example 2.1
尝试用Javascript写下2维LatticeReduce的Lagrange算法:
- class Vector extends Array{
- // Add Vector v to this vector
- // a.add(b);
- add (v) {
- var sum = new Vector();
- for (var i = 0; i < this.length; i++ ) {
- sum[i] = v[i] + this[i];
- }
- return sum;
- }
- // Dot product of Vector v and this vector
- // a.dot(b); // should return 1*3+2*4+3*5 = 26
- dot (v) {
- var sum = 0;
- for (var i = 0; i < this.length; i++ ) {
- sum += this[i] * v[i];
- }
- return sum;
- }
- // Norm of this vector squared
- normSq () {
- var s = 0;
- for (var i = 0; i < this.length; i++ ) {
- s += Math.pow(this[i], 2);
- }
- return s
- }
- // scalar multiplication
- times (k) {
- var product = new Vector();
- for (var i = 0; i < this.length; i++ ) {
- product[i] = this[i] * k;
- }
- return product;
- }
- }
- // Input: (u,v) a basis for the lattice L. Assume that ||v|| \leq ||u|| , otherwise swap them.
- // Output: A basis (u,v) with ||u|| = \lambda_1(L), ||v|| = \lambda_2(L) .
- // While ||v|| < ||u|| :
- // q := \lfloor {\langle u, \frac{v}{||v||^2} \rangle } \rceil # Round to nearest integer
- // r := u - qv
- // u := v
- // v := r
- function LLL(u,v){
- while (v.normSq() < u.normSq()){
- var q = Math.round(u.dot(v)/v.normSq());
- var r = u.add(v.times(-q));
- console.log("[" + u.toString() + "] - " + q.toString() + " * ["+v.toString()+"] = ["+r.toString()+"]");
- u = v;
- v = r;
- }
- console.log("result is: [" + u.toString() + "], [" + v.toString() + "]");
- }
复制代码
上面while終止的條件是v.normSq() $\ge$ u.normSq(),所以有兩種可能:
終止時v.normSq() $>$ u.normSq()
- LLL(new Vector(13, 4),new Vector(12, 2))
复制代码
輸出
[13,4] - 1 * [12,2] = [1,2]
[12,2] - 3 * [1,2] = [9,-4]
result is: [1,2], [9,-4]
終止時v.normSq() $=$ u.normSq()
- LLL(new Vector(17, 29),new Vector(7, 12))
复制代码
輸出
[17,29] - 2 * [7,12] = [3,5]
[7,12] - 2 * [3,5] = [1,2]
[3,5] - 3 * [1,2] = [0,-1]
[1,2] - -2 * [0,-1] = [1,0]
result is: [0,-1], [1,0] |
|