免责声明:家庭作业问题。我正在寻找暗示......
F. Lake教授告诉他的班级,对n位整数进行平方而不是乘以两个n位整数是渐进式的。他们应该相信他吗?
我相信通过shift / add将两个n位整数相乘是一个O(n)运算,但我不明白为什么对n位int进行平方会有所不同。我错过了什么吗?
答案 0 :(得分:15)
由于您只需要一个提示,因此答案来自以下等式:(a + b)^2 = a^2 + b^2 + 2*a*b
为了不破坏这个难题,我发布了完整的解决方案separately:)
答案 1 :(得分:7)
想象一下,平方实际上渐近更快。然后,如果你有* b,你可以计算:
a = m + n b = m - n
然后求解这个方程系统给出:
m = (a+b)/2 n = (a-b)/2
但是我们有
a * b = (m+n)*(m-n) = m² - n²
或没有中间变量:
a * b = ((a+b)² - (a-b)²)/4
所以你可以用两个平方运算代替任何乘法(和一些加法和除以4,这只是一个移位,并且这些都可以忽略渐近复杂度)。因此,乘法的复杂性至多是平方复杂度的两倍。当然,“两次”是一个常数因子,这意味着它们具有相同的渐近复杂度。
答案 2 :(得分:1)
这是a hint。
这是我在SECRET CODE中的解决方案:Fdhnevat zrnaf lbh bayl unir gb qb bar vavgvny SG,abg gjb,fb vg'f snfgre。
答案 3 :(得分:0)
考虑计算机为完成这些任务需要采取的步骤。请记住,计算机与人的工作方式截然不同。
答案 4 :(得分:0)
我的想法是,要将两个n位整数相乘,您的算法需要满足任意两个n位整数。这是(2^n)^2
可能的输入。
平方算法只需要处理2^n
个可能的输入,尽管可以将其建模为具有两个相同输入的乘法算法。
我的猜测是当你知道两个输入都是相同的时候会有一些优化通用乘法算法的方法,但我不得不考虑它。无论如何,这就是我要调查的路线......
答案 5 :(得分:0)
重写:这是我在将n位数乘以两个n位数时对其进行平方的唯一改进。在计算机科学中常用的O(n ^ 2)与O(n)种方式中,它可能不是渐近更好的。但是,如果我们渐渐地逐渐意味着接近的复杂性(包括乘法常数),那么这将符合该定义。无论如何,我所能看到的就是接受或离开它。
假设我们有两个N位数字x
和y
。我们可以将它们(x*y
)与带有A * N ^ 2 + O(N)运算的shift-and-add方法相乘(其中A是常数)。第二项,即O(N)项,可以忽略足够大的N,因此操作次数基本上是A * N ^ 2.
现在我们计算x^2
。如果我们将a
定义为仅将x
设置为b
,而x
只设置x = a + b
x^2 = (a + b)^2 = a^2 + b^2 + 2*a*b
的较低N / 2位,那么
x^2 = (a + b)^2
但是,请记住,我们可以将N位数与A * N ^ 2运算相乘。要乘以a * a,我们只需做A *(N / 2)^ 2 = A * N / 4次运算。 b * b和a * b也是如此。如果我们忽略O(N)操作,那么A*N^2/4 + A*N^2/4 + A*N^2/4 = (3/4)*A*N^2
将在
a^2
当然,比两个任意N位数乘以A * N ^ 2/4的标准A * N ^ 2更好的操作。我们可以通过使用b^2
和{{1}}重复相同的操作来进一步改进。在某些时候,继续这样做是没有益处的。这不是一个巨大的进步,但这是我能找到的全部。你可以自己决定这是否重要。