CRT一般是在已知
x≡a1(modp1)
x≡a2(modp2)
⋮
x≡am(modpm)
时用于求
x≡a(mod∏pi)
的解的方法。但是,如果已知的条件并非一一对应的(ai,pi),而是经过了shuffle的呢?
Noisy CRT就是为了解决此种情况而提出的(一次shuffle就可以看作一次noise的掺入不是吗),这一点是基于一个观察:
我们在正常的CRT求解时,其实很像是在每个Zmod(Ni)里找了一个basis,最终用这些basis去线性表示我们最终的解。具体地来说,是这么一回事:
先取 Ti 符合
Ti≡1Ti≡0(modpi)(modpj=i)
那么对于一个 x≡ai(modpi) 的系統,可以得出解为 x≡∑aiTi(mod∏pi) 。
默认情况下我们是用直接的CRT求T的,但是在noisy CRT情况下,因为经过了shuffle,所以我们需要再把Ti摊开一下:
x≡∑i=1∑j=1δi,jri,jai(mod∏pi)
其中ri,j是正常CRT下我们求出的T,δ在r和a对应时取1,不对应时取0。这时我们构造格
∏pir1,1a1r1,2a1⋮rm,man0B0⋮0…0B⋱………⋱⋱000⋮0B
那么(x,δ)就在这个格子里,适当选取B优化我们的格子就很有可能规约出我们想要的x。
有线性组合的地方就有格!
以上的情况实际上是shuffle了以下CRT矩阵的列(并且是nx1大小的矩阵):
N1modp1N1modp2⋮N1modpnN2modp1N2modp2⋯⋯⋯Nmmodp1Nmmodpn
这种情况有一个很麻烦的地方——在摊平CRT矩阵时,每一行具体要乘上的ri是不确定的。
一般情况下我们遇见的noisy CRT是对以上CRT矩阵的行进行shuffle,这样每一行需要乘上的是确定的,那么摊平后LLL就变得更容易了。
不管怎么说,最终需要的格子都很大,所以规约的时候一般都需要flatter去加速。