Dưới đây là một cách khác để nhìn vào vấn đề: Bạn có một mạng được tạo ra bởi các cột của . Sử dụng thuật toán LenstraTHER Lenstra tội Lovász (LLL) để thu được cơ sở rút gọn của mạng này. Nếu bạn thay thế bằng một ma trận mới được hình thành bởi đầu ra của LLL, thì các cột của vẫn sẽ tạo ra cùng một mạng, nhưng các vectơ cơ sở sẽ gần với trực giao với nhau hơn và các mục của nên có cường độ nhỏ hơn.M M M - 1MMMM−1
Từ đó, nó cũng sẽ giúp ràng buộc từng thành phần của một cách riêng biệt: tức là bạn có thể ràng buộc thành phần thứbởi. (Nhân tiện, ràng buộc là không chính xác; chúng ta cần sử dụng tổng các phần tử trên mỗi hàng, không phải tối đa.)vi|vi|∑dj=1|(M−1)ij|∥v∥∞≤∥M−1∥
Đối với các giá trị lên đến khoảng 30, thuật toán LLL sẽ hoàn thành thực tế ngay lập tức. Tiệm, phải mất , vì vậy nó sẽ làm chậm cho rất lớn , nhưng đồng thời số điểm chúng ta cần phải kiểm tra phát triển theo cấp số nhân trong , vì vậy thời gian chạy của LLL là không thực sự nút cổ chai. Mặt khác, sự tiết kiệm về số lượng điểm cần kiểm tra có thể rất lớn. Tôi đã viết một số mã GAP để tạo ma trận ngẫu nhiên (ngẫu nhiên) ngẫu nhiên và so sánh các giới hạn trên các thành phần củadO(d6)ddMv rằng chúng tôi có được bằng cách sử dụng cơ sở ban đầu, so với cơ sở giảm LLL (Nhân tiện, chúng tôi không cần phải giả sử rằng ma trận là thường xuyên; tôi đã thực hiện hạn chế này chỉ vì đây là trường hợp trong ứng dụng của bạn):
d: = 8;
M: = Danh tínhMat (d);
cho tôi trong [1..d] làm
cho j trong [1..d] làm
M [i] [j]: = Ngẫu nhiên ([- 10 ^ 8..10 ^ 8]);
od;
M [i]: = M [i] / Tổng (M [i]);
od;
L: = LLLReducesBocation (M) .bocation;
MM: = M ^ -1 * 1.0;
LL: = L ^ -1 * 1.0;
cho tôi trong [1..d] làm
cho j trong [1..d] làm
MM [i] [j]: = MM [i] [j] * SignFloat (MM [i] [j]);
LL [i] [j]: = LL [i] [j] * SignFloat (LL [i] [j]);
od;
od;
In ("Giới hạn cho cơ sở ban đầu:");
những cái: = [1..d] * 0 + 1;
v: = MM * cái;
cho tôi trong [1..d] làm
v [i]: = Int (Tầng (v [i]));
In (v [i]);
In ("");
od;
In ("\ n (");
In (Sản phẩm (v * 2 + 1));
In ("điểm cần kiểm tra) \ n");
In ("Giới hạn cho cơ sở LLL:");
v: = LL * cái;
cho tôi trong [1..d] làm
v [i]: = Int (Tầng (v [i]));
In (v [i]);
In ("");
od;
In ("\ n (");
In (Sản phẩm (v * 2 + 1));
In ("điểm cần kiểm tra) \ n");
Đầu ra sau (dựa trên hạt giống ngẫu nhiên mặc định, với ) không phải là không điển hình:d=8
Giới hạn cho cơ sở ban đầu: 9 23 24 4 23 16 23 4
(258370076349 điểm để kiểm tra)
Giới hạn cho cơ sở LLL: 3 3 2 2 3 4 2 3
(2701125 điểm để kiểm tra)
Chỉnh sửa : Vấn đề này là một trường hợp đặc biệt của vấn đề chung về liệt kê các điểm mạng trong đa giác lồi, hóa ra đây là một vấn đề được nghiên cứu kỹ lưỡng và có nhiều thuật toán hiệu quả hơn so với mô tả ở trên. Xem bài viết này để khảo sát.