Math 变长s的有效乘法[概念]
编辑 所以我似乎“低估了”不同长度数字的含义。我甚至没有想到操作数有100位数长的情况。在这种情况下,我提出的算法肯定是无效的。我可能需要一个实现,它的复杂性取决于每个操作数中数字的多少,而不是它的数值,对吗 正如下面所建议的,我将研究Karatsuba算法Math 变长s的有效乘法[概念],math,language-agnostic,recursion,complexity-theory,Math,Language Agnostic,Recursion,Complexity Theory,编辑 所以我似乎“低估了”不同长度数字的含义。我甚至没有想到操作数有100位数长的情况。在这种情况下,我提出的算法肯定是无效的。我可能需要一个实现,它的复杂性取决于每个操作数中数字的多少,而不是它的数值,对吗 正如下面所建议的,我将研究Karatsuba算法 编写一个算法的伪代码,该算法接受两个任意长度的数字(作为字符串提供),并计算这些数字的乘积。使用有效的程序将任意长度的大数相乘。分析算法的效率 我决定采取(半)简单的方法,使用俄罗斯农民算法。它的工作原理如下: a * b = a/2 *
编写一个算法的伪代码,该算法接受两个任意长度的数字(作为字符串提供),并计算这些数字的乘积。使用有效的程序将任意长度的大数相乘。分析算法的效率 我决定采取(半)简单的方法,使用俄罗斯农民算法。它的工作原理如下:
a * b = a/2 * 2b if a is even
a * b = (a-1)/2 * 2b + a if a is odd
我的伪代码是:
rpa(x, y){
if x is 1
return y
if x is even
return rpa(x/2, 2y)
if x is odd
return rpa((x-1)/2, 2y) + y
}
我有3个问题:
- a=#递归中的子问题=1(所有状态中最多1个递归调用)
- n/b=每个子问题的大小=n/1->b=1(问题大小不变…?)
- f(n^d)=在递归调用=1->d=0之外完成的功(a为奇数时的加法)
- a=1,b^d=1,a=b^d->复杂性在n^d*log(n)=log(n)
- 这在逻辑上是合理的,因为我们在每一步都将问题减半,对吗
检查一下,(ps不要复制它,这不是你老师想要的)是这个规范中最快的一个。他想给你数字作为字符串,因为你使用的任何语言的内置数据类型都被限制在某个最大大小。如果他想让你将1983475234586235587623586235875932485乘以2345988762359876235987236459823465998234659982346599823465998234659834,字符串是表示这些数字的好方法。我猜你目前的算法无法处理这些输入……你的教授的意思是数字可能太大,无法放入机器字中,因此它们必须以任意长度的ASCII字符串(大概是10进制)提供。例如,“1234567898765432111122223344445”。所以你的算法恐怕是不完整的。但是你也可以在字符串上使用俄罗斯农民算法——你只需要做更多的工作:-/哦,我明白了。有道理——感谢你澄清了这一点。肯定要重新考虑这一点……他想把数字作为字符串给你,因为你使用的任何语言的内置数据类型都被限制在某个最大大小。如果他想让你将1983475234586235587623586235875932485乘以2345988762359876235987236459823465998234659982346599823465998234659834,字符串是表示这些数字的好方法。我猜你目前的算法无法处理这些输入……你的教授的意思是数字可能太大,无法放入机器字中,因此它们必须以任意长度的ASCII字符串(大概是10进制)提供。例如,“1234567898765432111122223344445”。所以你的算法恐怕是不完整的。但是你也可以在字符串上使用俄罗斯农民算法——你只需要做更多的工作:-/哦,我明白了。有道理——谢谢你澄清这一点。肯定要重新考虑这一点……谢谢!我将重新思考使用哪种操作的问题,并看看Karatsuba…实际上,如果你能理解Karatsuba,你可以根据要求再次证明它的复杂性,你也可以使用它。Karatsuba的巨大资源,