Vâng, điều này là tương đối đơn giản.
Đầu tiên, có vẻ như Sage đã tích hợp sẵn tính năng này (xem cờ kép, mặc dù tôi đã không kiểm tra nó).
Tôi sẽ mô tả cách tiến hành "toán học", vì tôi nghĩ nó hữu ích hơn về mặt khái niệm.
Đối với một mạng có cơ sở $B$, nó được nhiều người biết đến (xem định lý 2) mà đối ngẫu có cơ sở:
$$D = B (B^t B)^{-1}$$
Theo sau đó là đoạn mã sau:
S = sage.crypto.gen_lattice()
D = S * (S.T * S).inverse()
sẽ tạo ra cơ sở mong muốn. Lưu ý rằng cơ sở không phải là ma trận số nguyên nói chung --- đối với ma trận (ngẫu nhiên) $S$ được tạo ra trong một lần thực hiện sage.crypto.gen_lattice()
, tôi hiểu rằng cơ sở kép là:
[ 1/11 0 0 0 -4/11 -3/11 2/11 0]
[ 0 1/11 0 0 -5/11 1/11 -3/11 0]
[ 0 0 1/11 0 0 5/11 -4/11 -5/11]
[ 0 0 0 1/11 -2/11 4/11 4/11 -5/11]
[ 0 0 0 0 1 0 0 0]
[ 0 0 0 0 0 1 0 0]
[ 0 0 0 0 0 0 1 0]
[ 0 0 0 0 0 0 0 1]
Cơ sở (sơ cấp) được chọn là $q$-ary cho $q = 11$.
Bạn có thể nhận thấy rằng bằng cách nhân rộng mọi thứ bằng cách $q = 11$, ta được một ma trận số nguyên.
Điều này nói chung đúng, và có thể thấy được bằng cách lưu ý rằng một $q$mạng tinh thể $L$ đáp ứng:
\begin{align*}
q\mathbb{Z}^m&\subseteq L\subseteq \mathbb{Z}^m\
\iff (q\mathbb{Z}^m)^*&\supeteq L^* \supseteq \mathbb{Z}^m\
\iff \frac{1}{q}\mathbb{Z}^m&\supeteq L^*\supeteq \mathbb{Z}^m\
\iff \mathbb{Z}^m &\supeteq qL^*\supeteq q\mathbb{Z}^m
\end{align*}
Điều này muốn nói rằng nếu $q\mathbb{Z}^m\subseteq L\subseteq \mathbb{Z}^m$, sau đó trong khi mạng kép $L^*$ có thể không được chứa giữa $q\mathbb{Z}^m$ và $\mathbb{Z}^m$, các thu nhỏ mạng tinh thể kép luôn là.
Người ta thường thấy điều này trong các bài báo như một tuyên bố:
$$\Lambda_q(A)^* = \frac{1}{q}\Lambda_q^\perp(A)$$
Trên thực tế, trong ký hiệu của $\Lambda_q(A)$ và $\Lambda_q^\perp(A)$, bạn chỉ đơn giản là hỏi, đưa ra một cơ sở cho $\Lambda_q(A)$, để làm cơ sở cho $\Lambda_q^\perp(A)$.