乘法


10

我一直在寻找在这里,我注意到两个乘法的最佳运行 -Bits数是Ø (ñ ⋅ 登录ň ⋅ 2 Ø (日志* ñ ),但我可以很容易发现的算法,在运行Ø (ñ ⋅ 登录n )。ñØ(ñ⋅日志⁡ñ⋅2Ø(日志∗⁡ñ)Ø(ñ⋅日志⁡ñ)

毕竟,我们知道如何在O (n log n )运行时中将两个多项式相乘。但是多项式相乘与两个n位数字相乘相同。因此,我们有一种算法将O (n log n )中的两个n位数字相乘。现在可能发生的唯一问题是进位,但是在每个阶段中,我们都可以在O (n )时间内解决此问题,只需移动最右边的位及其左邻居,直到结束。也就是说,我们的运行时间应保持Ø (ñ ⋅ 日志ññØ(ñ日志⁡ñ)ññØ(ñ日志⁡ñ)Ø(ñ)。Ø(ñ⋅日志⁡ñ)

那我做了一个新的(而且很明显)的发现吗?还是维基百科页面过时了?也许我有一些错误?


“我们知道”“ 在O (n log n )运行时从阶乘两个多项式”的方式是什么?ñO(nlog⁡n)

Answers:


8

正如@DavidRicherby指出的那样,由于不同的复杂性度量混杂在一起而引起混乱。但是,让我详细说明一下。

通常,在研究用于任意环上的多项式乘法的算法时,人们会对算法使用的环中的算术运算数量感兴趣。特别地,给定一些(可交换的,整体的)环,和两个多项式˚F ,克∈ [R [ X ]小于度的Ñ,所述Schönhage-Strassen的算法需要ø (Ñ 登录Ñ登录日志Ñ)的乘法和加法的ř为了计算˚F 克∈ [R [ X ][RF,G∈[R[X]ñØ(ñ日志⁡ñ日志⁡日志⁡ñ)[RFG∈[R[X]由大致邻接统一的第原始根到ř得到一些较大的环d ⊃ - [R ,然后,使用快速傅立叶变换过d,计算在产物d。ñ[Rd⊃[Rdd

如果你的戒指包含统一个根,那么这可以加速到Ø (ñ 登录ñ )在操作[R通过直接快速傅立叶变换过[R 。更具体地讲,在ž ⊂ Ç,你可以做到这一点使用Ø (ñ 日志ñ )环操作(忽略了一个事实,这将需要在复数精确的算法)。ñØ(ñ日志⁡ñ)[R[Rž⊂CO(nlog⁡n)

可以考虑的另一种措施是操作的位复杂度。这就是我们将两个长度为整数相乘的兴趣所在。在这里,原始运算是将两个数字相乘并加起来(带有进位)。因此,在将两个多项式乘以Z时,实际上需要考虑以下事实:在计算过程中出现的数字不能使用恒定数量的基本运算来相乘。这以及Z在n > 2时没有第n个本元统一根这一事实阻止了您应用O (n log n )nZZnn>2O(nlog⁡n)算法。你通过考虑克服这个与来自环系数Ž / ⟨ 2 Ñ + 1 ⟩,由于产品多项式的系数将不超过此约束。存在(当Ñ是二的幂)时,有(同余类的)2作为Ñ统一的第根,以及通过递归调用对于系数乘法算法,可以实现共ø (Ñ 登录Ñ log log n )原始(即位)操作。然后,这继续进行整数乘法。f,gž/⟨2ñ+1个⟩ñ2ñØ(ñ日志⁡ñ日志⁡日志⁡ñ)

例如,一个很好地强调了环运算和原始运算之间差异的重要性的示例,请考虑两种用于评估多项式的​​方法:霍纳法和Estrin法。Horner的方法计算一个多项式在一些X ∈ Ž通过利用身份 ˚F (X )= (... (˚F Ñ X + ˚F ñ - 1)X + ... + ... )+F=∑一世=0ñF一世X一世X∈ž 而Estrin方法将 f分为两部分 H = n / 2 ∑ i = 1 f n / 2 + i X i和 L = n / 2 ∑ i = 0 f i X i, 即 H包含度项 > ñ / 2和大号度的条款 ≤ ñ / 2(假设 ñ

F(X)=(…(FñX+Fñ-1个)X+…+…)+F0
F
H=∑一世=1个ñ/2Fñ/2+一世X一世
大号=∑一世=0ñ/2F一世X一世
H>ñ/2大号≤ñ/2ñ 为简单起见,是2的幂)。

F(X)

F(X)=H(X)Xñ/2+大号(X)

ññ+日志⁡ñ

ñ/2ñ/2Ω(ñ2)ñØ(ñ)Ø(ñ日志C⁡ñ)=Ø〜(ñ)C>0


9

ñØ(ñ日志⁡ñ)ñØ(2日志∗⁡ññ日志⁡ñ)ñØ(ñ日志⁡ñ)


5
我认为这不是问题。如果我们将数字视为“ x”为基数的多项式,例如2,那么通常我们可以在恒定时间内乘以零度多项式(小于基数的数)。我想这个问题是O(n * log n)算法使用FFT,而FFT算法内部可能会出现渐近更大的数字。
— jkff 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.