Skip to content

ntt不平衡乘法策略失效 #42

@HJimmyK

Description

@HJimmyK

在3ntt-crt的不平衡处理策略中,参数 M 本意是一个阈值,作为处理不平衡分块的一个参考值,其尽可能接近 $\sqrt{\frac{len1}{len2}}$ 时,达到理论最优。
原因如下:(假定乘数的二进制长度分别为m,n ,且认为m >> n,假定 $m≈l\cdot n$
不分块直接ntt乘法的复杂度: $O((m+n)\text{log}(m+n))$
分块块数假如为 t:

$$ O(t \cdot (\frac{m}{t}+n)) \text{log}(\frac{m}{t}+n) $$

$$t=\sqrt{l}$$ 时,其可以取至最低值。
同时分块还可以复用短乘数的变换结果,而不用重复计算。

原实现中的:lamp_ui min_sum = len2 + std::max(len2, M);实际并未起到作用,因为M为sqrt(len1/len2),导致实际上min_sum=len2+len2,分块策略并未奏效。改为:lamp_ui min_sum = len2 + std::max(1ull, M) * len2;即可。

可以发现在大部分数据上,蓝色(原错误实现)耗时更长,

Image

且原实现存在明显漏洞:即某些更长的数据计算反而更快,这都是不正确分块策略导致的结果。尽管此错误并不影响计算的正确性。

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestrefactorcompletely change the implementation method

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions