格(Lattice)基础(一)

格(Lattice)

格(lattice)的定义

不是那么标准的定义
有一组线性无关的空间向量 ( b 1 , b 2 , … , b n ) ∈ R n (b_1,b_2,\ldots,b_n) \in \mathbb{R^n} (b1,b2,,bn)Rn作为基,该组的每个向量若乘以某个整数系数(也就是通过线性变换)所产生的离散基向量生成空间向量集合就称为格。
L ( b 1 , b 2 , … , b n ) = { Σ x i b i ∣ x i ∈ Z } \mathcal{L}\left(b_{1}, b_{2}, \ldots, b_{n}\right)=\left\{\Sigma x_{i} b_{i} \mid x_{i} \in \mathbb{Z}\right\} L(b1,b2,,bn)={ΣxibixiZ}
如果把基向量组合用合成矩阵 B B B来表示
L ( B ) = L ( b 1 , b 2 , … , b n ) = ∑ i = 1 n b i ⋅ Z = { B x ∣ x ∈ Z n } \mathcal{L}(B)=\mathcal{L}\left(b_{1}, b_{2}, \ldots, b_{n}\right)=\sum_{i=1}^{n} \mathbf{b}_{i} \cdot \mathbb{Z}=\left\{B x \mid x \in \mathbb{Z}^{n}\right\} L(B)=L(b1,b2,,bn)=i=1nbiZ={BxxZn}
帮助理解: 假如把空间里的向量的末端视为一个点,则格就是某空间里面的具有一些规律的离散的点集合,也可以说格是某空间中的一个离散的、具有加法运算的子群。类似这样

在这里插入图片描述

值得注意的是

  1. 系数是整数,向量坐标是实数,如果向量坐标也是整数,那么生成的格就称为整数格,有点类似笛卡尔坐标系。
  2. 我们可以用线代中学到的基向量变更给这个格找到一组新的基 C C C,那么可得 C = A B C=AB C=AB,这里 d e t ( A ) = ± 1 det(A)=\pm1 det(A)=±1。即格的任意两个基可以通过左乘一个特定的矩阵来相互转化,这矩阵是由整数构成的,且它的行列式为 ± 1 \pm1 ±1
    证明过程如下,
    在这里插入图片描述
    同时,这种矩阵也称为幺模矩阵
    (unimodular matrix)
    定义: U ∈ Z n × n U\in\mathbb{Z}^{n \times n} UZn×n ∣ U ∣ = ± 1 |U|=\pm1 U=±1 U U U称为幺模矩阵同时它的逆也是幺模矩阵。

如何判定两个格基是否能生成同一个格呢?
当一个格基能通过幺模矩阵进行变换到另一个格基的时候,这两个格基就可以生成相同的格。

基础区域(Fundamental Parallelepiped)

由格基 B B B线性组合,系数在 [ 0 , 1 ) [0,1) [0,1)之间组成的一块区域。

P ( B ) = { B x ∣ x ∈ R n , ∀ i : 0 ⩽ x i < 1 } \mathcal{P}(B)=\left\{B x \mid x \in \mathbb{R}^{n}, \forall i: 0 \leqslant x_{i}<1\right\} P(B)={BxxRn,i:0xi<1}
大概像这样,
在这里插入图片描述
如何判定给定的向量集是否构成格的“basis”?
由向量生成的"basic parallelepiped"不应该包含除原点外的任何格点,即基础区域与格的交集为0。
如下图
在这里插入图片描述

图2(c)中所示的"basic parallelepiped"包含格点 (1,0),而图2(a)和图2(b)中的基本平行不包含任何非零格点。
一个格的任意基础区域都拥有相同的体积(体积不是狭义的三维体积,可以扩展到n维,如二维是面积,三维是体积)。

行列式(Determinant)

类似于线性空间里,一个格的行列式代表了对应基向量所组成的几何体体积
定义格的行列式作为基础区域的n维体积
d e t ( L ) = ∑ i b i ⋅ [ 0 , 1 ) = v o l ( P ( B ) ) det(\mathcal{L})=\sum_{i}{\mathbf{b}_{i}}\cdot[0,1)=vol(\mathcal{P(\mathbf{B})}) det(L)=ibi[0,1)=vol(P(B))
注意
给定任意一组基向量,这个Determinant大小是不变的,也就是无论怎么变换,都能找到这个值,即一个格的任意基础区域体积都相同。它不依赖于计算它的某个具体基础区域,是格的不变量。证明过程如下

在这里插入图片描述

格密度

