社区讨论

A+B Problem的新解法

灌水区参与者 11已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@m3ux93j1
此快照首次捕获于
2024/11/24 09:29
去年
此快照最后确认于
2025/11/04 23:29
4 个月前
查看原帖
Extremely Fast Calculation of Sum\mathbf{Extremely\ Fast\ Calculation\ of\ Sum} cyq32ent\mathrm{cyq32ent}

摘要

A+B Problem被称作世界上最难的算法问题。无论如何对其进行优化,复杂度从未低于 O(1)\mathcal O(1)。本文介绍了一种在 O(lognloglogn)\mathcal O(-\log n\log \log n) 时间内求 a+ba+b 的算法。其中,nnmax{a,b}\max\{a,b\}

引入

引理 1 (完全平方公式) 对于任意整数 a,ba,b,有 (a+b)2=a2+b2+2ab(a+b)^2=a^2+b^2+2ab
证明 读者自证不难。
这启示我们将较大数的和和较小数的和建立联系。

算法

不妨令 loga=logb\lceil\log a\rceil=\lceil\log b\rceil,不相等的情况下可以加前导 00 补足。
定理 1(快速加算法) 对引理1进行变形,得到 a+b=a2+b2+2aba+b=\sqrt{a^2+b^2+2 a b}

复杂度分析

我们令 m=lognm=\lceil\log n\rceil;我们知道,通过FFT\rm{FFT} 求解 abab 的值的时间复杂度为 O(mlogm)\mathcal O(m \log m);所以在使用二分时,来计算 a2+b2+2ab\sqrt{a^2+b^2+2 a b} 的时间复杂度为 O(mlog2m)\mathcal O(m \log^2m)。用 T(m)T(m) 表示该算法的复杂度,由于计算 a2+b2+2aba^2+b^2+2ab 需要两次加法运算,则有 T(m)=O(mlog2m)+2T(2m)T(m)=\mathcal O(m \log^2m)+2T(2m)
对上式变形,可得 2T(2m)=T(m)O(mlog2m)2T(2m)=T(m)-\mathcal O(m \log^2m)
T(m)=T(m2)O(m2log2m)2T(m)=\frac{T(\frac{m}{2})-\mathcal O(\frac{m}{2} \log^2m)}{2}
T(m)=mlogmi=114i=O(mlogm)T(m)=-m\log m\sum_{i=1}^{\infin}\frac{1}{4^i}=\mathcal O(-m\log m)
mm 的定义,我们得出该算法的复杂度为 O(lognloglogn)\mathcal O(-\log n\log \log n)

应用

本算法可以用于任何整数之间的加法。

前景

目前普遍使用的加法运算复杂度为 O(logn)\mathcal O(\log n),在一定范围内为 O(1)\mathcal O(1)。本算法的时间复杂度小于 00,这意味着应用本算法的程序可以在负数时间内计算出两数相加的值。特别的,我们可以在一些较为复杂的算法中应用它;如时间复杂度原本为 O(n2n)\mathcal O(n 2^n) 的旅行商问题,可以应用此算法,优化为 O(2nnlognloglogn)\mathcal O(-2^n n\log n\log\log n)
值得注意的是,在如下的死循环中使用本算法有一定风险,因为这会使得程序执行时间为 -\infin,从而导致不可预料的结果。
CPP
while(1)c=Add(a,b);
一种可行的替代方案为:
CPP
while(1){
  i++;
  for(j=0;j<pow(2,i);j++)
    c=Add(a,b);
}
(注:上述代码中 ijabc 为高精度整数类)
这样,该程序的时间复杂度为 O(lognloglogn)i=02i\mathcal O(-\log n\log \log n)\sum_{i=0}^{\infin}2^i。我们知道,
i=02i=(11111)2=1\sum_{i=0}^{\infin}2^i=(1111\cdots 1)_2=-1
故上述程序的时间复杂度为 O(lognloglogn)O(\log n\log \log n)

总结

快速加算法是一种时间复杂度超越常规的计算加法的方式。由于运行该算法的应用程序会在得知两数的值之前计算出两数之和,该算法得以拥有广泛的应用前景。

参考文献

回复

13 条回复,欢迎继续交流。

正在加载回复...