格的密度可以理解为,在空间里任意取一个超球体,然后看这个球体里面覆盖了多少格点,点的数量平均于球体体积,这个就是密度
格的行列式与其密度成反比
F o r   a l l   s u f f i c i e n t l y   l a r g e   S ⊆ R n : ∣ S ∩ L ∣ ≈ vol ⁡ ( S ) / det ⁡ ( L ) For\ all\ sufficiently\ large\ S \subseteq \mathbb{R}^{n} :\\ |S \cap \mathcal{L}| \approx \operatorname{vol}(S) / \operatorname{det}(\mathcal{L}) For all sufficiently large SRn:SLvol(S)/det(L)

最短距离与连续最小值

格的一个基本参数是格中最短非零向量的长度,也就是点与点之间的最短距离,为了方便可以把其中一个点设置为坐标轴的原点。
λ 1 = min ⁡ x , y ∈ L , x ≠ y ∥ x − y ∥ = min ⁡ x ∈ L , x ≠ 0 ∥ x ∥ \begin{aligned} \lambda_{1} &=\min _{x, y \in \mathcal{L}, x \neq y}\|x-y\| \\ &=\min _{x \in \mathcal{L}, x \neq 0}\|x\| \end{aligned} λ1=x,yL,x=yminxy=xL,x=0minx
记为 λ 1 ( L ) , \lambda_1(\mathcal{L}), λ1(L)同理可定义第二近到第 n n n近的 λ 2 ( L ) , λ 3 ( L ) , … , λ n ( L ) \lambda_2(\mathcal{L}),\lambda_3(\mathcal{L}),\ldots,\lambda_n(\mathcal{L}) λ2(L),λ3(L),,λn(L)

距离函数(Distance Function)与覆盖半径(Covering Radius)

给定一个任意点 t \mathbf{t} t(可以不在格上),定义距离函数 μ ( t , L ) \mu(\mathbf{t},\mathcal{L}) μ(t,L)为这个点到附近的格点的最短距离。
μ ( t , L ) = min ⁡ x ∈ L ∥ t − x ∥ \mu(\mathbf{t},\mathcal{L})=\min _{\mathbf{x} \in \mathcal{L}}\|\mathbf{t}-\mathbf{x}\| μ(t,L)=xLmintx
可以通过移动 t \mathbf{t} t位置得到这个格中最大的 μ \mu μ,这个就称为覆盖半径(Covering Radius)
μ ( L ) = max ⁡ t ∈ s p a n ( L ) μ ( t , L ) \mu(\mathcal{L})=\max _{\mathbf{t} \in span(\mathcal{L})} \mu(\mathbf{t}, \mathcal{L}) μ(L)=tspan(L)maxμ(t,L)
注意 μ \mu μ是点到格点的最短距离,如果把点换为格点,以每个格点为圆心画圆并逐步扩大,直到这些圆正好完美的覆盖所有空间的时候,这个半径就是最大的 μ \mu μ,即覆盖半径了。
在这里插入图片描述

格的Smoothing

假如将上述的圆,改变为叠加圆形范围内取值的随机噪音,而当达到覆盖半径的时候将会出现取值分布很不平均的问题,那么为了解决此问题就需要smooth一下格。
理论上当半径到无限大的时候,得到的分布是很完美的,但是这种构造就没了意义,所以就出现了一个Smoothing的半径最大上限,该上限由格中距离最大的最短向量 λ n \lambda_{n} λn来决定的,大于这个距离之后,必然会覆盖其他的格点。
在这里插入图片描述

Minkowski定理

凸集定理(Convex body theorem)
用于寻找一个格点周围最近的其他格点的。
给出一个Lattice中最短向量的一个上限值。
λ 1 ( L ) ≤ n r = n ⋅ det ⁡ ( L ) 1 / n \lambda_{1}(\mathcal{L}) \leq \sqrt{n} r=\sqrt{n} \cdot \operatorname{det}(\mathcal{L})^{1 / n} λ1(L)n r=n det(L)1/n
假如把格的Determinant对应空间压缩为一个立方体,那么该立方体的对角线长度就是 n r \sqrt{n}r n r,对角线的另一头必然是下一个格点(但不一定是最近的格点),所以肯定要小于等于这个对角线的长度
第二定理
给出一个对于其他最短向量 λ i \lambda_{i} λi的一个取值上限
λ 1 ( L ) ≤ ( ∏ i λ i ( L ) ) 1 / n ≤ n ⋅ det ⁡ ( L ) 1 / n \lambda_{1}(\mathcal{L}) \leq\left(\prod_{i} \lambda_{i}(\mathcal{L})\right)^{1 / n} \leq \sqrt{n} \cdot \operatorname{det}(\mathcal{L})^{1 / n} λ1(L)(iλi(L))1/nn det(L)1/n
第二定理指出全部 n n n个最短向量的几何平均数,小于之前的对角线长度,由于任意一个格的Determinant对应空间的Parallelepiped是不规则的,所以用几何平均数能很好约束Parallelepiped边的长度

格中难题

最短向量问题(SVP)

定义
在格中需找一个最短的非零格点

可以理解为:寻找一组整数与基向量线性组合使得组合后的向量的长度最短。或者,理解为给定一个基的格,找到一个这个基构成的格点,使得这个点距离坐标原点距离最近。
宽松版( S V P γ SVP_\gamma SVPγ):找到 γ \gamma γ倍距离就行
判定版(GapSVP)

最短独立向量问题(SIVP)

定义
给定一个格,找到n个线性无关的向量,并且这些向量的长度都要小于定于最长的最短向量。
宽松版( S I V P γ SIVP_\gamma SIVPγ):找到 γ \gamma γ倍距离就行
判定版(GapSIVP)

最近向量问题(CVP)

定义
在离散线性集合中逼近目标向量的问题
给定一个不在格中的目标向量,在各种寻找一个向量使得该向量与目标向量距离最近。

可以理解为:给定一组格基向量,和一个目标向量,很难找到一组整数与基向量线性组合使得组合后的向量距离目标向量最近。或者,理解为给定连续空间中任意一个点,找到距离这个点最近的格点。这个距离一定是小于等于覆盖半径的。

还有一种定义是给定一个格,一个随机点和搜索距离,并且假设覆盖半径小于等于搜索距离,CVP问题就是找到一个合理的格点并且这个点到随机点的距离小于等于搜索距离。
宽松版( C V P γ CVP_\gamma CVPγ):找到 γ \gamma γ倍距离就行
判定版(GapCVP)

格基约减算法(Lattice Basis Reduction)

在上述问题中,都需要输入格的基,来形成一个格,从而找到相应的值。同一个格有很多基,有些基是短的,尽可能垂直的,称为“好”的基。而有些基又是长的,且方向接近于同一方向或相反方向的,称为“坏”的基。比如整数格 Z n \mathbb{Z}^n Zn就是一个“好”的基,在它上面解决CVP问题,只需要通过上下取整即可。

所以,需要将“坏”基转变为“好”基,目标是找到一组非常接近垂直基,这个过程称之为 格基约减,就是为了发现一组又短又垂直的基。

比较常见的算法就是施密特正交化,即输入一组基,通过反复迭代最后输出一组垂直的基,这组基能够张成与输入基相同的空间。由于格的系数都是整数,所以应用于格的时候需要把系数进行四舍五入的取整到最近整数。

施密特方法高度依赖向量的顺序问题,不同的基向量顺序将导致不同的结果,为解决这个问题,诞生了LLL算法,但LLL算法只是一次考虑两个向量,由此又诞生了BKZ算法。

参考

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当然可以帮你写一个lattice算法。Lattice算法是一种用于解决最短路径问题的算法,常用于语音识别、机器翻译等自然语言处理任务。下面是一个简单的lattice算法的示例实现: ```python import numpy as np def lattice_algorithm(scores, transition_matrix): num_tokens, num_steps = scores.shape lattice = np.zeros((num_tokens, num_steps)) backpointers = np.zeros((num_tokens, num_steps), dtype=int) # 初始化第一列 lattice[:, 0] = scores[:, 0] # 动态规划计算最佳路径 for t in range(1, num_steps): for s in range(num_tokens): max_score = float('-inf') best_token = None for prev_token in range(num_tokens): score = lattice[prev_token, t-1] + transition_matrix[prev_token, s] + scores[s, t] if score > max_score: max_score = score best_token = prev_token lattice[s, t] = max_score backpointers[s, t] = best_token # 回溯最佳路径 path = [np.argmax(lattice[:, -1])] for t in range(num_steps-1, 0, -1): prev_token = backpointers[path[-1], t] path.append(prev_token) path.reverse() return path # 示例用法 scores = np.array([[0.2, 0.5, 0.1, 0.3], [0.1, 0.3, 0.6, 0.2], [0.4, 0.1, 0.3, 0.5]]) transition_matrix = np.array([[0.3, 0.2, 0.1], [0.2, 0.4, 0.3], [0.1, 0.3, 0.4]]) path = lattice_algorithm(scores, transition_matrix) print("Best path:", path) ``` 这个示例实现了一个简单的lattice算法,给定一个分数矩阵和转移矩阵,通过动态规划找到最佳路径。在这个例子中,`scores`是一个形状为`(num_tokens, num_steps)`的矩阵,表示每个标记在每个时间步的分数;`transition_matrix`是一个形状为`(num_tokens, num_tokens)`的矩阵,表示从一个标记转移到另一个标记的转移分数。算法返回最佳路径,即在每个时间步选择的最佳标记序列。 请注意,这只是一个简单示例,实际应用中可能需要根据具体的问题进行适当的修改和优化。希望对你有帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值